目录
上图就是全量同步的一个流程图
????????首先在slave(从节点)连接master(主节点)时,从节点会给主节点发送两个参数(replid,offset),主节点会拿着自己的replid来与从节点发送过来的replid进行是否一致的判断,如果是不一致就认为是第一次进行连接,然后master把自己的replid和offset返回给slave,slave(从节点)接收到master(主节点)的replid和offset之后会在slave(从节点)进行一个保存。
????????之后master会执行bgsave来生成RDB文件,bgsave是开启一个子线程在后台进行将数据写入到磁盘中。在生成RDB文件期间,为了防止数据不同步,所有master会将期间执行的命令在repl_baklog中进行记录。master生成RDB文件后会发送给slave中,slave会先将自己的本地数据全部清空之后再加载从master分支发送来的RDB文件。
????????第三阶段就是master把repl_baklog中记录的命令发送给slave来让slave执行,这样来完成主从数据的同步
????????假设slave分支重启了,重启成功后会拿着自己的replid和offset发送给master分支来判断replid是否一致,因为我们现在是第二次连接,所有replid是一致的,如果一致,master会认为不是第一次连接并返回给slave一句continue
????????master会拿着slave发送过来offset的值去repl_baklog来找到对应的位置,然后获取在offset值之后的数据并将这些命令发送给slave来执行,这就是增量实现主从同步
????????假设repl_baklog的长度是100(它的长度取决于设置),而slave宕机了10秒钟,slave存储的offset为“8”。在这8秒钟的时间master会将期间执行的命令记录在repl_baklog中,记录的顺序就是从8开始往下进行记录。
????????repl_baklog的形状是一个环形的,如果说在slave宕机的这段时间里,master记录的命令并没有到“8”的位置,那么slave再次连接的时候就会进行增量同步,当然还有另外一种可能,当master在repl_baklog中记录到了“100”的位置,slave还没有上线,那么master会继续往下记录并把之后的记录进行覆盖,把“1”覆盖为101,当把slave中记录的offset值也覆盖了之后,这时slave上线了,slave会发送给master两个参数replid和offset。
????????因为不是第一次连接,所以replid是一致的,master会拿着slave的offset去repl_baklog中取offset之后的命令,但是master记录的命令已经把offset的值进行了覆盖,所以master找不到对应的offset值,这时候会进行全量同步。