zookeeper当配置为群集模式,在启动或异常情况将被选举为的例子Leader。默认选择算法FastLeaderElection

不知道zookeeper够考虑这样一个问题:某个服务能够配置为多个实例共同构成一个集群对外提供服务。其每个实例本地都存有冗余数据,每个实例都能够直接对外提供读写服务。在这个集群中为了保证数据的一致性,须要有一个Leader来协调一些事务。那么问题来了:怎样确定哪一个实例是Leader呢?

问题的难点在于:

  • 没有一个仲裁者来选定Leader
  • 每个实例本地可能已经存在数据,不确定哪个实例上的数据是最新的

分布式选举算法正是用来解决问题的。

本文基于zookeeper 3.4.6 的源代码进行分析。FastLeaderElection算法的源代码所有位于FastLeaderElection.java文件里,其对外接口为FastLeaderElection.lookForLeader,该接口是一个同步接口,直到选举结束才会返回。相同因为网上已有类似文章,所以我就从图示的角度来阐述。阅读一些其它文章有利于获得初步印象:

主要流程

阅读代码和以上推荐文章能够把整个流程梳理清楚。

实现上,包含了一个消息处理主循环,也是选举的主要逻辑。以及一个消息发送队列处理线程和消息解码线程。主要流程可概括为下图:

推荐对比着推荐的文章及代码理解。不赘述。

我们从感性上来理解这个算法。

每个节点,相当于一个选民,他们都有自己的推荐人,最開始他们都推荐自己。

谁更适合成为Leader有一个简单的规则,比如sid够大(配置)、持有的数据够新(zxid够大)。

每个选民都告诉其它选民自己眼下的推荐人是谁。类似于出去搞宣传拉拢其它选民。每个选民发现有比自己更适合的人时就转而推荐这个更适合的人。最后。大部分人意见一致时,就能够结束选举。

就这么简单。

整体上有一种不断演化逼近结果的感觉。

当然。会有些特殊情况的处理。

比如总共3个选民,1和2已经确定3是Leader,但3还不知情,此时就走入LEADING/FOLLOWING的分支,选民3仅仅是接收结果。

代码中不是全部逻辑都在这个大流程中完毕的。

在接收消息线程中。还可能单独地回应某个节点(WorkerReceiver.run):

从这里能够看出。当某个节点已经确定选举结果不再处于LOOKING状态时。其收到LOOKING消息时都会直接回应选举的终于结果。结合上面那个例如。相当于某次选举结束了,这个时候来了选民4又发起一次新的选举,那么其它选民就直接告诉它当前的Leader情况。相当于,在这个集群主从已经就绪的情况下,又开启了一个实例,这个实例就会直接使用当前的选举结果。

状态转换

每一个节点上有一些重要的作用结构:

  • 当前推荐人。初始推荐自己。每次收到其它更好的推荐人时就更新
  • 其它人的投票集合。用于确定何时选举结束

每次推荐人更新时就会进行广播,正是这个不断地广播驱动整个算法趋向于结果。

如果有3个节点A/B/C,其都还没有数据,依照sid关系为C>B>A,那么依照规则。C更可能成为Leader,其各个节点的状态转换为:

图中。v(A)表示当前推荐人为A。r[]表示收到的投票集合。

能够看看当其它节点已经确定投票结果时,即不再是LOOKING时的状态:

代码中有一个特殊的投票集合outofelection,我理解为选举已结束的那些投票,这些投票仅用于表征选举结果。

当一个新启动的节点增加集群时。它对集群内其它节点发出投票请求。而其它节点已不处于LOOKING状态,此时其它节点回应选举结果。该节点收集这些结果到outofelection中,终于在收到合法LEADER消息且这些选票也构成选举结束条件时,该节点就结束自己的选举行为。注意到代码中会logicalclock = n.electionEpoch;更新选举轮数

原文地址: http://codemacro.com/2014/10/19/zk-fastleaderelection/

written by Kevin Lynx  posted at
http://codemacro.com

版权声明:本文博主原创文章,博客,未经同意不得转载。

