美文网首页
zookeeper选举过程

zookeeper选举过程

作者: 冷月成双 | 来源:发表于2019-12-02 21:30 被阅读0次

Leader 选举

选举算法 :

  1. leaderElection
  2. AuthFastLeaderElection
  3. 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 选举流程

Leader选举流程

投票元素包括:所推举的服务器的myid和zxid,我们以(myid,ZXID)的形式表示

  1. 每个 server 都发出投票 ; server1 的投票为 (1,0),server2 的投票为(2,0),然后发给集群中的其他所有的机器

  2. 接收来自其他服务器的投票 : 接收到投票后首先判断该投票的有效性,包括检查是否是本轮投票,是否来自 Looking 状态的服务器

  3. 处理投票 : 投票Pk规则

    • 优先检查 ZXID.ZXID 比较大的服务器优先作为 Leader

    • 如果 ZXID 相同,那么就比较 myid.myid 比较大的服务器作为 Leader 服务器

      所以 server1 是(1.0),接收到的是 (2,0) 比较之后更新自己的投票为(2,0),然后重新将投票发出去.server2 不需要更新自己的投票信息,只是再一次向集群中所有机器发出上一次投票信息即可.

  4. 统计投票

    每次投票后,服务器统计投票判断是否已经有过半 (n/2+1) 的机器收到相同的投票信息.对于 server1 和 server2 服务器来说都统计出集群中已经有两台服务器接受了 (2,0) 这个投票信息.所以认为已经选出了 Leader

  5. 改变服务器状态

    确定了 Leader,每个服务器就会更新自己的状态,如果是 Follower,就变更为 FOLLOWiNG,如果是 Leader,就变为 LEADING.

二、服务器运行期间的leader选举:

假设当前正在运行的 Zookeeper 服务器由3台机器组成,分别是 Server1、Server2、Server3.当前 leader 是Server2.假设,leader挂了,这时就要开始 leader选举.

  1. 变更状态
    leader挂了之后,所有的非 Observer 服务器都会将自己的状态变更为LOOKING,然后开始进入 Leader 选举流程.

  2. 每个Server发出投票
    运行期间,服务器上的 ZXID 可能不同,假定 Server1的 ZXID 为123,Server3的ZXID 为122.第一次投票中,Server1 和 Server3 都会投自己,即分别产生投票(1,123)和(3,122),然后各自将这个投票发给集群中所有机器.

  3. 接收各个服务器的投票

  4. 处理投票
    和上面处理规则一样,由于 Server1 的ZXID 为123,Server3的 ZXID 为122,所以Server1会成为 Leader

  5. 统计投票

  6. 改变服务器状态

相关文章

网友评论

      本文标题:zookeeper选举过程

      本文链接:https://www.haomeiwen.com/subject/skfqgctx.html