Zookeeper-follower 初始化

Follower 初始化

选举完成后,节点状态被初始化为FOLLOWING,之后创建follower节点,跟随leader并从leader同步数据。

1、Follower 相关类

  • Follower:follower的控制逻辑
  • FollowerZookeeperServer:客户端请求处理、同步leader数据

2、follower控制逻辑

在follower 初始化完成后,通过 follower#followLeader 来跟随leader。

1、寻找leader节点

寻找leader节点通过Learner#findLeader实现。遍历所有节点,通过投票信息找出leaderId。

2、连接leader

通过Learner#connectToLeader 和上一步找到的leader建立连接,如果失败默认会重试不辞

3、同步新的选举周期

这一步和leader的数据交互都是同步的,有以下几个步骤:

  • 1、发送FOLLOWERINFO(serverId,zxid,协议版本等)给leader
  • 2、收到 LEADERINFO 数据后,解析出leader的 newEpoch;回复 ACKEPOCH 数据包(包括follower 的lastLoggedZxid)给leader。
  • 3、将 leader# newEpoch 封装成zxid 返回。

4、向Leader同步数据

通过Learner#syncWithLeader 实现数据同步。这一步leader 会根据 follower 之前回复的ack数据包中lastLoggedZxid 来确定同步策略(参考leader初始化篇)。

1、数据同步前处理

在数据开始同步前,follower会根据leader 发送的数据同步策略预先做一些处理

  • DIFF:等待差异化同步
  • SNAP:清除follower db,使用来自leader的数据覆盖本地数据
  • TRUNC:将数据回滚到leader#zxid

2、同步数据

  • 1、将收到PROPOSAL 数据包放到packetsNotCommitted 队列中
  • 2、收到COMMIT时,取出packetsNotCommitted 首节点将其提交,之后移除首节点,将其加入到packetsCommitted 中
  • 3、处理NEWLEADER;leader将需要同步的数据都发给follower之后,会紧接着发送一个NEWLEADER 数据包给follower,意味着follower收到这个类型的数据包之后表示数据已同步完成,然后会回复ACK给leader。
  • 4、处理UPTODATE;在leader收到大多数follower发送的ACK消息之后,会启动自身服务,,启动完成之后会发送UPTODATE数据包给follower。follower收到这个数据包时,表示数据已经同步完,并且leader 服务已经开始对外服务。此时follower退出同步数据任务,开始启动自身服务。

3、启动 FollowerZookeeperServer

  • 1、创建并启动SessionTracker(LearnerSessionTracker)
  • 2、设置请求处理器;
  • 3、注册JMX,修改当前节点状态为RUNNING

4、处理snapshot 到 uptodate 之间的数据

再以snapshot的方式同步数据时,开始同步数据到follower 收到uptodate数据包之间有可能leader也有数据变更,这时需要将这部分数据提交。

经过以上的步骤之后,follower 服务启动完成。作为follower 它一方面需要处理来自客户端的请求,一方面也需要处理来自leader 的心跳数据和proposal和commit数据。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容