Redis主从复制及其心跳检测实现机制

Redis主从复制及其心跳检测实现机制

    • 1、Redis主从工作模式简述
    • 2、同步
      • 2.1老版本的Redis(2.8之前)
      • 2.2 新版本的Redis(2.8之后)
    • 3、命令传播
    • 4、新版本主从节点同步示例
    • 5、心跳检测
      • 5.1 检测主从服务器的网络连接状态
      • 5.2 辅助实现min-slave选项
      • 5.3 检测命令是否丢失

1、Redis主从工作模式简述

假设Redis中有一个主节点和一个从节点。正常情况下,主节点中进行数据增删改操作,从节点中也会将主节点中的指令执行一遍,实现主从节点的数据同步。而数据同步的关键在于主从节点的两个操作:同步命令传播

2、同步

Redis的同步操作指的是从节点通过向主节点发送某个同步指令,从而得到主节点最新的数据,使得从节点数据和主节点保持一致。
而不同版本的Redis同步指令不同,同步的方式也不一样。

2.1老版本的Redis(2.8之前)

从节点向主节点发送SYNC指令实现同步。主节点收到从节点的SYNC指令后,执行BGSAVE(全量持久化)生成RDB文件发送给从节点,从节点执行RDB文件将数据同步。这种方式的同步效率非常低。
Redis主从复制及其心跳检测实现机制_第1张图片

2.2 新版本的Redis(2.8之后)

从节点向主节点发送PSYNC指令实现同步。PSYNC指令有两种同步模式,完整重同步模式(full resynchronization)和部分重同步模式 (partial resynchronization)。其中完整重同步模式和旧版Redis的SYNC指令相同,而部分重同步模式通过比较主从节点的数据偏移量来确定从节点需要同步哪些命令,并将命令写入缓存区,发送给从节点执行,实现数据的部分同步(一般用于从节点的宕机重启后与主节点的数据同步)
Redis主从复制及其心跳检测实现机制_第2张图片
Redis主从复制及其心跳检测实现机制_第3张图片

3、命令传播

主从服务器中Redis数据库的数据不是永远保持一致的,每当主节点执行了新的指令,就会导致从节点和主节点相比少执行了一条指令,这时需要通过某种方式将这条新的指令在从节点上也执行一次,这种方式叫做命令传播
Redis主从复制及其心跳检测实现机制_第4张图片
Redis主从复制及其心跳检测实现机制_第5张图片

4、新版本主从节点同步示例

Redis主从复制及其心跳检测实现机制_第6张图片

5、心跳检测

心跳检测发生在命令传播阶段,从节点默认每秒发送一次心跳检测命令 REPLCONF ACK <偏移量> 获取主节点心跳。
发送该命令主要为了:检测主从服务器的网络连接状态、辅助实现min-slave选项、检测命令是否丢失。

5.1 检测主从服务器的网络连接状态

如果主服务器超过1秒没有收到从服务器发来的心跳检测命令,说明从服务器不能正常和主服务器连接,主服务器开始统计从服务器过了多少秒没有发送命令。

5.2 辅助实现min-slave选项

主服务器的Redis配置中有min-slaves-to-write和min-slaves-max-lag两个配置项,分别表示可正常连接的从服务器允许的最少数量和从服务器延迟最大值(秒),一旦实际情况不符合这两个配置的值时,主服务器拒绝执行写命令。

5.3 检测命令是否丢失

主服务器向从服务器命令传播时,可能会由于网络原因导致命令丢失,下一次收到从服务器的心跳检测命令 REPLCONF ACK <偏移量> 时,可通过偏移量判断出上一条指令是否丢失。如果丢失,主服务器可从复制积压缓冲区找出丢失的指令,重新命令传播。
ps:2.8版本以前无法检测命令是否丢失,因此存在主从数据不一致的风险。

参考资料:《Redis设计与实现第二版》

你可能感兴趣的:(Redis)