Redis从2.8版本开始,使用PSYNC代替SYNC命令来执行复制时的同步操作,PSYNC有完整重同步与部分重同步两种模式:

  • 完整同步模式用于处理初次复制情况:通过让主服务器创建并发送RDB文件,及向从服务器发送保存在缓冲区里面的写命令来进行同步(也叫命令传播)。
  • 部分重同步用于处理断线后重复制情况:主服务器从主从服务器连接断开期间执行的写命令发送给从服务器,让从服务器可以更新至主服务器当前所处的状态。

其中,部分重同步功能由下面三部分构成:

  • 主从服务器的复制偏移量。通过复制偏移量可以知道主从服务器是否处于一致状态。
  • 主服务器的复制积压缓冲区。主服务器在进行命令传播时会将命令写入复制积压缓冲区,且缓冲区里的命令都有对应的复制偏移量。当主从重连上时会根据偏移量比对来确定重传的位置。
  • 主从服务器的运行ID。主从服务器都会有自己的运行ID,在每次同步过程中都会将自己的运行ID发送给对方,以此来判断对方的身份。

最后,再简单列一下复制的实现过程:

  1. 从服务器记录主服务器的地址与端口。从服务器收到客户端的SLAVEOF命令后会先记录主服务器的地址与端口。
  2. 建立连接。
  3. 从服务器向主服务器发送PING命令。如果主服务正常收到命令会响应PONG命令。
  4. 从服务器进行身份验证。
  5. 从服务器发送端口命令。
  6. 同步。
  7. 命令传播。

相关文章:redis主从复制原理

本文参考的有:
黄健宏的《Redis设计与实现》一书


步履不停
38 声望13 粉丝

好走的都是下坡路