提到zookeeper选举算法,就不得不提Paxos算法,因为zookeeper选举算法是Paxos算法的一个变种;

Paxos要解决的问题是:在一个分布式网络环境中有众多的参与者,但是每个参与者都不可靠,可能随时掉线等,这时这些参与者如何针对某个看法达成一致;

类似的问题现实生活中有很多,比如一个团队要组织团建,团队中有10个人,每个人都有自己想去的地方,如何就团建的目的地达成一致?

最简单的方式是把团队全体叫到会议室开会,很快就可以根据少数服从多数的原则,确定一个大多数人都满意的目的地;

如果将问题改为:团队10个人分别在世界的10个地方出差,作息时间各不相同,并且只能通过邮件联系,这时如何确定团建的目的地?

1 Paxos算法

https://en.wikipedia.org/wiki/Paxos_(computer_science)

https://zh.wikipedia.org/zh-cn/Paxos%E7%AE%97%E6%B3%95

Paxos is a family of protocols for solving consensus in a network of unreliable processors. Consensus is the process of agreeing on one result among a group of participants. This problem becomes difficult when the participants or their communication medium may experience failures.

1.1 Roles

Paxos describes the actions of the processors by their roles in the protocol: client, acceptor, proposer, learner, and leader. In typical implementations, a single processor may play one or more roles at the same time. This does not affect the correctness of the protocol—it is usual to coalesce roles to improve the latency and/or number of messages in the protocol.

  • Client

    • The Client issues a request to the distributed system, and waits for a response. For instance, a write request on a file in a distributed file server.
  • Acceptor (Voters) 
    • The Acceptors act as the fault-tolerant "memory" of the protocol. Acceptors are collected into groups called Quorums. Any message sent to an Acceptor must be sent to a Quorum of Acceptors. Any message received from an Acceptor is ignored unless a copy is received from each Acceptor in a Quorum.
  • Proposer 
    • A Proposer advocates a client request, attempting to convince the Acceptors to agree on it, and acting as a coordinator to move the protocol forward when conflicts occur.
  • Learner 
    • Learners act as the replication factor for the protocol. Once a Client request has been agreed on by the Acceptors, the Learner may take action (i.e.: execute the request and send a response to the client). To improve availability of processing, additional Learners can be added.
  • Leader 
    • Paxos requires a distinguished Proposer (called the leader) to make progress. Many processes may believe they are leaders, but the protocol only guarantees progress if one of them is eventually chosen. If two processes believe they are leaders, they may stall the protocol by continuously proposing conflicting updates. However, the safety properties are still preserved in that case.

client有很多个,并且每个client都有很多idea,但是只有一个client的一个idea最终会被大家接受;client想让一个idea被接收,首先会把idea告诉proposor,proposor收到一个idea之后会提交给多个acceptor进行表决,如果超过半数的acceptor表决通过,则表示idea被大家接受;learner会及时收到acceptor的表决结果;

由于实际表决过程是并发的,所以表决过程分为多个阶段,并且增加版本version的概念,这里有点类似于乐观锁;

一个形象的例子是在某个腐败的国家里,政府有一个项目要招标,然后有很多公司(client)都想拿到该项目(idea),决定该项目给谁的是有一个政府内部高层人士(acceptor)小组讨论决定,但是他们深藏不漏,公司需要通过一些政商通吃的中介(proposor),给高层人士输送贿赂(version),每个高层人士收到一个贿赂之后会表示不再接受不高于这个贿赂的其他贿赂并且支持当前这个贿赂的公司,如果一个公司能够成功贿赂小组中多数高层人士,那么这个公司可以拿到这个项目;

1.2 Basic Paxos

  • Phase 1a: Prepare

  • Phase 1b: Promise

  • Phase 2a: Accept Request

  • Phase 2b: Accepted

首先将议员的角色分为 proposers,acceptors,和 learners(允许身兼数职)。proposers 提出提案,提案信息包括提案编号和提议的 value;acceptor 收到提案后可以接受(accept)提案,若提案获得多数 acceptors 的接受,则称该提案被批准(chosen);learners 只能“学习”被批准的提案。划分角色后,就可以更精确的定义问题:

  1. 决议(value)只有在被 proposers 提出后才能被批准(未经批准的决议称为“提案(proposal)”);
  2. 在一次 Paxos 算法的执行实例中,只批准(chosen)一个 value;
  3. learners 只能获得被批准(chosen)的 value。

