Leader和Follower服务器启动期交互过程
挑重点,原书还讲解了单机、集群服务器的启动过程,我这里就跳过了..
我们来看下集群服务器启动过程中Leader服务器与Follower服务器之间的交互
这里默认集群服务器已经完成了Leader选举,集群中的服务器,角色都已经确定。
(图不画了,直接用原书中的图)
Leader和Follower服务器启动期交互过程
1. 创建Leader和Folower服务器
完成Leader选举之后,每个服务的角色都已经确定,开始创建自身相应的服务器实例,并开始进入各自角色的主流程。
2. Leader服务器启动Follower接收器(LearnerCnxAcceptor)
在ZooKeeper集群运行期间,Leader服务器需要和所有其余的服务器(下面使用"learner"表示)保持连接以确定集群中的机器存活情况。
Follower接收器(LearnerCnxAcceptor)用于负责接收所有非leader服务器的连接请求。
3. learner服务器开始和leader服务器建立连接
所有的Learner服务器启动完毕之后,会与leader选举的投票结果中找到当前集群中的Leader服务器,然后与其建立连接。
简单地说,就是将learner服务器的信息注册到leader服务器中。
4. Leader服务器创建LearnerHandler
leader服务器接收到来自其他机器的连接创建请求之后,会创建一个LearnerHandler实例。
每个LearnerHandler实例都对应了一个Leader与Learner服务器之间的连接。
他负责Leader和Learner服务器之间几乎所有的消息通知和数据同步。
5. 向Leader注册
当learner服务于Leader建立起连接之后,Learner就会向Leader进行注册。
所谓的注册其实就是将Learner服务器自己的基本信息发送给Leader服务器。
我们称之为LearnerInfo,包括当前服务器的SID和服务器处理的最新的ZXID。
6. Leader解析Learner信息,计算新的epoch
7. 发送leader状态
计算出新的epoch之后,Leader会将该信息以一个LEADERINFO消息的形式发送给learner,同时等待Learner的响应。
8. Learner发送ACK消息
learner在接收到leader的消息之后,解析出epoch和ZXID,然后向Leader反馈一个ACKEPOCH
9. 数据同步
10. 启动Leader 和 Learner服务器