1.Leader选举概述

Leader选举是zookeeper最重要的技术之⼀,也是保证分布式数据⼀致性的关键所在。
当Zookeeper集群中的⼀台服务器出现以下两种情况之⼀时,需要进⼊Leader选举。
(1) 服务器初始化启动。
(2) 服务器运⾏期间⽆法和Leader保持连接。

2.Leader选举

2.1 服务器启动时期的Leader选举

若进⾏Leader选举,则⾄少需要两台机器,这⾥选取3台机器组成的服务器集群为例。在集群初始化阶段,当有⼀台服务器Server1启动时,其单独⽆法进⾏和完成Leader选举,当第⼆台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进⼊Leader选举过程。选举过程如下:
(1) 每个Server发出⼀个投票
由于是初始情况,Server1(假设myid为1)和Server2(假设myid为2)都会将⾃⼰作为Leader服务器来进⾏投票,每次投票会包含所推举的服务器的myid和ZXID,使⽤(myid, ZXID)来表示,此时Server1的投票为(1, 0), Server2的投票为(2, 0),然后各⾃将这个投票发给集群中其他机器。
(2) 接受来⾃各个服务器的投票
集群的每个服务器收到投票后,⾸先判断该投票的有效性,如检查是否是本轮投票、是否来⾃LOOKING状态的服务器。
(3) 处理投票
针对每⼀个投票,服务器都需要将别⼈的投票和⾃⼰的投票进⾏PK, PK规则如下
· 优先检查ZXID。 ZXID⽐较⼤的服务器优先作为Leader。
· 如果ZXID相同,那么就⽐较myid。 myid较⼤的服务器作为Leader服务器。
  现在我们来看Server1和Server2实际是如何进⾏投票处理的。对于Server1来说,它⾃⼰的投票是(1, 0),⽽接收到的投票为(2, 0)。⾸先会对⽐两者的ZXID,因为都是0,所以⽆法决定谁是Leader。接下来会对⽐两者的myid,很显然, Server1发现接收到的投票中的myid是2,⼤于⾃⼰,于是就会更新⾃⼰的投票为(2, 0),然后重新将投票发出去。⽽对于Server2来说,不需要更新⾃⼰的投票。
(4) 统计投票
每次投票后,服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。对于Server1和Server2服务器来说,都统计出集群中已经有两台机器接受了(2, 0)这个投票信息。这⾥我们需要对“过半”的概念做⼀个简单的介绍。所谓“过半”就是指⼤于集群机器数量的⼀半,即⼤于或等于(n/2+1)。对于这⾥由3台机器构成的集群,⼤于等于2台即为达到“过半”要求。那么,当Server1和Server2都收到相同的投票信息(2, 0)的时候,即认为已经选出了Leader。
(5) 改变服务器状态
⼀旦确定了Leader,每个服务器就会更新⾃⼰的状态:如果是 Follower,那么就变更为FOLLOWING,如果是Leader,那么就变更为LEADING。

2.2 服务器运行时期的Leader选举

在ZooKeeper集群正常运⾏过程中,⼀旦选出⼀个Leader,那么所有服务器的集群⻆⾊⼀般不会再发⽣变化——也就是说, Leader服务器将⼀直作为集群的Leader,即使集群中有⾮Leader机器挂了或是有新机器加⼊集群也不会影响Leader。但是⼀旦Leader所在的机器挂了,那么整个集群将暂时⽆法对外服务,⽽是进⼊新⼀轮的Leader选举。服务器运⾏期间的Leader选举和启动时期的Leader选举基本过程是⼀致的。
我们还是假设当前正在运⾏的 ZooKeeper 机器由 3 台机器组成,分别是 Server1、 Server2和Server3,当前的Leader是Server2。假设在某⼀个瞬间, Leader挂了,这个时候便开始了Leader选举。
(1) 变更状态
Leader挂后,余下的⾮Observer服务器都会将⾃⼰的服务器状态变更为LOOKING,然后开始进⼊Leader选举过程。
(2) 每个Server会发出⼀个投票
在运⾏期间,每个服务器上的ZXID可能不同,此时假定Server1的ZXID为123, Server3的ZXID为122;在第⼀轮投票中, Server1和Server3都会投⾃⼰,产⽣投票(1, 123), (3, 122),然后各⾃将投票发送给集群中所有机器。
(3) 接收来⾃各个服务器的投票
集群的每个服务器收到投票后,⾸先判断该投票的有效性,如检查是否是本轮投票、是否来⾃LOOKING状态的服务器。
(4) 处理投票。
针对每⼀个投票,服务器都需要将别⼈的投票和⾃⼰的投票进⾏PK, PK规则如下
· 优先检查ZXID。 ZXID⽐较⼤的服务器优先作为Leader。
· 如果ZXID相同,那么就⽐较myid。 myid较⼤的服务器作为Leader服务器。
  现在我们来看Server1和Server3实际是如何进⾏投票处理的。对于Server1来说,它⾃⼰的投票是(1,123),⽽接收到的投票为(3, 122)。很显然,Server1的ZXID更大,那么不更新自己的投票;对于Server3来说,接收到的投票的ZXID大于自己,于是更新自己的投票为(1, 123),然后重新将投票发出去
