Zookeeper 是一个分布式服务框架,主要是用来解决分布式应用中遇到的一些数据管理问题如:统一命名服务状态同步服务集群管理分布式应用配置项的管理等。我们可以简单把 Zookeeper 理解为分布式家庭的大管家,那么管家团队是如何选出Leader的呢?

人类选举的基本原理

讲解 Zookeeper 选举过程前先来介绍一下人类的选举。

我们每个人或多或少都经历过几次选举,在投票的过程中可能会遇到这样几种情况:

情况1:自己与几个候选人都比较熟,你会将票投给你认为能力比较强的人

熟人选举

情况2:自己也是候选人,并且与其他几个候选人都不熟,这个时候你肯定想着要去拉票,因为觉得自己才是最厉害的人呀,所有人都应该把票投给我。但是遗憾的是在拉票的过程中,你发现别人比你强,你开始自卑了,最终还是把票投给了自己认为最强的人。

自己参与选举

所有人都投完票之后,最后从投票箱中进行统计,获得票数最多的人当选。

思维导图

在整个投票过程中我们可以提炼出四个最核心的概念:

  • 候选人能力:投票的基本原则是选最强的人。

  • 遇强改投:如果后面发现更强的人可以改投票。

  • 投票箱:所有人的票都会放在投票箱。

  • 领导者:得票最多的人即为领导者。

从人类选举的原理我们来简单推导一下Zookeeper的选举原理。

Zookeeper选举的基本原理

注意如果 Zookeeper 是单机部署是不需要选举的,集群模式下才需要选举。

Zookeeper 的选举原理和人类选举的逻辑类似,套用一下人类选举的四个基本概念详细解释一下Zookeeper。

  • 个人能力

如何衡量 Zookeeper 节点个人能力?答案是靠数据是否够新,如果节点的数据越新就代表这个节点的个人能力越强,是不是感觉很奇怪,就是这么定的!

在 Zookeeper 中通常是以事务id(后面简称zxid)来标识数据的新旧程度(版本),节点最新的zxid越大代表这个节点的数据越新,也就代表这个节点能力越强。

zxid 的全称是 ZooKeeper Transaction Id,即 Zookeeper 事务id。

  • 遇强改投

在集群选举开始时,节点首先认为自己是最强的(即数据是最新的),然后在选票上写上自己的名字(包括zxidsid),zxid 是事务id,sid 唯一标识自己。

紧接着会将选票传递给其他节点,同时自己也会接收其他节点传过来的选票。每个节点接收到选票后会做比较,这个人是不是比我强(zxid比我大),如果比较强,那我就需要改票,明明别人比我强,我也不能厚着脸皮对吧。

  • 投票箱

与人类选举投票箱稍微有点不一样,Zookeeper 集群会在每个节点的内存中维护一个投票箱。节点会将自己的选票以及其他节点的选票都放在这个投票箱中。由于选票是互相传阅的,所以最终每个节点投票箱中的选票会是一样的。

  • 领导者

在投票的过程中会去统计是否有超过一半的选票和自己选择的是同一个节点,即都认为某个节点是最强的。一旦集群中有超过半数的节点都认为某个节点最强,那该节点就是领导者了,投票也宣告结束。

什么场景下 Zookeeper 需要选举?

当 Zookeeper 集群中的一台服务器出现以下两种情况之一时,需要进入 Leader 选举

(1)服务器初始化启动。

(2)服务器运行期间 Leader 故障。

启动时期的 Leader 选举

假设一个 Zookeeper 集群中有5台服务器,id从1到5编号,并且它们都是最新启动的,没有历史数据。

集群刚启动选举过程

假设服务器依次启动,我们来分析一下选举过程:

(1)服务器1启动

发起一次选举,服务器1投自己一票,此时服务器1票数一票,不够半数以上(3票),选举无法完成。

投票结果:服务器1为1票。

服务器1状态保持为LOOKING