作者通过不断加强上述3个约束(主要是第二个)获得了 Paxos 算法。

P1:一个 acceptor 必须接受(accept)第一次收到的提案。
P1a:当且仅当acceptor没有回应过编号大于n的prepare请求时,acceptor接受(accept)编号为n的提案。
P2:一旦一个具有 value v 的提案被批准(chosen),那么之后批准(chosen)的提案必须具有 value v。
P2a:一旦一个具有 value v 的提案被批准(chosen),那么之后任何 acceptor 再次接受(accept)的提案必须具有 value v。
P2b:一旦一个具有 value v 的提案被批准(chosen),那么以后任何 proposer 提出的提案必须具有 value v。
P2c:如果一个编号为 n 的提案具有 value v,那么存在一个多数派,要么他们中所有人都没有接受(accept)编号小于 n
的任何提案,要么他们已经接受(accept)的所有编号小于 n 的提案中编号最大的那个提案具有 value v。

2 Zookeeper Leader Election

每个zookeeper服务器都相当于client+proposor+acceptor+learner

Vote(提案编号、提议的 value):myid、zxid、epoch

初始值:

currentVote = new Vote(myid, getLastLoggedZxid(), getCurrentEpoch());

其他人的Vote:

HashMap<Long, Vote> recvset = new HashMap<Long, Vote>();

zookeeper的选举算法做了很多简化,将Paxos的value和version合并成Vote,是为了保证能够在最短的时间内选举出新的leader,同时避免数据丢失和数据同步,来看以下几种情况:

  • 集群第一次启动,所有服务器的zxid和epoch一样,在集群的半数服务器启动后谁的myid最大,谁将会成为leader;比如5台服务器,id分别为1/2/3/4/5,当你顺序启动1/2/3/4/5的时候,3启动后3将会成为leader,4/5启动后会成为follower;当你顺序启动5/4/3/2/1的时候,3启动后5将会成为leader;
  • 集群重启,在集群的半数服务器启动后,谁的epoch最大(每次选举成功后leader会将epoch+1),谁将会成为leader,如果大家的epoch相同,谁的zxid最大(即谁拥有最新的数据),谁将会成为leader;

选举核心类及调用流程:

org.apache.zookeeper.server.quorum.Election

org.apache.zookeeper.server.quorum.FastLeaderElection implements Election

lookForLeader

sendNotifications

totalOrderPredicate

termPredicate

org.apache.zookeeper.server.quorum.flexible.QuorumMaj

containsQuorum

QuorumPeer.setPeerState

是否超过半数判断

    public boolean containsQuorum(HashSet<Long> set){

        return (set.size() > half);

    }

Vote大小判断

    protected boolean totalOrderPredicate(long newId, long newZxid, long newEpoch, long curId, long curZxid, long curEpoch) {

        LOG.debug("id: " + newId + ", proposed id: " + curId + ", zxid: 0x" +

                Long.toHexString(newZxid) + ", proposed zxid: 0x" + Long.toHexString(curZxid));

        if(self.getQuorumVerifier().getWeight(newId) == 0){

            return false;

        }

        /*

         * We return true if one of the following three cases hold:

         * 1- New epoch is higher

         * 2- New epoch is the same as current epoch, but new zxid is higher

         * 3- New epoch is the same as current epoch, new zxid is the same

         *  as current zxid, but server id is higher.

         */

        return ((newEpoch > curEpoch) ||

                ((newEpoch == curEpoch) &&

                ((newZxid > curZxid) || ((newZxid == curZxid) && (newId > curId)))));

    }

