zoukankan      html  css  js  c++  java
  • zookeeper选举

    1. 发起选举流程有两种情况:
      1. server刚启动的时候,server的状态初始化为LOOKING状态
      1. server发生异常,切换到LOOKING状态

    server4中状态

    1. LOOKING:初始状态,表示在选举leader
    2. FOLLOWING:跟随leader的角色,参与投票
    3. LEADING:集群的leader
    4. OBSERVING:不参与投票,只是同步状态
    1. 按刚启动来讲述选举流程,QuorumPeer::start() -> QuorumPeer::startLeaderElection() -> QuorumPeer::createElectionAlgorithm
    1. 默认使用FastLeaderElection算法,初始化的流程如下:
      1. 初始化QuorumCnxManager,管理选举中和其他server的交互,选举时监听在专门的electionAddr
      2. QuorumCnxManager是实际发生网络交互的地方,它的主要数据结构包括
        1. queueSendMap:sid -> buffer queue,为每个参与投票的server都保留一个队列
        2. recvQueue:message queue,所有收到的消息都放到recvQueue
        3. listenerserver主线程,收发消息时和上面两个队列交互

    QuorumCnxManager可以保证每对peer之间只有一个链接,如果有server发起新的链接,则比较sidsid大的保留链接,小的放弃链接

    1. 初始化FastLeaderElection,这是选举逻辑所在的地方,它主要包括3个线程:
      1. Messenger::WorkerReceiver:从QuorumCnxManager::recvQueue中获取网络包,并将其发到FastLeaderElection::recvqueue中
      2. Messenger::WorkerSender:从FastLeaderElection::sendqueue中获取网络包,并将其放到QuorumCnxManager::queueSendMap中,并发送到网络上
      1. lookForLeader:QuorumPeer主线程会调用lookForLeader函数,它从recvqueue中获取别人发给server的选举数据,并将发给其他server的投票放到sendqueue中
    1. FastLeaderElection::lookForLeader中实现了选举算法,具体的流程如下:
      1. 首先更新选举周期logicalclock,并把自己作为leader作为投票发给所有其他的server
      1. 然后进入本轮投票的循环
        1. 从recvqueue获取一个网络包,如果没有收到包则检查是否要重连和重发自己的投票
        2. 收到投票后判断投票的状态
          1. LOOKING:
            1. 如果对方投票的周期大于自己的周期,那就清空自己的已经收到的投票集合recvset,并将自己作为候选和对方投票的leader做比较,选出大的作为新的投票,然后再发送给所有人。

    这里比较大小是通过比较(zxidsid)这个二元组来的,zxid大的就大,否则sid大的就大

    1. 如果对方的投票周期小于自己,则忽略对方的投票
    1. 如果周期相等,则比较对方的投票和自己认为的候选,选出大的作为新的候选,然后再发送给所有人
    1. 然后判断当前收到的投票是否可以得出谁是leader的结论,这里主要是通过判断当前的候选leader在收到的投票中是否占了多数
    1. 如果候选leader在收到的投票中占了多数,则再等待finalizeWait时钟,看是否有人修改leader的候选,如果修改了则把投票放到recvqueue中再从新循环
    1. OBSERVING:如果对方是一个观察者,由于它没有投票权,则无视它
    1. FOLLOWING或LEADING:
      1. 如果对方和自己再一个时钟周期,说明对方已经完成选举,如果对方说它是leader,那我们就把它作为leader,否则就要比较下对方选举的leader在自己这里是否占有多数,并且选举的leader确认了愿意当leader,如果都通过了,就把这个候选作为自己的leader
      2. 如果对方和自己不再一个时钟周期,说明自己挂掉后又恢复起来,这个时候把别人的投票收集到一个单独的集合outofelection(从名字可以看出这个集合不是用在选举判断),如果对方的投票在outofelection中占有大多数,并且leader也确认了自己愿意做leader,这个时候更新自己的选举周期logicalclock,并修改自己的状态为FOLLOWING或LEADING
  • 相关阅读:
    感知机学习笔记
    NOIP 模拟19
    NOIP 模拟17
    NOIP模拟14-16
    「动态规划」-数位dp专题
    8.5 NOIP 模拟测试 13
    8.3 NOIP 模拟12题解
    8.3 NOIP CE反思
    「分治」-cdq分治
    8.1 NOIP模拟11
  • 原文地址:https://www.cnblogs.com/zengda/p/7397176.html
Copyright © 2011-2022 走看看