目录
- Follower
- 创建Follower实例
- followLeader()
- findLeader()
- connectToLeader()
- registerWithLeader()
- syncWithLeader()
- FollowerZooKeeperServer
Follower
Leader选举结束后,成为Follower的服务器开始进行Follower的工作,过程如下:
与Leader的过程类似,第一步创建Follower实例,第二步开始执行工作followerLeader()
。
创建Follower实例
followLeader()
在Leader的LearnerHandler中,当Leader与Follower建立连接后发生的工作流程如下:
在LearnerHandler的run()方法中我们已经分析了左边Leader的工作,Follower的followLeader()
方法则是右边的工作,源码过程如下:
接下来具体分析第1步~第4步,第5步则会在后文具体请求时再分析。
findLeader()
connectToLeader()
在这一步中最关键的是设置了leaderIs与leaderOs,后续Follower与Leader收发信息时都直接使用这两个变量。
registerWithLeader()
当Follower与Leader成功建立连接后,Follower就开始向Leader注册自己的信息,在这个过程中包括发送身份信息、确认epoch
syncWithLeader()
当Follower与Leader确认完选举轮次epoch之后就要开始进行数据同步:
- 首先收到来自Leader的一个确认同步类型的包,即差异化同步
DIFF
、全量同步SNAP
、回滚同步TRUNC
- 接收来自Leader的数据,即
PROPOSAL
,每一个PROPOSAL
之后跟随一个COMMIT
- 数据同步结束后会收到
NEWLEADER
包,确认Leader - Leader确认结束之后会收到
UPTODATE
,表明Follower已经与Leader同步,可以开始处理来自客户端的请求
源码过程如下:
Follower的初始化工作介绍到此结束。
FollowerZooKeeperServer
它的作用与Leader的LeaderZooKeeperServer类似,所以我们只介绍它定义的Processor:
FollowerRequestProcessor:它的工作主要是识别出当前请求是否为事务请求,如果是事务请求,在提交给CommitProcessor后会继续将其发送给Leader进行处理。
SendAckRequestProcessor:在SyncRequestProcessor完成事务日志记录后会通过SendAckRequestProcessor向Leader发送对Proposal的反馈信息,与Leader的AckRequestProcessor本地操作不同,它是一个远程反馈。