整个集群完成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