PSYNC命令的调用方法有两种:
如果从服务器以前没有复制过任何主服务器,或者之前执行过 SLAVEOF no one 命令,那么从服务器在开始一次新的复制时将向主服务器发送PSYNC ? -1 命令,主动请求主服务器进行完整重同步(因为这时不可能执行部分重同步);
相反地,如果从服务器已经复制过某个主服务器,那么从服务器在开始一次新的复制时将向主服务器发送 PSYNC 《runid》 《offset》 命令:其中runid 是上一次复制的主服务器的运行ID,而 offset则是从服务器当前的复制偏移量,接收到这个命令的主服务器会通过这两个参数来判断应该对从服务器执行哪种同步操作。
根据情况,接收到PSYNC命令的主服务器会向从服务器返回以下三种回复的其中一种:
如果主服务器返回 +FULLRESYNC 《runid》 《offset》回复,那么表示主服务器将与从服务器执行完整重同步操作:其中runid是这个主服务器的运行ID,从服务器会将这个ID保存起来,在下一次发送PSYNC命令时使用;而offset则是主服务器当前的复制偏移量,从服务器会将这个值作为自己的初始化偏移量;
如果主服务器返回 +CONTINUE回复,那么表示主服务器将与从服务器执行部分重同步操作,从服务器只要等着主服务器将自己缺少的那部分数据发送过来就可以了;
如果主服务器返回 -ERR 回复,那么表示主服务器的版本低于 Redis
2.8,它识别不了PSYNC命令,从服务器将向主服务器发送SYNC命令,并与主服务器执行完整同步操作。
这张图看了理解起来保准没啥难度了!
上面我们详细说明了redis主从同步时,底层是如何决定使用全量同步或者部分同步的策略。下面看下整个增量同步和部分同步的过程:
Redis 的全量同步过程主要分三个阶段:
同步快照阶段: Master 创建并发送快照给 Slave , Slave 载入并解析快照。Master
同时将此阶段所产生的新的写命令存储到缓冲区。
同步写缓冲阶段:Master 向 Slave 同步存储在缓冲区的写操作命令。
同步增量阶段:Master 向 Slave 同步写操作命令。
增量同步
Redis 增量同步主要指 Slave 完成初始化后开始正常工作时, Master 发生的写操作同步到 Slave 的过程。
通常情况下, Master 每执行一个写命令就会向 Slave 发送相同的写命令,然后 Slave 接收并执行。
全部0条评论
快来发表一下你的评论吧 !