图解zookeeper FastLeader选举算法的更多相关文章

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

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

  2. Zookeeper的选举算法和脑裂问题

    ZK介绍 ZK = zookeeper ZK是微服务解决方案中拥有服务注册发现最为核心的环境,是微服务的基石.作为服务注册发现模块,并不是只有ZK一种产品,目前得到行业认可的还有:Eureka.Con ...

  3. zookeeper源码分析二FASTLEADER选举算法

    如何在zookeeper集群中选举出一个leader,zookeeper使用了三种算法,具体使用哪种算法,在配置文件中是可以配置的,对应的配置项是"electionAlg",其中1 ...

  4. zookeeper leader选举算法源码

    服务器状态 在QuorumPeer中有定义,这个类是一个线程. LOOKING:寻找Leader状态.处于该状态时,它会认为当前集群中没有Leader,进入选举流程. FOLLOWING: LEADI ...

  5. 【原创】大数据基础之Zookeeper(3)选举算法

    提到zookeeper选举算法,就不得不提Paxos算法,因为zookeeper选举算法是Paxos算法的一个变种: Paxos要解决的问题是:在一个分布式网络环境中有众多的参与者,但是每个参与者都不 ...

  6. zookeeper系列之五—Leader选举算法

    leader选举算法 zookeeper server内部原理 zookeeper client

  7. Zookeeper实现分布式选举算法

    分布式系统中经常采用Master/Slave架构.(截止到目前为止我还没有碰到过其他架构...)这种架构中如果Master发生故障就会导致整个集群停止服务,为了提高系统的高可用性通常采用选举算法来选出 ...

  8. zookeeper集群搭建及Leader选举算法源码解析

    第一章.zookeeper概述 一.zookeeper 简介 zookeeper 是一个开源的分布式应用程序协调服务器,是 Hadoop 的重要组件. zooKeeper 是一个分布式的,开放源码的分 ...

  9. Zookeeper选举算法原理

    Zookeeper选举算法原理 Leader选举 Leader选举是保证分布式数据一致性的关键所在.当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举. (1) 服 ...

随机推荐

  1. C++编程有趣的标题1 于1~9填写的运算结果的中间符号等于100

    于1 2 3 4 5 6 7 8 9将九个数字"+"要么"-"符号使得结果100,编程的所有组合. 注意:数字顺序不能改变 <pre name=" ...

  2. mtk硬件项目开始关闭蓝牙功能:mtk 硬件ScanCode和keycode应用演示示例

    项目要求:该项目因为没有使用android5.0,导致启动bluetooth的蓝牙audio slave功能必须使用第三方模组,该第三方模组,启动是通过android主板通过GPIO控制.UI界面是通 ...

  3. hive RegexSerDe View

    EXTERNALkeyword它允许用户创建一个外部表.在表中的同时施工指定的路径中的实际数据(LOCATION).Hive 创建内部表时.会将数据移动到数据仓库指向的路径:若创建外部表,仅记录数据所 ...

  4. 设计模式C++达到 1.辛格尔顿

    实现类的单个案件的Singleton模式.该系统有一个类只有一个实例,而本实施例是容易的外部访问.所以容易控制的实例的数量,并且节省系统资源. 单的情况下通常与一些非本地静态对象的使用,对于这些对象, ...

  5. 由<a href = "#" > 引发的思考

    原文:由<a href = "#" > 引发的思考 前阵子在一个移动项目中,通过 <a href = "#" >  的方式 绑定clic ...

  6. ASP.NET自定义控件组件开发 第五章 模板控件开发

    原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

  7. Ubuntu Linux中开启MySQL远程访问功能

    为了给服务器一个真实的运行环境,今天在内网中部署了一台Ubuntu Linux服务器,其中最头疼的就是MySQL的安装,apt下载更新的速度太慢了,于是就自行编译了一下MySQL的源码,具体的编译方法 ...

  8. 系列三VisualSvn Server

    原文:系列三VisualSvn Server VisualSvn Server介绍 1 .VisualSvn Server  VisualSvn Server是免费的,而VisualSvn是收费的.V ...

  9. SICP 习题(1.1,1.2,1.3,1.4)解题总结。

    近来在重读SICP,以前读过一次,读了第一二章就没有坚持下去,时间一长就基本忘记了,脑海里什么都不剩,就隐约记得自己曾经读过一本很牛B的书. 这次读希望能够扎实一点,不管能读到哪里,希望可以理解一些东 ...

  10. Cocos2d-x3.0 DrawNode吸取

    DrawNode正如它的绘图形状的节点,相互作用可以使将来更加灵活. DrawNode* DrawLayer::shape() { auto shape = DrawNode::create(); s ...