Redis中通过SLAVEOF命令,让一个服务器去复制另一个服务器。
旧版复制功能
同步:从服务器通过向主服务器发送SYNC命令来实现同步操作
- 从服务器向主服务器发送SYNC命令
- 收到SYNC命令后主服务器执行BGSAVE,后台生成一个RDB文件,并用一个缓冲区记录现在开始执行的写命令
- 主服务器将RDB文件发送给从服务器,从服务器载入RDB文件同步数据库状态
-
主服务器将记录在缓冲区里的写记录发送给从服务器,从服务器执行相应命令同步数据库状态
image.png
命令传播:同步更新完成后,主服务器会将造成主从服务器不一致的命令发送给从服务器执行,使得主从服务器状态再次一致
旧版本缺陷
在命令传播期间,如果主从服务器之间断开连接,而主服务器依然在执行写命令,那么当主从服务器重新连接的时候,会出现主从状态不一致的情况,旧版的复制功能是通过从服务器再次发送SYNC,对主服务器的RDB文件进行全量复制来实现的,效率太低(因为只需要复制断开连接期间主服务器执行的那些写命令就可以了)
新版复制功能
Redis2.8开始使用PSYNC命令代替SYNC命令来执行复制时的同步操作
PSYNC具有完整重同步和部分重同步两种模式,分别用于处理初次复制和断线后复制的情况

部分重同步的实现
部分重同步的功能主要通过以下三个部分构成:
- 主服务器的复制偏移量和从服务器的复制偏移量
- 主服务器的复制积压缓冲区:
- 服务器的运行ID(用于从服务器判断需要同步的数据是不是来自之前的主服务器ID)
主服务器进行命令传播的同时会将写命令入队到复制积压缓冲区里面,并且会记录每个字节相应的偏移量,断线重连后从服务器会通过PSYNC将自己的复制偏移量offset发送给主服务器,主服务器根据这个offset决定执行何种同步操作: - 如果offset之后的数据仍然存在于复制缓冲区里面,则执行部分重同步操作
- 否则,执行完整全同步操作
复制的实现
- 设置主服务器的地址和端口
- 建立套接字连接
- 发送PING命令
- 身份验证
- 发送端口信息
- 同步
- 命令传播
心跳监测
命令传播阶段,从服务器默认以每秒一次的频率,向主服务器发送命令:
REPLCONF ACK <replication_offset>,其中replication_offset是从服务器当前的复制偏移量。
主要有如下3个作用:
- 检测主从服务器的网络连接状态
- 辅助实现min-slaves选项
- 检测命令丢失

网友评论