影响权重的三个参数:
- 服务器 ID(myid):
编号越大在选举算法中权重越大
- 事务 ID(zxid)
值越大说明数据越新,权重越大
- 逻辑时钟(epoch-logicalclock)
同一轮投票过程中的逻辑时钟值是相同的,每投完一次值会增加
选举状态:
- LOOKING: 竞选状态
- FOLLOWING: 随从状态,同步 leader 状态,参与投票
- OBSERVING: 观察状态,同步 leader 状态,不参与投票
- LEADING: 领导者状态
什么时候进行选举?
- 服务器启动时的leader选举
- 运行过程中得leader选举
服务器启动时的 leader 选举
每个节点启动的时候都处于 LOOKING 状态,接下来就开始进行选举主流程。这里选取三台机器组成的集群为例。
第一台服务器 server1启动时,无法进行 leader 选举,当第二台服务器 server2 启动时,两台机器可以相互通信,进入 leader 选举过程。
Zookeeper集群中只有超过半数以上的服务器启动,集群才能正常工作。
每台 server 发出一个投票,由于是初始情况,server1 和 server2 都将自己作为 leader 服务器进行投票
每次投票包含所推举的服务器myid、zxid、epoch,使用(myid,zxid)表示,此时 server1 投票为(1,0),server2 投票为(2,0),然后将各自投票发送给集群中其他机器。
接收来自各个服务器的投票。集群中的每个服务器收到投票后,首先判断该投票的有效性(如检查是否是本轮投票(epoch),是否来自 LOOKING 状态的服务器)。
分别处理投票。针对每一次投票,服务器都需要将其他服务器的投票和自己的投票进行对比。
对比规则如下:
- a. 优先比较 epoch
- b. 检查 zxid,zxid 比较大的服务器优先作为 leader
- c. 如果 zxid 相同,那么就比较 myid,myid 较大的服务器作为 leader 服务器
统计投票。每次投票后,服务器统计投票信息,判断是都有过半机器接收到相同的投票信息。server1、server2 都统计出集群中有两台机器接受了(2,0)的投票信息,此时已经选出了 server2 为 leader 节点。
- 改变服务器状态。一旦确定了 leader,每个服务器响应更新自己的状态,如果是 follower,那么就变更为 FOLLOWING,如果是 Leader,变更为 LEADING。此时 server3继续启动,直接加入变更自己为 FOLLOWING。

