redis之主从复制

一、redis主从同步

原理:
1. 从服务器向主服务器发送 SYNC 命令。
2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令。
3. 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件。
4. 主服务器将缓冲区储存的所有写命令发送给从服务器执行。


-------------
1、在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
2、同步开始之后,通过主库命令传播的方式,主动的复制方式实现
3、2.8以后实现PSYNC的机制,实现断线重连

1、环境准备

主库:6380的redis(master)
从库1:6381的redis(slave)
从库2:6382的redis(slave)

主库redis.conf配置

port 6380     # 端口
daemonize yes   # 在后台运行
pidfile /data/6380/redis.pid   # 进程id
loglevel notice
logfile "/data/6380/redis.log"   # 日志文件,需自己创建
dbfilename dump.rdb      # 持久化存储
dir /data/6380                
protected-mode no

从库1redis.conf配置

port 6381      
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
slaveof   192.168.61.129  6380   # 指定主库的ip和端口

从库2redis.conf配置

port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
slaveof   192.168.61.129  6380

注意:

如果主库中设置了密码,那么我们在从库的配置文件中就需要添加主库的密码

masterauth root   # 指定主库的密码

2、启动redis服务端

redis-server /data/6380/redis.conf 
redis-server /data/6381/redis.conf 
redis-server /data/6382/redis.conf 

3、登录数据库查看主从关系

主库【6380】:

[root@szx /data/6380 21:46:33]#redis-cli -p 6380 -h 192.168.61.129
192.168.61.129:6380> info  replication
# Replication
role:master
connected_slaves:2    # 有两个从库连接
slave0:ip=192.168.61.129,port=6381,state=online,offset=2100,lag=0
slave1:ip=192.168.61.129,port=6382,state=online,offset=2100,lag=0
master_replid:a70b4cc777e7f27efef1d2463f4d78d556a0162b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2100
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2100

从库1【6381】:

[root@szx /data/6381 21:50:27]#redis-cli -p 6381 -h 192.168.61.129
192.168.61.129:6381> info  replication
# Replication
role:slave    # 从库
master_host:192.168.61.129  # 主库ip
master_port:6380      # 主库端口
master_link_status:up    # 连接主库正常
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:2226
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a70b4cc777e7f27efef1d2463f4d78d556a0162b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2226
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2226

从库2【6382】:

[root@szx /data/6382 21:50:27]#redis-cli -p 6382 -h 192.168.61.129
127.0.0.1:6382> info replication
# Replication
role:slave
master_host:192.168.61.129
master_port:6380
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:2366
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a70b4cc777e7f27efef1d2463f4d78d556a0162b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2366
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:43
repl_backlog_histlen:2324

4、查看主从复制效果

主库写入数据

192.168.61.129:6380> SET name "alex"
OK
192.168.61.129:6380> mset name "wusir" age 88 
OK

从库1查看key

192.168.61.129:6381> get name 
"alex"
192.168.61.129:6381> mget name age 
1) "wusir"
2) "88"

从库2查看key

127.0.0.1:6382> get name 
"alex"
127.0.0.1:6382> mget name age 
1) "wusir"
2) "88"

二、主从复制故障恢复

从库挂了无所谓
主库挂了得立即恢复主库,或者将从库切换为主库,继续工作

    -.实验步骤
    1.分别启动 6380  6381 6382 三个数据库实例,建立好主从关系
    
    2.杀死6380主库,此时6381 6382 群龙无首
    
    3.选择让6381为新的主库,就要去除6381的从的身份
    redis-cli -p 6381 slaveof  no one 
    #查看此时6381的身份
    redis-cli -p 6381 info replication

    4.此时将6382的主人改为6381
    redis-cli -p 6382 slaveof 192.168.61.129 6381

这种故障恢复只是临时生效,重启服务器后就不生效了

posted @ 2019-07-08 20:57  叫我大表哥  阅读(244)  评论(0编辑  收藏  举报