目录
- Leader
- 创建Leader实例
- lead()
Leader
Leader选举结束后,成为leader的服务器开始进行leader的工作,过程如下:
从源码中看出,第一步先创建Leader实例,第二步调用Leader.lead()
方法,Leader的所有工作都在lead()
方法中。
创建Leader实例
创建Leader实例的过程中:
- 创建LeaderZookeeperServer实例,LeaderZookeeperServer定义了一系列Processor用于处理请求
- 获取leader服务器的地址,默认下只有一个地址,如果开启了
zookeeper.multiAddress.enabled
并且定义了多个服务器地址如server.1=localhost:2888:3888|localhost:2891:3891
,那么会有多个服务器地址用于与learner建立通信连接。 - 将第1步中创建的LeaderZookeeperServer实例设置到Leader的zk参数
源码过程如下:
lead()
进入lead()
就表示leader的工作正式开始,它的工作如下:
- 加载本地数据,包括session和data
- 启动LearnerCnxAcceptor,该过程会创建与集群中所有learner服务器的连接,该连接用于learner服务器的请求通信。连接建立后会进行一系列的初始化工作,包括确认epoch、确认新leader、leader与learner的数据同步,初始化工作完成后开始监听工作,监听所有来自learner服务器的请求。
- 等待learner确认选举轮次epoch,第2步建立连接后leader会向learner服务器发送epoch信息
- 等待集群learner确认leader,第2步建立连接后会向learner服务器发送新leader的信息
- 启动LeaderZookeeperServer
- 执行leader的工作,包括定期检查Leader资格、向learner发送ping
源码过程如下:
Leader的工作流程大体如此,后文逐一分析这个过程中涉及到的类:
- LeaderZooKeeperServer
- LearnerCnxAcceptor