Zookeeper的选举机制详解
本文来说下Zookeeper的选举机制
文章目录
- 概述
- 人类选举的基本原理
- Zookeeper选举的基本原理
- 什么场景下 Zookeeper 需要选举
- 启动时期的 Leader 选举
- 运行时期的Leader选举
- 选举机制中涉及到的核心概念
- 本文总结
概述
Zookeeper 是一个分布式服务框架,主要是用来解决分布式应用中遇到的一些数据管理问题如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
我们可以简单把 Zookeeper 理解为分布式家庭的大管家,那么管家团队是如何选出Leader的呢?好奇吗,接下来带领大家一探究竟。
人类选举的基本原理
讲解 Zookeeper 选举过程前先来介绍一下我们实际生活中的选举。我们每个人或多或少都经历过几次选举,在投票的过程中可能会遇到这样几种情况:
情况1:自己与几个候选人都比较熟,你会将票投给你认为能力比较强的人;
情况2:自己也是候选人,并且与其他几个候选人都不熟,这个时候你肯定想着要去拉票,因为觉得自己才是最厉害的人呀,所有人都应该把票投给我。但是遗憾的是在拉票的过程中,你发现别人比你强,你开始自卑了,最终还是把票投给了自己认为最强的人。
所有人都投完票之后,最后从投票箱中进行统计,获得票数最多的人当选。
在整个投票过程中我们可以提炼出四个最核心的概念:
- 候选人能力:投票的基本原则是选最强的人。
- 遇强改投:如果后面发现更强的人可以改投票。
- 投票箱:所有人的票都会放在投票箱。
- 领导者:得票最多的人即为领导者。
从人类选举的原理我们来简单推导一下Zookeeper的选举原理。
Zookeeper选举的基本原理
注意如果 Zookeeper 是单机部署是不需要选举的,集群模式下才需要选举。
Zookeeper 的选举原理和人类选举的逻辑类似,套用一下人类选举的四个基本概念详细解释一下Zookeeper。
个人能力
如何衡量 Zookeeper 节点个人能力?答案是靠数据是否够新,如果节点的数据越新就代表这个节点的个人能力越强,是不是感觉很奇怪,就是这么定的!
在 Zookeeper 中通常是以事务id(后面简称zxid)来标识数据的新旧程度(版本),节点最新的zxid越大代表这个节点的数据越新,也就代表这个节点能力越强。
zxid 的全称是 ZooKeeper Transaction Id,即 Zookeeper 事务id。
遇强改投
在集群选举开始时,节点首先认为自己是最强的(即数据是最新的),然后在选票上写上自己的名字(包括zxid和sid),zxid 是事务id,sid 唯一标识自己。
紧接着会将选票传递给其他节点,同时自己也会接收其他节点传过来的选票。每个节点接收到选票后会做比较,这个人是不是比我强(zxid比我大),如果比较强,那我就需要改票,明明别人比我强,我也不能厚着脸皮对吧。
投票箱
与人类选举投票箱稍微有点不一样,Zookeeper 集群会在每个节点的内存中维护一个投票箱。节点会将自己的选票以及其他节点的选票都放在这个投票箱中。由于选票是互相传阅的,所以最终每个节点投票箱中的选票会是一样的。
领导者
在投票的过程中会去统计是否有超过一半的选票和自己选择的是同一个节点,即都认为某个节点是最强的。一旦集群中有超过半数的节点都认为某个节点最强,那该节点就是领导者了,投票也宣告结束。
什么场景下 Zookeeper 需要选举
当 Zookeeper 集群中的一台服务器出现以下两种情况之一时,需要进入 Leader 选举。
- 服务器初始化启动。
- 服务器运行期间 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 故障后,余下的非 Observer 服务器都会将自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程。
- 每个Server会发出投票。
- 接收来自各个服务器的投票,如果其他服务器的数据比自己的新会改投票。
- 处理和统计投票,每一轮投票结束后都会统计投票,超过半数即可当选。
- 改变服务器的状态,宣布当选。
话不多说先来一张图:
- 第一次投票,每台机器都会将票投给自己。
- 接着每台机器都会将自己的投票发给其他机器,如果发现其他机器的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:寻找Leader 状态。当服务器处于该状态时会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。
- FOLLOWING:跟随者状态。处理客户端的非事务请求,转发事务请求给 Leader 服务器,参与事务请求 Proposal(提议) 的投票,参与 Leader 选举投票。
- LEADING:领导者状态。事务请求的唯一调度和处理者,保证集群事务处理的顺序性,集群内部个服务器的调度者(管理follower,数据同步)。
- OBSERVING:观察者状态。3.0 版本以后引入的一个服务器角色,在不影响集群事务处理能力的基础上提升集群的非事务处理能力,处理客户端的非事务请求,转发事务请求给 Leader 服务器,不参与任何形式的投票。
本文总结
(1)Zookeeper 选举会发生在服务器初始状态和运行状态下。
(2)初始状态下会根据服务器sid的编号对比,编号越大权值越大,投票过半数即可选出Leader。
(3)Leader 故障会触发新一轮选举,zxid 代表数据越新,权值也就越大。
(4)在运行期选举还可能会遇到脑裂的情况,大家可以自行学习。
Zookeeper的选举机制详解相关推荐
- OSPF中DR选举机制详解
OSPF中DR选举机制详解--对于这方面不太清楚的可以看看附件 转载于:https://blog.51cto.com/gauyanm/226882
- zookeeper的Leader选举机制详解
转载自:https://www.toutiao.com/i6701570306445672963/?tt_from=copy_link&utm_campaign=client_share&am ...
- Zookeeper之Watcher机制详解
概念 Zookeeper提供了数据的发布/订阅功能.多个订阅者可监听某一特定主题对象(节点).当主题对象发生改变(数据内容改变,被删除等),会实时通知所有订阅者. Zookeeper采用了Watche ...
- Zookeeper客户端Curator使用详解
http://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 简介 Curator是Netflix公司开源的一套zookeeper客户端框 ...
- Dubbo 原理和机制详解
Dubbo 是一款Java RPC框架,致力于提供高性能的 RPC 远程服务调用方案.作为主流的微服务框架之一,Dubbo 为开发人员带来了非常多的便利. 1. Dubbo核心功能 Dubbo主要提供 ...
- PHP autoload机制详解
PHP autoload机制详解 转载自 jeakccc PHP autoload机制详解 (1) autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个 ...
- 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配
先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...
- Java类加载机制详解【java面试题】
Java类加载机制详解[java面试题] (1)问题分析: Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数 ...
- Numpy的广播机制详解(broadcasting)
Numpy的广播机制详解(broadcasting) 广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数 ...
最新文章
- 编译u-boot时候,make distclean 出现rm:无法删除,****是一个目录
- 学习笔记68—PhotoShop常见快捷键
- Swift傻傻分不清楚系列(七)控制流
- python-list:列表-元组-字符串
- 自动登录360,百度
- mso-number-format
- WSUS客户端无法发现
- 有赞零售财务中台架构设计与实践
- 马斯克与SEC再次达成和解协议 未被罚款也未被削权
- swift(不同设备适配详解)
- JavaScript菜鸽子基础知识总结(一)
- wpf 切换搜狗输入法英文_搜狗输入法使用技巧整理,建议保存收藏
- C#中的DataGridView
- 关于安卓设备更改和烧录IMEI的图文教程
- 局域网在线计算机扫描仪,局域网内也共享扫描仪
- python 数组去重的方法
- oracle expdp parallel,关于EXPDP中的PARALLEL参数
- Rstudio永久修改当前工作路径
- 4x root 红米_小米红米Note4X获取root权限教程
- 河南省软考报名时间成绩查询河南省教育考试院河南省人事考试网报名入口
热门文章
- 2017 3月21日,下午
- CCNA学习总结—OSPF协议—OSPF协议原理
- Spring MVC 教程,快速入门,深入分析【转】
- XML NameSpace
- CentOS下调整VolGroup-lv_root分区大小
- dubbo简易实现_分别利用自定义的注册中心和zookeeper
- Spring Boot flyway的启动时机比较早
- Array.prototype.slice.call()方法详解
- 疯狂的ASP.NET系列-第一篇:啥是ASP.NET
- 注册表只改一个值 马上加快宽带上网速度