2.8主从分为同步sync和命令传播两个操作
1.sync为初始化
2 命令传播为主从同步
2.8主备同步sync原理:
1.从服务器向主服务器发送SYNC命令
2.主服务器执行BGSAVE命令,生成RDB文件,并使用一个缓冲区记录从bgsave开始的所有写命令
3.主服务器BGSAVE执行完后,讲RDB发送给从服务器,从服务器载入RDB文件,将自己的状态更新至主服务器的BGSAVE时的状态
4.主服务器将缓冲区的写命令发送给从服务器,从服务器执行写命令,讲从服务器更新为主服务器的当前态
2.8及以前,主从断开连接需要重新sync初始化
2.8以后,支持部分重同步(psync)
1.主从断开后,从库发送psync命令
2.向从库返回+continue命令,表示执行部分重同步
3.接受+continue命令,准备执行部分重同步
4.想从服务器发送自断开连接以来的写入命令
5.从库执行写入命令
复制积压缓冲区:
1 复制缓冲区是主服务器固定长度(默认1mb)先进先出队列
2 主库将写入操作放在复制缓冲区,从库断开后,发送从库的偏移量给主库,主库在复制缓冲区中找是否有这个偏移量,有就发送continue继续从这个偏移量写,没有就重新初始化。
redis server ID
serverID自动生成,建立主备关系时报错serverID,重连时校验
复制实现的详细步骤:
1.设置主服务器的地址和端口
2.建立套接字连接
3.从向主发送ping命令
4.auth身份验证
5.replconf端口信息
6.psync初始化
7.psync同步
心跳检测
从服务器每秒向主库发送 replconf ack <复制偏移量>。如果主库因为某种原因发送偏移量到备库失败,备库可以主动发送偏移量到主库,主库可以根据这个偏移量再次发送同步。(2.8以后才支持,2.8以前没有这个动作replconf ack)
参考:
《redis设计与实现》