面试官:Redis主从复制时网络开小差了怎么整?( 二 )


网络开小差了上面的流程我们已经知道了正常情况下主从节点的复制过程了 , 但是当网络中断导致主从连接失败等异常情况下 , 主从同步又是如何来进行的?
在这里要提到一个增量复制的名词 , 与全量复制不同的是 , 它是根据主从节点的偏移量来进行数据同步的 。
什么意思呢?
还记得在全量复制里我们所提到过的缓冲区吗?就是用来存储生成 RDB 文件后的写命令的 , 这里我们称为缓冲区A 。 主从节点断开连接后 , 除了会将后续接收到的写命令写入缓冲区A的同时 , 还会写入到另一个缓冲区B里 。
在缓冲区B里 , 主从节点分别会维护一个偏移量 offset 。 刚开始时 , 主节点的写位置与从节点的读位置在同一起点 , 随着主节点的不断写入 , 偏移量也会逐渐增大 。 同样地 , 从节点复制完后偏移量也在不断增加 。
面试官:Redis主从复制时网络开小差了怎么整?文章插图
当网络断开连接时 , 从节点不再进行同步 , 此时主节点由于不断接收新的写操作的偏移量会大于从节点的偏移量 。 当连接恢复时 , 从节点向主节点发送带有偏移量的psync 命令 , 主节点根据偏移量来进行比较 , 只需将未同步写命令同步给从节点即可 。
总结主从一致性原理

  • 从节点第一次进行连接时 , 主节点会生成 RDB 文件进行全量复制 , 同时将新写入的命令存储进缓冲区 , 发送给从节点 , 从而保证数据一致性;
  • 为了减少数据同步给主节点带来的压力 , 可以通过从节点级联的方式进行同步 。
网络开小差了
  • 网络断连重新连接后 , 主从节点通过分别维护的偏移量来同步写命令 。
原文链接:
如果觉得本文对你有帮助 , 可以转发关注支持一下