image

Redis同步机制有主从同步和从从同步,从从同步时后续版本增加的功能,以减轻主节点的同步负担。

全量同步

也叫快照同步,首先在主节点上进行一下bgsave,当前节点的数据全都快照到磁盘上,然后讲快照文件全部传输到从节点上。从节点接收到快照文件之后,立即执行一次全量加载,加载前会清空当前内存中的数据,加载完毕之后通知主节点继续进行增量同步。

增量同步

增量同步的时日志指令,同AOF文件。主节点会将那些对自己状态产生修改影响的指令记录在本地的缓冲区中,然后异步将buffer中的指令同步到从节点,从节点一边执行同步的指令以达到和主节点一样的状态,一边会主节点反馈自己同步到哪里(偏移量)。

buffer是有限的,所以redis主节点不能将所有指令都记录在内存buffer中。buffer是一个定长的数组,如果数组满了会从头开始覆盖前面的内容。

如果因为网络状况不好,Redis主节点中有没有同步的指令在buffer中可能会被后续的指令所覆盖,从节点无法通过指令流来同步,这时候就会触发全量同步。

所以如果网络原因、buffer太小、全量同步时间过长,都有可能会导致在全量复制过程期间的增量指令在buffer中被覆盖,这样就会导致全量同步完成后无法进行增量同步,然后从节点又会发起全量同步,既有可能陷入死循环。如下图

image 1

总结主从同步的流程

1、初始阶段,从节点连接上主节点,发起sync命令,开始全量同步(快照同步)

2、主节点接收到sync命令之后,会执行bgsave命令,生成rdb文件并在缓冲区内记录此后的写命令

3、快照生成之后,发送给从节点,从节点接受到之后,先清空自身的内存数据,然后加载快照文件。

4、从节点加载完快照之后,向主节点发起增量同步,同步缓冲区中的指令。