建议先关注、点赞、收藏后再阅读。
部分重同步是通过读取主节点的RDB文件和增量复制缓冲区(replication buffer)来实现的。
具体步骤如下:
- 从主节点发送一个
PSYNC
命令给从节点,表示要执行部分重同步。 - 从节点根据自身是否具有复制积压缓冲区来确定采用何种方式进行同步。
- 如果从节点没有复制积压缓冲区,那么从节点执行全量同步(full resynchronization)。它会向主节点发送一个
SYNC
命令,主节点会生成一个新的RDB文件,并将该文件发送给从节点,从节点接收并加载该文件后,执行全量同步。 - 如果从节点有复制积压缓冲区,那么从节点执行部分同步(partial resynchronization)。从节点会向主节点发送一个
PSYNC
命令,携带上次复制的偏移量offset和复制积压缓冲区的内容。主节点接收到PSYNC
命令后,会判断自身的偏移量和复制积压缓冲区是否满足从节点的条件,如果满足,则主节点将从上次偏移量以后的指令发送给从节点进行同步。
部分重同步的机制在Redis复制过程中的作用是优化复制性能,减少全量同步的时间和带宽消耗。通过部分重同步,从节点只需要同步自上次断开连接以来的增量数据,而不需要整个RDB文件,可以快速从主节点恢复到与主节点一致的状态。这样大大减少了复制过程的数据传输量和延迟。</div>
PSYNC命令的实现原理
PSYNC(Partial synchronization)命令是Redis中用于复制的一种命令,其实现原理如下:
- 当从节点(slave)首次连接到主节点(master)时,从节点向主节点发送一个PSYNC命令以请求进行复制。
- 主节点根据从节点传来的offset(已复制的数据量)参数判断从节点的复制状态,有以下两种情况:
- 若offset为0,则说明从节点是一个旧节点,无复制进度,主节点会全量复制所有数据给从节点。
- 若offset大于0,则说明从节点是一个断开连接后重新连接的节点,且可能有部分数据已经被复制,此时主节点会执行部分复制。
- 主节点执行部分复制时,会通过传输部分RDB文件以及复制命令来完成。主节点根据offset参数从RDB文件中找到从节点复制断点的位置,然后发送从断点开始的增量复制命令给从节点。
- 从节点接收到增量复制命令后,执行命令来达到增量复制的目的。
PSYNC命令在复制过程中的作用
- 初始化复制: 当从节点刚连接到主节点时,PSYNC命令用于请求进行复制,并触发主节点执行全量复制或部分复制的流程。
- 断点续传: 当从节点断开连接并重新连接到主节点时,PSYNC命令会告知主节点从哪个断点开始复制,使得主节点能够从断点开始进行增量复制,实现断点续传。
- 保持一致性: PSYNC命令在复制过程中保持主从节点的数据一致性,确保从节点能够与主节点保持同步,以便在主节点故障时能够顺利切换成为主节点并提供服务。