(5) 统计投票。
每次投票后,服务器都会统计所有投票,判断是否已经有过半的机器接收到相同的投票信息。对于Server1和Server3服务器来说,都统计出集群中已经有两台机器接受了(1, 123)这个投票信息。这⾥我们需要对“过半”的概念做⼀个简单的介绍。所谓“过半”就是指⼤于集群机器数量的⼀半,即⼤于或等于(n/2+1)。对于这⾥由3台机器构成的集群,⼤于等于2台即为达到“过半”要求。那么,当Server1和Server3都收到相同的投票信息(1, 123)的时候,即认为已经选出了Leader。
(6) 改变服务器的状态。
⼀旦确定了Leader,每个服务器就会更新⾃⼰的状态:如果是 Follower,那么就变更为FOLLOWING,如果是Leader,那么就变更为LEADING。

Zookeeper之Leader选举相关推荐

  1. 分布式开发必须了解的Zookeeper的Leader选举机制(源码解析)

    分布式开发必须知道的Zookeeper知识及其的Leader选举机制(ZAB原子广播协议)   ZooKeeper是Hadoop下的一个子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括 ...

  2. Zookeeper的Leader选举

    简单理解Zookeeper的Leader选举 原文链接:简单理解Zookeeper的Leader选举_程裕强的博客-CSDN博客_zk的leader选举 Leader选举是保证分布式数据一致性的关键所 ...

  3. 面试官:说一说Zookeeper中Leader选举机制

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  4. zookeeper的Leader选举机制详解

    转载自:https://www.toutiao.com/i6701570306445672963/?tt_from=copy_link&utm_campaign=client_share&am ...

  5. Zookeeper之Leader选举源码分析

    Zookeeper源码下载地址:https://github.com/apache/zookeeper 1.选举流程 Zookeeeper的Leader选举会分两个过程. 服务启动时的leader选举 ...

  6. Zookeeper的Leader选举-选举过程介绍比较清晰

    http://www.cnblogs.com/leesf456/p/6107600.html 一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leade ...

  7. Zookeeper里Leader选举算法

    ZooKeepe集群中的三种服务器角色:Leader.Follower.Observer,本文主要概述Leader选举算法相关的知识. 一.Zookeeper里三种角色 1.Leader:Leader ...

  8. zookeeper的leader选举机制

    什么是zxid和myid? zxid: zookeeper为了保证数据的有序性,会给每一个写操作的数据,编写一个全局唯一的zxid. zxid是一个64位的数字:前32位会是由当前节点参与的选举次数决 ...

  9. 使用Zookeeper实现leader选举-Leader Latch

    参与选举的所有节点,会创建一个顺序节点,其中最小的节点会设置为master节点, 没抢到Leader的节点都监听前一个节点的删除事件,在前一个节点删除后进行重新抢主,当master节点手动调用clos ...

  10. 使用Zookeeper实现leader选举

    在分布式计算中,leader election是很重要的一个功能,这个选举过程是这样子的:指派一个进程作为组织者,将任务分发给各节点.在任务开始前,哪个节点都不知道谁是leader或者coordina ...

最新文章

  1. 移民申请--申请澳大利亚技术移民的职业评估有技巧(2)
  2. 计算某一段程序消耗的内存和时间【Java】
  3. 走近分形与混沌(part2)-豪斯多夫维数
  4. floyed java_Floyd算法java实现demo
  5. tcp段重组--suricata实现
  6. Python3 异常: name ‘basestring‘ is not defined
  7. 击破区块链应用落地之痛,爆款公链太硬核!
  8. Makima修正Hermite插值
  9. 软件开发中需求分析的过程、层次、阶段、重点都在这里
  10. yolov5检测图片用detect.py
  11. 精彩Linux 篇章
  12. 数据库perl脚本:创建SDB各表,并导入数据
  13. 服务器驱动器输入信号,基于GaN器件的驱动设计方案
  14. 2019年计算机无纸化试题,2019年中级会计无纸化考试操作全攻略!机考常见问题大合集!...
  15. androidstudio引用本地maven_android studio 之dependence添加依赖maven仓库中的项目出错
  16. Python使用traceback.print_exc()输出异常信息
  17. Qt 错误提示1: invalid use of incomplete type ‘***‘
  18. 通过脚本自由设计游戏UI风格
  19. mysql-5.7.12-winx64安装的时候无法启动服务问题
  20. 于Mozilla平台的扩展开发

热门文章

  1. 电视盒子刷linux树莓派,变废为宝二:闲置“树莓派”开发板秒变电视盒子!
  2. 分数计算机在线应用,在线连分数计算器
  3. execute immediate使用方法
  4. 云诺网盘为什么关停了好用的企业网盘有哪些
  5. 元宵节要到了,给大家猜几个谜语
  6. 常见知识库对比:DBpedia/Freebase/OpenCyc/Wikidata/YAGO3
  7. 如何让计算机从固态硬盘启动不了,电脑设置固态硬盘启动的方法
  8. 高琪老师(零基础初学入门)J20飞机项目飞机爆炸轮播图片
  9. 如何理解零知识 zkSNARK应用中的Nullifier Hash攻击?
  10. 【概率论】6-4:分布连续性修正(The Correction for Continuity)