整个集群完成 Leader 选举之后,Learner(Follower 和 Observer 的统称)回向 Leader 服务器进行注册。当 Learner 服务器想 Leader 服务器完成注册后,进入数据同步环节。

数据同步流程:(均以消息传递的方式进行)

  • Learner 向 Learder 注册
  • 数据同步同步确认

    Zookeeper 的数据同步通常分为四类:

  • (1) 直接差异化同步(DIFF 同步)
  • (2) 先回滚再差异化同步(TRUNC+DIFF 同步)
  • (3) 仅回滚同步(TRUNC 同步)
  • (4) 全量同步(SNAP 同步)在进行数据同步前,Leader 服务器会完成数据同步初始化: peerLastZxid: · 从 learner 服务器注册时发送的 ACKEPOCH 消息中提取 lastZxid(该Learner 服务器最后处理的 ZXID)

    minCommittedLog:

  • Leader 服务器 Proposal 缓存队列 committedLog 中最小

    ZXIDmaxCommittedLog:

  • 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