Redis(设计与实现):40---复制之心跳检测(REPLCONF命令、lag标志、min-slaves-to-write选项、min-slaves-max-lag选项)

REPLCONF命令

  • 在命令传播阶段,从服务器默认会以每秒一次的频率,向主服务器发送命令:
REPLCONF ACK 

//其中replication_offset是从服务器当前的复制偏移量
  • 发送REPLCONF ACK命令对于主从服务器有三个作用:
    • ①检测主从服务器的网络连接状态
    • ②辅助实现min-slaves选项
    • ③检测命令丢失

一、检测主从服务器的网络连接状态(lag标志)

  • 主从服务器可以通过发送和接收REPLCONF ACK命令来检查两者之间的网络连接是否正常:如果主服务器超过一秒钟没有收到从服务器发来的REPLCONF ACK命令,那么主服务器就知道主从服务器之间的连接出现问题了
  • 通过向主服务器发送INFO replication命令,在列出的从服务器列表的lag一栏中,我们可以看到相应从服务器最后一次向主服务器发送REPLCONF ACK命令距离现在过了多少秒:
    • 在一般情况下,lag的值应该在0秒或者1秒之间跳动,如果超过1秒的话,那么说明主从 服务器之间的连接出现了故障。

Redis(设计与实现):40---复制之心跳检测(REPLCONF命令、lag标志、min-slaves-to-write选项、min-slaves-max-lag选项)_第1张图片

二、辅助实现min-slaves配置选项

  • Redis的min-slaves-to-write和min-slaves-max-lag两个选项可以防止主服务器在不安全的情况下执行写命令
  • 举个例子,如果我们向主服务器提供以下设置:

  • 那么在从服务器的数量少于3个,或者三个从服务器的延迟(lag)值都大于或等于10秒时,主服务器将拒绝执行写命令,这里的延迟值就是上面提到的INFO replication命令的lag 值

三、检测命令丢失

  • 如果因为网络故障,主服务器传播给从服务器的写命令在半路丢失,那么当从服务器向主服务器发送REPLCONF ACK命令时,主服务器将发觉从服务器当前的复制偏移量少于自己的复制偏移量,然后主服务器就会根据从服务器提交的复制偏移量,在复制积压缓冲区里 面找到从服务器缺少的数据,并将这些数据重新发送给从服务器

演示案例

  • 举个例子,假设有两个处于一致状态的主从服务器,它们的复制偏移量都是200,如下图所示

  • 如果这时主服务器执行了命令SET key value(协议格式的长度为33字节),将自己的复 制偏移量更新到了233,并尝试向从服务器传播命令SET key value,但这条命令却因为网络 故障而在传播的途中丢失,那么主从服务器之间的复制偏移量就会出现不一致,主服务器的 复制偏移量会被更新为233,而从服务器的复制偏移量仍然为200,如下图所示

  • 在这之后,当从服务器向主服务器发送REPLCONF ACK命令的时候,主服务器会察觉 从服务器的复制偏移量依然为200,而自己的复制偏移量为233,这说明复制积压缓冲区里面 复制偏移量为201至233的数据(也即是命令SET key value)在传播过程中丢失了,于是主服 务器会再次向从服务器传播命令SET key value,从服务器通过接收并执行这个命令可以将自 己更新至主服务器当前所处的状态,如下图所示

  • 注意,主服务器向从服务器补发缺失数据这一操作的原理和部分重同步操作的原理非常相似,这两个操作的区别在于:补发缺失数据操作在主从服务器没有断线的情况下执行,而 部分重同步操作则在主从服务器断线并重连之后执行

Redis(设计与实现):40---复制之心跳检测(REPLCONF命令、lag标志、min-slaves-to-write选项、min-slaves-max-lag选项)_第2张图片

你可能感兴趣的:(Redis(设计与实现))