Leader 选举
选举算法 :
- leaderElection
- AuthFastLeaderElection
- FastLeaderElection(zookeeper默认使用)
相关概念 :
-
SID : 服务器ID
SID是一个数字,用来标识一台Zookeeper集群中的机器,不能重复,和myid一致 -
ZXID : 事务ID
事务ID,用来唯一标识一次服务器状态的变更,集群中每台机器的ZXID值不一定全都一致. -
Vote : 投票
Leader选举 通过投票来实现.当集群中的机器发现自己无法检测到Leader机器的时候,就会开始尝试进行投票.VOTE数据结构 :
public class Vote{ private final int version; private final long id;//被选举的Leader的sid private final long zxid;//被选举的Leader的事务id private final long electionEpoch;//逻辑时钟,用来判断多个投票是否在同一轮选举周期中 private final long peerEpoch;//被选举的Leader的epoch private final ServerState state;//当前服务器的状态 }
-
Quorum : 过半机器数
即Zookeeper集群中过半的机器数.quorum = (n/2+1) -
服务器状态 :
- LOOKING : 寻找 Leader状态.当服务器处于这个状态时,它认为集群中没有Leader,因此要进入Leader选举流程
- FOLLOWING : 跟随者状态,表明当前服务器角色是Follower
- LEADING : 领导者状态,表明当前服务器角色是Leader
- OBSERVING : 观察者状态,表明当前服务器角色是Observer
选举流程 :
一 、启动服务器时 leader 选举流程

投票元素包括:所推举的服务器的myid和zxid,我们以(myid,ZXID)的形式表示
-
每个 server 都发出投票 ; server1 的投票为 (1,0),server2 的投票为(2,0),然后发给集群中的其他所有的机器
-
接收来自其他服务器的投票 : 接收到投票后首先判断该投票的有效性,包括检查是否是本轮投票,是否来自 Looking 状态的服务器
-
处理投票 : 投票Pk规则
-
优先检查 ZXID.ZXID 比较大的服务器优先作为 Leader
-
如果 ZXID 相同,那么就比较 myid.myid 比较大的服务器作为 Leader 服务器
所以 server1 是(1.0),接收到的是 (2,0) 比较之后更新自己的投票为(2,0),然后重新将投票发出去.server2 不需要更新自己的投票信息,只是再一次向集群中所有机器发出上一次投票信息即可.
-
-
统计投票
每次投票后,服务器统计投票判断是否已经有过半 (n/2+1) 的机器收到相同的投票信息.对于 server1 和 server2 服务器来说都统计出集群中已经有两台服务器接受了 (2,0) 这个投票信息.所以认为已经选出了 Leader
-
改变服务器状态
确定了 Leader,每个服务器就会更新自己的状态,如果是 Follower,就变更为 FOLLOWiNG,如果是 Leader,就变为 LEADING.
二、服务器运行期间的leader选举:
假设当前正在运行的 Zookeeper 服务器由3台机器组成,分别是 Server1、Server2、Server3.当前 leader 是Server2.假设,leader挂了,这时就要开始 leader选举.
-
变更状态
leader挂了之后,所有的非 Observer 服务器都会将自己的状态变更为LOOKING,然后开始进入 Leader 选举流程. -
每个Server发出投票
运行期间,服务器上的 ZXID 可能不同,假定 Server1的 ZXID 为123,Server3的ZXID 为122.第一次投票中,Server1 和 Server3 都会投自己,即分别产生投票(1,123)和(3,122),然后各自将这个投票发给集群中所有机器. -
接收各个服务器的投票
-
处理投票
和上面处理规则一样,由于 Server1 的ZXID 为123,Server3的 ZXID 为122,所以Server1会成为 Leader -
统计投票
-
改变服务器状态
网友评论