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数据。
网友评论