(2)服务器2启动

发起一次选举,服务器1和2分别投自己一票,此时服务器1发现服务器2的id比自己大,更改选票投给服务器2。

投票结果:服务器1为0票,服务器2为2票。

服务器1,2状态保持LOOKING

(3)服务器3启动

发起一次选举,服务器1、2、3先投自己一票,然后因为服务器3的id最大,两者更改选票投给为服务器3;

投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数(3票),服务器3当选Leader

服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING

(4)服务器4启动

发起一次选举,此时服务器1,2,3已经不是LOOKING 状态,不会更改选票信息。交换选票信息结果:服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3。

服务器4并更改状态为FOLLOWING

(5)服务器5启动

与服务器4一样投票给3,此时服务器3一共5票,服务器5为0票。

服务器5并更改状态为FOLLOWING

最终的结果

服务器3是 Leader,状态为 LEADING;其余服务器是 Follower,状态为 FOLLOWING

运行时期的Leader选举

在 Zookeeper运行期间 Leader 和 非 Leader 各司其职,当有非 Leader 服务器宕机或加入不会影响 Leader,但是一旦 Leader 服务器挂了,那么整个 Zookeeper 集群将暂停对外服务,会触发新一轮的选举。

初始状态下服务器3当选为Leader,假设现在服务器3故障宕机了,此时每个服务器上zxid可能都不一样,server1为99,server2为102,server4为100,server5为101

集群 Leader 节点故障

运行期选举与初始状态投票过程基本类似,大致可以分为以下几个步骤:

(1)状态变更。Leader 故障后,余下的非 Observer 服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程

(2)每个Server会发出投票。

(3)接收来自各个服务器的投票,如果其他服务器的数据比自己的新会改投票。

(4)处理和统计投票,每一轮投票结束后都会统计投票,超过半数即可当选。

(5)改变服务器的状态,宣布当选。

话不多说先来一张图:

运行器 Leader 故障后选举流程

(1)第一次投票,每台机器都会将票投给自己。

(2)接着每台机器都会将自己的投票发给其他机器,如果发现其他机器的zxid比自己大,那么就需要改投票重新投一次。比如server1 收到了三张票,发现server2的xzid为102,pk一下发现自己输了,后面果断改投票选server2为老大。

选举机制中涉及到的核心概念

敲黑板了,这些概念是面试必考的。

(1)Server id(或sid):服务器ID

比如有三台服务器,编号分别是1,2,3。编号越大在选择算法中的权重越大,比如初始化启动时就是根据服务器ID进行比较。

(2)Zxid:事务ID

服务器中存放的数据的事务ID,值越大说明数据越新,在选举算法中数据越新权重越大。

(3)Epoch:逻辑时钟

也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的,每投完一次票这个数据就会增加。

(4)Server状态:选举状态

LOOKING,竞选状态。

FOLLOWING,随从状态,同步leader状态,参与投票。

OBSERVING,观察状态,同步leader状态,不参与投票。

LEADING,领导者状态。

总结

(1)Zookeeper 选举会发生在服务器初始状态和运行状态下。

(2)初始状态下会根据服务器sid的编号对比,编号越大权值越大,投票过半数即可选出Leader。

(3)Leader 故障会触发新一轮选举,zxid 代表数据越新,权值也就越大。

(4)在运行期选举还可能会遇到脑裂的情况,大家可以自行学习。