【原创】大数据基础之Zookeeper(3)选举算法的更多相关文章

  1. 【原创】大数据基础之Zookeeper(2)源代码解析

    核心枚举 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING; } zookeeper服务器状态:刚启动LOOKING,f ...

  2. 【原创】大数据基础之Zookeeper(1)介绍、安装及使用

    zookeeper3.4.11 http://zookeeper.apache.org/ 一 简介 ZooKeeper is a centralized service for maintaining ...

  3. 【原创】大数据基础之Zookeeper(4)应用场景

    1 集群配置管理 应用服务器的配置通常会放到properties文件中,格式为: system1.module2.prop3=value4 然后启动的时候加载,这样带来的问题是启动后无法修改,想修改必 ...

  4. 大数据篇:Zookeeper

    Zookeeper 1 Zookeeper概念 Zookeeper是什么 是一个基于观察者设计模式的分布式服务管理框架,它负责和管理需要关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Z ...

  5. 决战大数据之三-Apache ZooKeeper Standalone及复制模式安装及测试

    决战大数据之三-Apache ZooKeeper Standalone及复制模式安装及测试 [TOC] Apache ZooKeeper 单机模式安装 创建hadoop用户&赋予sudo权限, ...

  6. 图解zookeeper FastLeader选举算法

    zookeeper当配置为群集模式,在启动或异常情况将被选举为的例子Leader.默认选择算法FastLeaderElection. 不知道zookeeper够考虑这样一个问题:某个服务能够配置为多个 ...

  7. 图解zookeeper FastLeader选举算法【转】

    转自:http://codemacro.com/2014/10/19/zk-fastleaderelection/ zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leade ...

  8. 读&lt;大数据日知录:架构与算法&gt;有感

    前一段时间, 一个老师建议我能够学学 '大数据' 和 '机器学习', 他说这必定是今后的热点, 学会了, 你就是香饽饽.在此之前, 我对大数据, 机器学习并没有非常深的认识, 总觉得它们是那么的缥缈, ...

  9. 【原创】大数据基础之Impala(1)简介、安装、使用

    impala2.12 官方:http://impala.apache.org/ 一 简介 Apache Impala is the open source, native analytic datab ...

随机推荐

  1. 【学习总结】GirlsInAI ML-diary 总

    2019-1-7 GirlsInAI第一期: 人工智障工程师养成计划,代号ML-diary 原博github链接:Girls-In-AI 环境:Windows / MacOS 工具:Anaconda ...

  2. mysql 解压版安装

    1.官网下载压缩包 2.解压 3.配置环境变量 添加系统环境变量  MYSQL_HOME 值为解压的主目录,例如     D:\mysql-5.7.25-winx64 修改Path 环境变量,点击编辑 ...

  3. Java socket详解(转)

    一:socket通信基本原理. 首先socket 通信是基于TCP/IP 网络层上的一种传送方式,我们通常把TCP和UDP称为传输层. 如上图,在七个层级关系中,我们将的socket属于传输层,其中U ...

  4. laravel 远程一对多实例

    /** * 关联楼宇推荐书关联表 * 远程一对一 */ public function buildingPanos() { return $this->hasManyThrough( 'App\ ...

  5. JAXB注解的使用详解

    前言: 最近一直在做各种接口的对接,接触最多的数据类型就是JSON和XML数据,还有XML中包含JSON的数据,而在Java中对象和XML之间的转换经常用到JAXB注解,抽空在这里总结一下,首先做一下 ...

  6. SPP-net原理解读

    转载自:目标检测:SPP-net 地址https://blog.csdn.net/tinyzhao/article/details/53717136 上文说到R-CNN的最大瓶颈是2k个候选区域都要经 ...

  7. NPOI “发现 中的部分内容有问题,是否要恢复此工作薄的内容?如果信任此工作薄的来源。。。”的问题的解决方法

    网上说的方法是调整Sheet可见和顺序:https://blog.csdn.net/hulihui/article/details/21196951 stackoverflow给出的解释是:单元格存储 ...

  8. java 中的基本数据类型

    1,  变量 Java是强类型语言, 对于每一种数据都定义了类型,基本数据类型分为数值型,字符型,布尔型.数值型又分为了整型和浮点型. 整型又分为byte, int, short long. 浮点型又 ...

  9. docker_weave

    安装 curl -L git.io/weave -o /usr/local/bin/weave chmod a+x /usr/local/bin/weave 启动 weave weave launch ...

  10. Mock5 moco框架中post请求如何加入cookies

    接着Mock4中的json文件,再往里面添加一个post 请求. 前面写法不变,后面的请求数据用的是json关键字,返回的response也是json的格式 [ { "description ...