zookeeper选举

  1. 发起选举流程有两种情况:

    1. server刚启动的时候,server的状态初始化为LOOKING状态
    1. server发生异常,切换到LOOKING状态

server有4中状态

  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. listener:server主线程,收发消息时和上面两个队列交互

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

  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做比较,选出大的作为新的投票,然后再发送给所有人。

这里比较大小是通过比较(zxid,sid)这个二元组来的,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
时间: 2024-11-05 17:30:18

zookeeper选举的相关文章

zookeeper选举代码分析

本文将以zookeeper的3.4.6版本作为源码分析版本.主要的代码类包括QuorumPeerMain.QuorumPeer.FastLeaderElection.QuorumMaj等. 假设有a,b,c三个zookeeper服务,serverid分别是1.2.3: 1.先启动集群中的a服务,先投票自己a为leader,并将投票信息发送给自己; QuorumPeerMain对象调用QuorumPeer线程的startLeaderElection方法,最终调用FastLeaderElection

理解zookeeper选举机制

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

zookeeper选举流程

如何在zookeeper集群中选举出一个leader,zookeeper使用了三种算法,具体使用哪种算法,在配置文件中是可以配置的,对应的配置项是"electionAlg",其中1对应的是LeaderElection算法,2对应的是AuthFastLeaderElection算法,3对应的是FastLeaderElection算法.默认使用FastLeaderElection算法.其他两种算法我没有研究过,就不多说了. 要理解这个算法,最好需要一些paxos算法的理论基础. 1) 数据

zookeeper选举机制

在上一篇文章中我们大致浏览了zookeeper的启动过程,并且提到在Zookeeper的启动过程中leader选举是非常重要而且最复杂的一个环节.那么什么是leader选举呢?zookeeper为什么需要leader选举呢?zookeeper的leader选举的过程又是什么样子的?本文的目的就是解决这三个问题. 首先我们来看看什么是leader选举.其实这个很好理解,leader选举就像总统选举一样,每人一票,获得多数票的人就当选为总统了.在zookeeper集群中也是一样,每个节点都会投票,如

zookeeper 选举过程

synchronized public void startLeaderElection() { try { currentVote = new Vote(myid, getLastLoggedZxid(), getCurrentEpoch()); } catch(IOException e) { RuntimeException re = new RuntimeException(e.getMessage()); re.setStackTrace(e.getStackTrace()); thr

品味Zookeeper之选举及数据一致性_3

品味Zookeeper之选举及数据一致性 本文思维导图 前言 为了高可用和数据安全起见,zk集群一般都是由几个节点构成(由n/2+1,投票机制决定,肯定是奇数个节点).多节点证明它们之间肯定会有数据的通信,同时,为了能够使zk集群对外是透明的,一个整体对外提供服务,那么客户端访问zk服务器的数据肯定是要数据同步,也即数据一致性. zk集群是Leader/Follower模式来保证数据同步的.整个集群同一时刻只能有一个Leader,其他都是Follower或Observer.Leader是通过选举

8.8.ZooKeeper 原理和选举机制

1.ZooKeeper原理 Zookeeper虽然在配置文件中并没有指定master和slave但是,zookeeper工作时,是有一个节点为leader,其他则为follower,Leader是通 过内部的选举机制临时产生的 2.ZooKeeper选举机制 2.1.概念 2.2. zk的选举机制(全新集群paxos):新搭建,无任何数据(通过myid) 2.3. 非全新集群的选举机制(数据恢复) 原文地址:https://www.cnblogs.com/yaboya/p/9149077.htm

面试题:说说你对ZooKeeper集群与Leader选举的理解?

ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分布式锁等功能. 高可用 为了保证ZooKeeper的可用性,在生产环境中我们使用ZooKeeper集群模式对外提供服务,并且集群规模至少由3个ZooKeeper节点组成. ? 集群至少由3个节点组成?? ZooKeeper其实2个节点也可以组成集群并对外提供服务,但我们使用集群主要目的是为了高可用.如果2个节点组成集群,其中1个节点挂了,另外ZooKeeper

Zookeeper源码阅读(十八) 选举之快速选举算法FastLeaderElection

目录 前言 FastLeaderEleaction基本结构 选举方法分析 思考 参考 前言 在过去的两节里已经分析了选举过程中的一些实体类和网络IO相关的机制与源码,这一节将会对zookeeper选举的核心类FastLeaderElection进行分析. FastLeaderEleaction基本结构 可以看到FastLeaderElection的基本结构还是比较清晰的,主要从新的成员变量类和内部类来分析下FastLeaderElection的基本结构. Notification /** * N