ZooKeeper学习总结(4)——Zookeeper选举机制总结相关推荐

  1. ZooKeeper学习笔记(八):ZooKeeper集群写数据原理

    写数据原理 写流程直接请求发送给Leader节点 这里假设集群中有三个zookeeper服务端 ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种 ...

  2. zookeeper学习笔记之zk选举(二)

    目录 zookeeper选举机制 一.zk集群的角色与作用 二.zk集群选举核心概念与选举状态 三.zk集群发生时机与选举算法 四.zk集群三种模式 zookeeper选举机制 不对的地方欢迎指出! ...

  3. zookeeper的基本介绍及选举机制

    zookeeper zookeeper翻译成中文就是动物园管理员 非常形象,hadoop的图标是个大象,hive是个蜜蜂,pig是个猪 zookeeper就是管理这些动物的管理员,负责统筹这些框架 起 ...

  4. 循序渐进大数据组件之--【Zookeeper 03】进阶(选举机制以及ZBA协议)

    目录 一.选举机制 1.概述 2.选举信息包含: 3.比较原则: 二.ZAB协议 2.1.原子广播

  5. ZooKeeper学习第二期--ZooKeeper安装配置

    一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境: ■ 伪集群模式:就是在一台 ...

  6. ZooKeeper学习第一期---Zookeeper简单介绍(转)

    转载来源:https://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术--分布式协调技 ...

  7. ZooKeeper学习第一期---Zookeeper简单介绍

    引用:http://www.cnblogs.com/sunddenly/p/4033574.html 加入了一部分个人理解 一.传统分布式系统(主备) 如图1.1备节点定时ping主节点,返回Ack. ...

  8. 【转】ZooKeeper学习第二期--Zookeeper命令操作

    一.Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互.他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息.用户在客户端可以通过telnet或n ...

  9. ZooKeeper学习笔记五 ZooKeeper开源客户端ZkClient

    本文学习资源来自<从Paxos到ZooKeeper分布式一致性原理与实践> ZkClient ZkClient 在ZooKeeper原生API接口之上进行了封装,是一个更易用的ZooKee ...

  10. 【Zookeeper学习】Apache Zookeeper项目简介

    正在撰写,稍后来访-- 转载于:https://www.cnblogs.com/zhangningbo/p/4107373.html

最新文章

  1. 1毛钱的CDN你家的网站会用吗?
  2. 45岁的 SQL 语言要被淘汰了?
  3. XCode 10 升级问题总结
  4. java记录代码执行位置_记录执行的java代码的行号
  5. 关于Java交换两个对象的问题
  6. argv、lambda、filter、map、reduce
  7. 全球英文经典演讲100篇_日语演讲100问(1)即兴演讲不即兴!(理论篇)
  8. oracle取时间最近的一条数据_当数据库最近一直卡顿时,第一时间应该用这条sql来分析...
  9. 肉体之爱的解释圣经_可解释的AI的解释
  10. MP288MP280清零软件
  11. 动易html在线编辑器,动易系统解决IE8网站后台编辑器无效问题
  12. 操作系统:进程同步与互斥之生产者-消费者问题(含报告和源码)
  13. mac配置adb环境变量
  14. Ubuntu18.04-ROS-Python-通过周立功Can发送16进制整数
  15. python根须系统斜杠_尝试在Win10系统搭建esp32编译系统.下
  16. laravel 输出最后执行sql 附:whereIn用法
  17. java 自动点击网页_JS脚本实现网页自动秒杀点击
  18. 第三方软件测试z5x电池,vivo Z5x第三方续航测试结果公布,刷新手机业续航排行榜...
  19. FBReader源码详细分析 序言
  20. kubectl命令补全出错:kubectl ge-bash: _get_comp_words_by_ref: command not found

热门文章

  1. 二分法:木棒切割问题
  2. python爬虫多url_Python爬虫抓取多个URL写入本地文件
  3. python优先级排序_Python Numpy重新排列双向排序
  4. 以下哪些参数不是sqlmap中的_变频器控制中必须要设置哪些参数?
  5. html代码如何查看视频,Web前端
  6. php无限分类下载,php无限分类
  7. 区块链需要学习哪些东西_区块链主要学习哪些知识?
  8. java 创建进程_Linux下创建进程简介
  9. python聚类分析散点图_使用sklearn对iris数据集进行聚类分析
  10. game module 停止运行_详解流量复制解决方案--NGINX的ngx_http_mirror_module模块实现