数据同步的过程就是Leader服务器将那些没有在Learner服务器上提交过的事物请求同步给Learner服务器。
ZooKeeper集群数据同步通常分为四类,分别是直接差异化同步(DIFF同步)、先回滚再差异化同步(TRUNC + DIFF同步)、仅回滚同步(TRUNC同步)和全量同步(SNAP同步)。
-
peerLastZxid:该Learner服务器最后处理的ZXID。
-
minCommittedLog:Leader服务器提议缓存队列committedLog中的最下ZXID。
-
maxCommittedLog:Leader服务器提议缓存队列committedLog中的最大ZXID。
1、直接差异化同步(DIFF同步)
场景:peerLastZxid介于minCommittedLog和maxCommittedLog之间。
Leader服务器会首先向Learner发送一个DIFF指令。然后,在Proposal同步过程中,针对每个Proposal,Leader服务器都会通过发送两个数据包来完成,分别是PROPOSAL内容数据包和COMMIT指令数据包——这和ZooKeeper运行时Leader和Follower之间的事物请求的提交过程是一致的。在发送完差异化数据之后,将Learner加入到forwardingFollowers或observingLearners队列中,随后会立即发送一个NEWLEADER指令。
Learner首先接收到一个DIFF指令,然后会依次将接收到的数据包应用到内存数据库中。紧接着,Learner会接收到NEWLEADER指令,此时Learner就会反馈给Leader一个ACK消息,表明自己确实完成了一个对提议缓存队列中Proposal的同步。
一旦满足“过半策略”后,Leader服务就会向所有已经完成数据同步的Learner发送一个UPTODATE指令,用来通知Learner已经完成了数据同步,同时集群中已经有过半机器完成了数据同步,集群已经具备了对外服务的能力。
2、先回滚再差异化同步化(TRUNC + DIFF同步)
场景:peerLastZxid介于minCommittedLog和maxCommittedLog之间;Leader服务器在已经将事务记录到了本地事务日志中,但是没有成功发起Proposal流程就挂了。
当Leader服务器发现某个Learner包含了一条自己没有的事务记录,那么即需要让该Learner进行事务回滚——回滚到Leader服务器上存在的,同时也是最接近peerLastZxid的ZXID。
3、进回滚同步(TRUNC同步)
场景:peerLastZxid大于maxCommittedLog。
Leader会要求Learner回滚到ZXID值为maxCommittedLog对应的事务操作。
4、全量同步(SNAP同步)
场景1:peerLastZxid小于minCommittedLog。
场景2:Leader服务器上没有提议缓存队列,peerLastZxid不等于lastProcessZxid。
Leader会从内存数据库中获取到全量的数据节点和会话超时时间记录器,将它们序列化后传输给Learner。Learner服务器接收到该全量数据后,会对其反序列化后载入内存数据库中。
来源:CSDN
作者:昨日的桥
链接:https://blog.csdn.net/weixin_42829639/article/details/103795662