zookeeper集群启动后,选举leader节点和确定每个节点的角色是数据同步和对外提供服务的前提。因此如何快速有效的选举出leader节点是zookeeper的核心逻辑。本文将结合源码分析zookeeper的选举过程。
一、整体流程
1、zookeeper节点启动后,首先会加载对应路径下的配置文件
2、然后创建代表自身的QuorumPeer对象,在zookeeper集群中,每个节点都是一个QuorumPeer对象
3、集群中参与投票的每个节点两两之间会建立长链接,用于选举信息的同步
4、统计投票结果确定Leader节点。leader节点之外的节点角色分为follower和observer,能够参与投票选举的是follower角色,不参与的是observer角色
二、选举消息收发逻辑
假设zookeeper集群游三个节点组成,用节点1进行距离,投票的收发逻辑如上图所示。左侧是投票的发送流程,右图是选票的接收流程。
三、选举核心逻辑
选举的核心逻辑封装在FastLeaderElection类中,当节点启动后会调用lookForLeader方法来确定leader节点。内部核心逻辑如下图所示。
为了方便查看,分三部分来讲述核心逻辑,中间只描述主干逻辑,逻辑分之这部分简述。左侧流程表示lookForLeader方法的主干逻辑。中间与右侧是左侧图中【统计投票结果】的详细描述,按照接收的选票状态为looking和following或leading两种。
左侧:lookForLeader主干逻辑:
1、每一次选举都会有一个选举逻辑周期编号,投票的结果有效的前提是所有节点在一个选举逻辑周期内,进入选举状态时,每个节点都将自身的逻辑周期数字自增加一。当收到投票的选举逻辑周期与自身的不一致时,以数字大的为准。
2、推荐leader候选人,开始时都会推举自己为leader。每次进行投票都会有唯一的一个事物id进行表示。主进程周期表示一个leader统治的标识,在投票时会将节点所在的leader统治标识一并发送出去。
3、拟定选票后会将选票广播给集群中所有的节点。
4、等待其他节点的投票,如果200毫秒内没有接到投票,则重新发送自己的投票或重新连接。
5、收到投票信息后,根据不同的投票状态,统计投票结果。具体逻辑如中间或者右侧流程。
6、返回选举结果
中间:投票是looking时的处理逻辑
1、当收到的选票是looking时,表示投票的节点也在进行选举。
2、如果收到选票的选举逻辑周期小于当前节点的选举逻辑周期,则该票不做投票统计使用;如果大于,则将自身选举逻辑周期设置为收到投票的;等于时选举逻辑周期不用改变
3、更新节点推荐leader。推荐leader的选择规则是以选举逻辑周期大的为准,选举逻辑周期相同时以选举事物id大的为准,两者都相同时,以节点id大的为准
4、如果推荐leader有变化,则重新广播投票
5、如果没有变化则统计投票结果,如果收到的投票的结果已经超过半数,则表示leader已经选出,如果没有超过半数,则继续投票。在统计出超过半数投票的leader结果后会再等待200毫秒,如果没有变化则选出的leader生效
6、返回投票结果
右侧:投票是following或leading时的处理逻辑
1、是follwing或leading时,表示集群中的节点已经得出选举结果,如果等于自身投票逻辑周期时,则根据过半原则获得leader
2、如果不等于自身投票逻辑周期,则认为其他节点已经选出leader,则直接统计