整个集群完成Leader选举之后,Learner(Follower和Observer的统称)回向Leader服务器 进行注册。当Learner服务器想Leader服务器完成注册后,进入数据同步环节。
数据同步流程:(均以消息传递的方式进行)
i. Learner向Learder注册
ii. 数据同步
iii. 同步确认
Zookeeper的数据同步通常分为四类:
直接差异化同步(DIFF同步)
先回滚再差异化同步(TRUNC+DIFF同步)
仅回滚同步(TRUNC同步)
全量同步(SNAP同步)
在进行数据同步前,Leader服务器会完成数据同步初始化:
peerLastZxid:从learner服务器注册时发送的ACKEPOCH消息中提取lastZxid(该Learner 服务器最后处理的ZXID)
minCommittedLog:Leader服务器Proposal缓存队列committedLog中最小ZXID
maxCommittedLog:Leader服务器Proposal缓存队列committedLog中最大ZXID
直接差异化同步(DIFF同步) 场景:peerLastZxid介于minCommittedLog和maxCommittedLog之间
先回滚再差异化同步(TRUNC+DIFF同步)
场景:当新的Leader服务器发现某个Learner服务器包含了一条自己没有的事务记录,那么就 需要让该Learner服务器进行事务回滚–回滚到Leader服务器上存在的,同时也是最接近于 peerLastZxid的ZXID
仅回滚同步(TRUNC同步)
场景:peerLastZxid 大于 maxCommittedLog
全量同步(SNAP同步)
场景一:peerLastZxid 小于 minCommittedLog
场景二:Leader服务器上没有Proposal缓存队列且peerLastZxid不等于lastProcessZxid