1.redis主从复制原理
主从复制是指将一台redis服务器的数据复制到其他的redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。
2.全量同步与增量同步
2.1全量同步过程
slave发送sync命令到master,master启动一个后台进程,将redis中的数据快照保存到文件中。master将保存数据快照期间接收到的写命令缓存起来。master完成写文件操作后,将该文件发送给slave。slave使用新的RDB或AOF文件替换掉旧的RDB或AOF文件。
2.2增量同步过程
主从服务器在完成第一次同步后,主从节点进入命令传播阶段;在这个阶段主节点将自己执行的写命令发送给从节点,从节点接收命令并执行,从而保证主从节点数据的一致性。如果主从服务器间的网络连接断开了,那么就无法进行命令传播了,这时从服务器的数据就没办法和主服务器保持一致了,客户端就可能从【从服务器】读到旧的数据。
增量同步就是用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效。需要注意的是,如果网络中断时间过长,导致主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制。
3.实现主从同步
3.1环境说明
3.2部署redis
#三台主机同时进行如下操作
[root@redis-master ~]# yum install -y redis
[root@redis-master ~]# systemctl start redis
[root@redis-master ~]# vim /etc/redis/redis.conf
bind 0.0.0.0 #任何地址都可以访问
protected-mode no #关闭安全模式
daemonize no #后台运行
[root@redis-master ~]# systemctl restart redis
[root@redis-master ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master #角色为主
connected_slaves:0
master_failover_state:no-failover
master_replid:617876b567ff15784b8d619ca49796d00fd9a514
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
【三台虚拟机角色都为主】
3.3配置主从同步
#三台主机同时进行如下操作
[root@redis-master ~]# vim /etc/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize no
replicaof 192.168.31.100 6379 #添加此设置本主机为主节点master
#定位master
[root@redis-master ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
role:master #为主
connected_slaves:0 #0个从
master_port:6379
127.0.0.1:6379> slaveof no one #如果执行info replication语句出现了角色为slave,可能是之前设置的节点未清理干净,使用这个语句清除主机点再执行即可
OK
#定位slave1
[root@redis-slave1 ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
role:slave #为从
master_host:192.168.31.100 #100为master
master_port:6379
#定位slave1
[root@redis-slave1 ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
role:slave #为从
master_host:192.168.31.100 #100为master
master_port:6379
#定位master
127.0.0.1:6379> info replication
role:master
connected_slaves:2 #有两个从
slave0:ip=192.168.31.200,port=6379,state=online,offset=70,lag=0 #200和210为两个从
slave1:ip=192.168.31.210,port=6379,state=online,offset=70,lag=0
3.4测试
#定位master,在master上添加键值
[root@redis-master ~]# redis-cli -p 6379
127.0.0.1:6379> set master 192.168.31.100
OK
127.0.0.1:6379> get master
"192.168.31.100"
#定位slave1,查看master键对应的值
[root@redis-slave1 ~]# redis-cli -p 6379
127.0.0.1:6379> get master
"192.168.31.100" #成功获取到master上添加的键值
#定位slave2,查看master键对应的值
[root@redis-slave1 ~]# redis-cli -p 6379
127.0.0.1:6379> get master
"192.168.31.100" #成功获取到master上添加的键值
同步成功!
4.实现主从切换
当一个master宕机后,后面的slave可以立刻升为 master,原slave后的slave不用做任何修改。
#模拟主宕机
[root@redis-master ~]# systemctl stop redis
#定位slave1
[root@redis-slave1 ~]# redis-cli
127.0.0.1:6379> slaveof no one #表示指定没有master,提升slave1为主
OK
127.0.0.1:6379> info replication
role:master #slave为master
connected_slaves:0
127.0.0.1:6379> set cheng 234 #添加键值成功
OK
127.0.0.1:6379> get cheng
"234"
#定位slave2
[root@redis-slave2 ~]# redis-cli
127.0.0.1:6379> slaveof 192.168.31.200 6379 #临时设置slave1为主
OK
127.0.0.1:6379> info replication
role:slave
master_host:192.168.31.200 #200slave2为主
master_port:6379
127.0.0.1:6379> get cheng #获取键值成功
"234"