Redis支持主从复制功能,可以通过执行slaveof(Redis5以后改成replicaof)或者在配置文件中设置slaveof(Redis5以后改成replicaof)来开启复制功能。

(一主一从)

(一主多从)

(传递复制)
主Redis配置:无需特殊配置
从Redis配置:修改从服务器上的redis.conf 文件:
- # slaveof <masterip> <masterport>
- # 表示当前【从服务器】对应的【主服务器】的IP是192.168.10.135,端口是6379。
- replicaof 127.0.0.1 6379
读写分离
数据容灾
保存主节点信息
当客户端向从服务器发送slaveof(replicaof) 主机地址(127.0.0.1) 端口(6379)时:从服务器将主机ip(127.0.0.1)和端口(6379)保存到redisServer的masterhost和masterport中。
- Struct redisServer{
- char *masterhost;//主服务器ip
- int masterport;//主服务器端口
- } ;
从服务器将向发送SLAVEOF命令的客户端返回OK,表示复制指令已经被接收,而实际上复制工作是在OK返回之后进行。
建立socket连接

主服务器accept从服务器Socket连接后,创建相应的客户端状态。相当于从服务器是主服务器的Client端。

发送ping命令
Slaver向Master发送ping命令
Master的响应:

权限验证

发送端口信息
在身份验证步骤之后,从服务器将执行命令REPLCONF listening-port ,向主服务器发送从服务器的监听端口号。

同步数据:Redis 2.8之后分为全量同步和增量同步
命令传播:
当同步数据完成后,主从服务器就会进入命令传播阶段,主服务器只要将自己执行的写命令发送给从服务器,而从服务器只要一直执行并接收主服务器发来的写命令。
旧版本:Redis 2.8以前
实现方式:Redis的同步功能分为同步(sync)和命令传播(command propagate)。
1)同步操作:

2)命令传播操作:
同步操作完成后,主服务器执行写命令,该命令发送给从服务器并执行,使主从保存一致。
缺陷
新版:Redis 2.8以后
实现方式:在Redis 2.8之后使用PSYNC命令,具备完整重同步和部分重同步模式。

全量同步:
Redis 的全量同步过程主要分三个阶段:

增量同步:
在命令传播阶段,从服务器默认会以每秒一次的频率向主服务器发送命令:
- replconf ack
-
- #ack :应答
- #replication_offset:从服务器当前的复制偏移量
主要作用有三个:
(1)检测主从服务器的网络连接状态
(2)通过向主服务器发送INFO replication命令,可以列出从服务器列表,可以看出从最后一次向主发送命令距离现在过了多少秒。lag的值应该在0或1之间跳动,如果超过1则说明主从之间的连接有故障。
- Redis可以通过配置防止主服务器在不安全的情况下执行写命令
min-slaves-to-write 3 (min-replicas-to-write 3 ) min-slaves-max-lag 10 (min-replicas-max-lag 10)- 上面的配置表示:从服务器的数量少于3个,或者三个从服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令。这里的延迟值就是上面INFOreplication命令的lag值。
如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里面找到从服务器缺少的数据,并将这些数据重新发送给从服务器。(补发) 网络不断
增量同步:网断了,再次连接时