Redis主从模式(二):实现原理(全量复制、部分复制)

复制过程:

  • 从节点执行 slaveof [masterIP] [masterPort],保存主节点信息。

  • 从节点中的定时任务发现主节点信息,建立和主节点的 Socket 连接。

  • 从节点发送 Ping 信号,主节点返回 Pong,两边能互相通信。

  • 连接建立后,主节点将所有数据发送给从节点(数据同步)。

  • 主节点把当前的数据同步给从节点后,便完成了复制的建立过程。接下来,主节点就会持续的把写命令发送给从节点,保证主从数据一致性。

具体的数据同步过程:

Redis结点间的复制由从库主动发起。Redis2.8前由sync命令执行,sync命令只能支持全量复制,Redis2.8及其以后,使用psync命令执行,该命令即支持全量复制,又支持部分复制。
对于主从间的复制,当从库第一次复制数据时,使用全量复制,后面过程当主库处理了写数据后,会将数据自动同步给从库(异步执行)。而部分复制的时机是在从库复制主库的数据时发生异常,待恢复后,发起的一次补救复制,由于这时只涉及部分数据,所以数据同步时间会较短。

下面的主从复制原则分析,也是基于psync来说明的。

一、psync的三要素:

psync执行中,需要使用到 主从结点的复制偏移量、主节点的运行时ID以及主节点复制积压缓存区三部分。

1. 复制偏移量:
主从结点都维护有各自的复制偏移量。

  • 主节点在处理了新的写数据后,会更新自己的偏移量。即主偏移量+=写数据的字节长度。
  • 从结点每隔1秒向主节点发送自己的偏移量,即主节点也会记录从结点的偏移量。
  • 从结点接收到主节点的数据后,也会像主节点一样,更新自己的偏移量。

2. 主节点复制积压缓存区:
主节点维护了一个有限长度的队列,在与从结点连接时建立,默认为1M大小。主节点在响应写数据时,在向从结点发数据同时,也写入复制积压缓存区。这样当发送给从节点的数据丢失时,能够有一个补救机制。

3. 主节点运行时ID:
Redis每次启动都会对应一个48位的运行时ID。从节点进行复制时,发送的是psync 主节点运行时ID 从节点复制偏移量。之所以不用主节点IP+主节点端口号 来识别是因为,当主节点重启后更新了数据(RDB或AOF),此时从节点在基于已有的复制偏移量来同步是不安全的。

补充:
上面的描述信息,都可以通过info replication命令查看到。

二、全量复制:

psync即支持全量复制,又支持部分复制。
当与主节点建立连接后,第一次发送psync 主节点运行时ID 从节点复制偏移量命令时,此时从结点还没有主节点的运行时ID,默认以?表示。并且此时还未进行复制,所以复制偏移量也是默认值-1 。
也就是说,主节点区分从节点的复制请求是全量还是部分,是看psync后面的 主节点运行时ID与从节点复制偏移量是否是默认值,是默认值则代表是第一次同步数据,此时进行全量复制。

过程描述:

  1. 从节点发送 psync -1到主节点。
  2. 主节点解析psync参数,发现是全量复制,向从节点回复+FULLRESYNC runId offset响应。
  3. 从节点保存runId与offset。
  4. 主节点执行BGSAVE命令制作RDB文件,作为本次向从节点发送的数据。
  5. 主节点向从节点发送RDB。
  6. 主节点在从节点恢复RDB数据期间,任然会处理写数据,所以会把写命令保存在复制客户端缓存区内(不是上面的复制积压缓存区),当从节点执行完RDB后,会将该部分的数据发往从节点。
  7. 从节点接收到RDB后,会清除自己的数据。
  8. 清除完数据后,恢复RDB文件的数据。
  9. 从节点执行完RDB后,如果开启了AOF,会立即执行AOF重写,保证AOF文件可用。 AOF介绍

用一张《Redis开发与运维》的图描述上述过程:
取之《Redis开发与运维》
注意:
通过上述过程可以看出全量复制是一个很耗时的操作,体现在:

  • 主节点进行BGSAVE
  • 主节点发送RDB的网络开销
  • 从节点清除数据
  • 从节点执行RDB
  • 从节点进行AOF重写
    所以说,除了主从建立后的第一次数据备份,其他时候应该避免使用全量复制。

三、部分复制:

①部分复制主要是 Redis 针对全量复制的过高开销做出的一种优化措施,也是使用 psync runId offset命令实现。
当从节点正在复制主节点时,如果出现网络闪断或者命令丢失等异常情况时,从节点会向主节点要求补发丢失的命令数据,主节点的复制积压缓冲区将这部分数据直接发送给从节点。
这样就可以保持主从节点复制的一致性。补发的这部分数据一般远远小于全量数据。

②主从连接中断期间主节点依然响应命令,但因复制连接中断命令无法发送给从节点,不过主节点内的复制积压缓冲区依然可以保存最近一段时间的写命令数据。

③当主从连接恢复后,由于从节点之前保存了自身已复制的偏移量和主节点的运行 ID。因此会把它们当做 psync 参数发送给主节点,要求进行部分复制。

④主节点接收到 psync 命令后首先核对参数 runId 是否与自身一致,如果一致,说明之前复制的是当前主节点。
之后根据参数 offset 在复制积压缓冲区中查找,如果 offset 之后的数据存在,则对从节点发送+COUTINUE 命令,表示可以进行部分复制。因为缓冲区大小固定,若发生缓冲溢出,则进行全量复制。

⑤主节点根据偏移量把复制积压缓冲区里的数据发送给从节点,保证主从复制进入正常状态。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40728028/article/details/106591723
今日推荐