1.同步机制
redis可以通过命令slaveof 120.0.0.2(主master)成为一个Redis的从服务
旧版本分为(2.8之前):
1 同步(sync)
过程如下
2 命令传播 (command propagate)
当主DB有修改时,主服务器会以命令传播的形式到从服务器,达到主从同步
缺点:
想象一下这种场景,如果从服务是未通不过的,走上面的整个流程是没有什么问题的。
但是如果是已经同步过的掉线的。再次连上后从服务器期望的是同步掉线时间这段时间的
修改,但是走上述流程这种情况下为了弥补一小部分缺失的数据,却要让主从服务器
重新执行一次SYNC命令,是非常低效的
2.8版本之后:
针对上述问题新版办用psync代替了sync命令来执行复制时的同步操作
PSYNC 分为
完整重同步(full resynchronization) 用在第一次和上述rsync类似
部分重同步(partial resynchronization)用在断线后重新连接的情况。
断线后重新连接的时候,主服务器将断开期间执行的写命令同步给从服务器
从服务器接受这些命令,更新至主服务所在的状态
2.部分重同步的实现
主服务器的复制偏移量和从服务器的复制偏移量主服务器的复制积压缓存区 (一个固定长度的FIFO(先进先出)的队列,默认是1M)服务器的运行ID
简要来说;
主从服务器双方维护各自的偏移量。主向从发送N个字节的时候,将偏移量加上N
主从一致的情况下双方的偏移量是相同的,如果不一致说明未处于一致性状态。
主服务器发送命令的时候会同时写入缓存区并记录偏移量,
如果断线后恢复,从服务器发送psync命令以及发送偏移量
主服务器检查偏移量是否在缓存区中,如果在的话执行psync部分同步操作,发送偏移量后的数据给从服务器,达到一致状态
如果不在缓存区中则执行完全同步操作
服务器ID的作用是标识是否是通一主服务器
当从服务器连上主服务器的时候,主服务器向从服务器发送SERVERID并保存的ID
断线后重新连接会做验证如果连接的主服务器ID和从服务器保存的一样则认为是同一个 执行部分同步
否则执行完整同步
复制的实现包括
设置主服务器的地址和端口建立套接字连接发送ping命令身份验证发送端口信息同步命令传播在命令传播阶段,从服务器默认1S的速率向主服务器发送命令:
replconf ack <offset>
主要 用于1.检测网络状态 2辅助实现min-slave选项 3检测命令丢失
参考资料《Redis设计与实现》