zookeeper leader选举机制

最近看了下zookeeper的源码,先整理下leader选举机制



先看几个关键数据结构和函数

服务可能处于的状态,从名字应该很好理解

public enum ServerState {
  LOOKING, FOLLOWING, LEADING, OBSERVING;
}

选票参数,还有Notification,参数也都差不多

    static public class ToSend {
        long leader;                      //leader id
        long zxid;                         //选票的zxid
        long electionEpoch;                //投票轮数
        QuorumPeer.ServerState state;      //状态
        long sid;                           //投票人id
        long peerEpoch;                    //选票的epoch
    }

选票的比较逻辑也很简单,依次比较几个关键字段

    protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) {
        ...
        return ((newEpoch > curEpoch) ||
                ((newEpoch == curEpoch) &&
                ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));
    }


选举流程

1. 发起投票:

  首先投票给自己,然后给所有Acceptor;

2. 等待ack

  先判断自身状态

    1)如果自身状态不是LOOKING:

      说明已经有多数派通过选举结果,直接将选举结果通知给来源方;

    2)如果自身状态是LOOKING:

      检查投票者状态:

        2.1)如果选票是LOOKING发起的,说明当前正在选举,需要收集选票,检查选举条件:

          首先检查选票轮数:
            如果小于自身投票的轮数,说明收到的选票过期,忽略;
            如果大于自身投票的轮数,说明自己已经out:
              清空选票箱,根据优先级更新自己的选票,然后notify;
            如果等于自身投票的轮数,投票有效:
              根据优先级更新自己的选票,然后notify;

          将选票投入选票箱;

          检查最新选票是否可以通过:

            不满足通过条件:
              继续等待新的选票:
            满足通过条件:
              接收新选票,看能否收到优先级更高的选票:
                如果有优先级高的选票,继续循环;
                否则投票结束,更新状态。
        2.2)如果选票是FOLLOWING、LEADING发起的,说明已有多数派通过选举,此时只需确认是否满足多数派:

          检查选票是否满足多数派:

            2.2.1)满足选票终结。
            2.2.2)继续循环等待



代码流程还算清晰,再来考虑下实际投票中可能情况,以上逻辑能否满足:

1. 一台宕机重启的机器加入已有环境

  此时肯定有一个多数派接收选票时进入状态1),这个多数派会将当前选举结果返回,这些选票的处理流程都会进入2.2,当所有选票收到时,2.2.1满足,选举结束

2. 一台机器加入正在投票中的环境

  如果当前机器的,如果所有server都会接受优先级最高的投票,投票会逐渐收敛,最高优先级最高的选票当选,选举结束;

3. 当集群中多数机器宕机重启

  存活的服务发现不满足多数派,改变状态为LOOKING,投票轮数+1, 然后重新开始投票,此时会进入上面情况2。

以上,只要有超过半数的机器存活,经过投票,收敛后,最终会完成投票。

时间: 2024-10-20 11:57:13

zookeeper leader选举机制的相关文章

Zookeeper leader选举

Zookeeper leader选举 由 xpproen 创建,youj 最后一次修改 2016-12-27 让我们分析如何在ZooKeeper集合中选举leader节点.考虑一个集群中有N个节点.leader选举的过程如下: 所有节点创建具有相同路径 /app/leader_election/guid_ 的顺序.临时节点. ZooKeeper集合将附加10位序列号到路径,创建的znode将是 /app/leader_election/guid_0000000001,/app/leader_el

zookeeper的选举机制

1)半数机制:集群中半数以上机器存活,集群可用.所以zookeeper适合装在奇数台机器上. 2)Zookeeper虽然在配置文件中并没有指定master和slave.但是,zookeeper工作时,是有一个节点为leader,其他则为follower,Leader是通过内部的选举机制临时产生的 3)以一个简单的例子来说明整个选举的过程. 假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的.假设这些服务器

leader 选举机制

from: http://www.jasongj.com/2015/01/02/Kafka%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/ 一种非常常用的选举leader的方式是"majority vote"("少数服从多数"),但Kafka并未采用这种方式.这种模式下,如果我们有2f+1个replica(包含leader和follower),那在commit之前必须保证有f+1个replica复制完消息,为了保证正确选出新的leader,

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

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

ZOOKEEPER3.3.3源码分析(四)对LEADER选举过程分析的纠正

很抱歉,之前分析的zookeeper leader选举算法有误,特此更正说明. 那里面最大的错误在于,leader选举其实不是在大多数节点通过就能选举上的,这一点与传统的paxos算法不同,因为如果这样的话,就会出现数据丢失的情况.比如某台服务器其实有最多的数据量,按照规则而言应该是leader,但是由于启动晚了,最后只能把leader让给其它的服务器.这里面存在明显的时序问题,也就是说leader服务器启动的早晚会影响整个过程. 实际上并不是这样,leader选举算法只有在收到所有参与服务器的

理解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虽然在配置文件中并没有指定master和slave,但是,zookeeper工作时,是有一个节点为leader,其他则为follower.leader是通过内部的选举机制临时产生的. 选举机制大致可以分为以下两种: 1. 全新集群的选举机制 以一个简单的例子来说明整个选举的过程. 假设有五台服务器组成的zookeeper集群,它们的id从1-5,同时它们都是最新启动的,也就是没有历史数据,在存放数据量这一点上,都是一样的.假设这些服务器依序启动,来看看会发生什么. 1) 服务器

zookeeper选举机制

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

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