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