redis的复制
旧版复制功能的实现
直接使用SLAVEOF IP:port 实现
- 同步(sync):将slaver状态更新到master状态
- 命令传播(command propagate):当 master 被修改,主从服务器不一致,让从服务器重新回到一致状态。
同步
SLAVEOF 要求slaver复制master, 首先就会执行 同步 操作
- 从服务器向主服务器发送SYNC命令。
- 收到SYNC命令的主服务器执行BGSAVE命令,在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
3.当主服务器的BGSAVE命令执行完后,主服务器会将BGSAVE命令生成的RDB文件发送给从服务器,从服务器接受并载入RDB文件,更新到主服务器执行BGSAVE命令时的数据库状态 - 主服务器将记录在缓冲区里面的所有写命令发送给从服务器,从服务器执行这些命令,将自己的数据库状态更新。
命令传播
当主服务器修改后,数据出现不一致,主服务器将自己执行的命令发送个从服务器执行。
旧版复制的问题
当从服务器断线后,会重新sync,重新生成RDB传入到从模式。消耗大量性能和IO
新版复制功能的实现
为了解决旧版复制功能在处理器断线重复制的低效问题,参与PSYNC命令代替SYNC。
PSYNC
PSYNC具有完整重同步和部分重同步两种模式:
- 完整重同步用于初次复制情况
- 部分重同步用于处理断线后复制情况,将断开期间执行的写命令发送给从服务器。
心跳检测
在命令传播阶段,从服务器默认会以每秒一次的频率,向从服务器发送命令
REPLCONF ACK <replication_offset>
- 检测主从服务器的网络连接状态(ACK请求和回应)
- 辅助实现min-slaves配置选项(配置从服务器的数量和从服务器的延迟)
- 检测命令丢失 (偏移量来实现)