终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会

2023-11-10

 号外号外!《死磕 Java 并发编程》系列连载中,大家可以关注一波:

「死磕 Java 并发编程05」阿里面试失败后,一气之下我图解了Java中18把锁

「死磕 Java 并发编程04」说说Java Atomic 原子类的实现原理

「死磕 Java 并发编程03」阿里二面,面试官:说说 Java CAS 原理?

「死磕 Java 并发编程02」面试官:说说什么是 Java 内存模型(JMM)?

「死磕 Java 并发编程01」10张图告诉你Java并发多线程那些破事

 

目录

人类选举的基本原理

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。

  • 遇强改投

在集群选举开始时,节点首先认为自己是最强的(即数据是最新的),然后在选票上写上自己的名字(包括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,领导者状态。

 

总结

另外我把大学和工作中用的经典电子书库(包含数据结构、操作系统、C++/C、网络经典、前端编程经典、Java相关、程序员认知、职场发展)、面试找工作的资料汇总都打包放在这了,这套资源可不是一般那种网上找的资源,是伴随我从学生一路到职场,非常宝贵!

已经打包好了,点击链接获取

最后总结一下zookeeper 的选举过程:

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

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

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

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

 

大家学会了吗?收藏等于白嫖,点赞才是真爱,雷小帅感谢大家~~~

作者:雷小帅

推荐一个Github 开源项目,『Java八股文』Java面试套路,领取 10G 免费学习资料,Java进阶学习,打破内卷拿大厂Offer,升职加薪!

作者简介:

☕读过几年书:华中科技大学硕士毕业;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会 的相关文章

  • 如何像java中的make一样程序化生成塞尔达传说

    我将如何用java制作程序生成的地图 游戏本身就像塞尔达传说是程序生成的 有帮助吗 不久前的 塞尔达传说 地图使用等距平铺视图 您需要做的第一件事是将等距图块集加载到您的程序中 我确信您可以找到塞尔达图块集 然后 您需要决定如何按程序生成地
  • 同步不经常更新的哈希图的最佳方式

    我有一个在应用程序中使用的 HashMap 数据是在应用程序初始加载期间从数据库填充的 然后它始终只是读取并且从不更新 会有多个线程不断地读取数据 由于数据永远不会更新 因此我们目前不使用任何同步 仅使用 HashMap 我们现在定义的方式
  • ModelMapper:匹配多个源属性层次结构

    我无法解决 modelMapper 错误 您知道问题出在哪里吗 注意 鉴于 java sql Time 没有无参构造函数 我没有找到比编写转换器更好的方法 org modelmapper ConfigurationException Mod
  • 如何使用蚂蚁?

    我一直试图了解 Ant 的用途 但我仍然不明白 有人可以给我一个使用 Ant 的用例吗 我可以尝试看看 Ant 为何有用以及我可以用它做什么 我在 Eclipse 中进行 Java 开发 并且刚刚开始使用 servlet 和 Google
  • LibGDX dispose() 方法应该如何使用?

    我很不清楚如何dispose LibGDX 框架中的方法有效并且应该使用 据我所知 当你不需要某种资源后 你必须进行处置以确保你的程序运行最佳 我正在开发一个移动应用程序 并且我有一个AssetManager在启动时在特殊指定的加载屏幕中加
  • 如何使用户输入与变量相关?

    我不知道如何准确地表达这个问题 但这就是我想要实现的目标 我正在使用堆栈实现河内塔插图 这是里面的main 功能 System out println Type the source pole number and the destinat
  • Android 中无网络、断线的情况如何处理?

    我有一个应用程序需要连接到 Internet 才能执行某些操作 但当没有可用的 Internet 时 它会崩溃 我读到 如果没有互联网 我需要使用 try catch 括号 我尝试使用它 正如您在 AsyncTask 中看到的那样 但它不起
  • Android 2.x 天城文 unicode 问题

    我正在尝试使用以下代码支持 android 2 x 的梵文字体 即使 android 2 x 无法渲染梵文字体 除了 raswa 和 dirga 存在一些问题之外 代码工作正常 是否有可能在 android 2 x 中获得正确的梵文表示形式
  • 如何使用 Rally 的 JAVA API 将标签添加到 Rally 中的测试用例?

    我一直在努力向 Rally 中的测试用例添加标签 该标签已存在于 Tags 集合中 但我无法将其添加到测试用例中 有人可以提供一个关于如何执行此操作的示例吗 多谢 下面是如何执行此操作的示例 该示例显示了向现有测试用例添加标签 以及创建新测
  • 使用 Google Guava 进行不区分大小写的排序

    目前 我在两个不同的地方使用以下两段代码来创建一个排序的 不可变的列表 return Ordering natural immutableSortedCopy iterable and return Ordering usingToStri
  • 关键词是真还是假?

    Are true and falseJava 中的关键字 这是完整的列表Java 语言关键字 http java sun com docs books tutorial java nutsandbolts keywords html 特别要
  • 如何保护 Hibernate QBE 查询的安全

    目前 我知道四种使用 hibernate 进行事务处理的方式 使用对象 使用HQL 使用特定于数据库的 SQL 使用标准 QBE 好吧 关于它们对注射的抵抗力有多强 我认为是这些 如果我错了 请纠正我 安全 因为内部 SQL 调用是参数化的
  • 通过两个标准比较两个对象[重复]

    这个问题在这里已经有答案了 我有一个包含布尔字段的类用户 我想对用户列表进行排序 我希望布尔字段等于 true 的用户位于列表的顶部 并且我想按名称对它们进行排序 这是我的课程 public class User int id String
  • 查看两个对象是否具有相同的类型

    假设我有一个类 A 并且 B C D 都是从 A 派生的 如果我想知道引用的对象的类型是什么 我可以声明 pseudo code if obj instanceof B lt is B gt else if obj instanceof C
  • jsoup 的奇怪编码行为

    我用jsoup从不同页面的html源代码中提取一些信息 大多数都是UTF 8编码的 其中一个是用 ISO 8859 1 编码的 这会导致一个奇怪的错误 在我看来 包含错误的页面是 http www gudi ch armbanduhr me
  • 无法解析符号“servlet”

    我有一个新手大问题 当我尝试以下操作时 servlet 变成红色并指示 无法解析符号 servlet import javax servlet http import javax servlet ServletException 我的 ap
  • 在java中获取调用层次结构

    我在追踪错误时遇到了很大的困难 了解哪个方法调用了某个方法会很有帮助 有没有一种简单的方法可以从java获取调用层次结构 Java 是应用程序的一小部分 因此我无法在 eclipse net beans 中编译和运行整个应用程序 因此我无法
  • 我想在Java中使用关于随机索引的索引

    我使用Java 当我在Java中使用ArrayList时 如果我随机访问索引号 这可能吗 如果这是不可能的 我应该怎么做 例如 ArrayList
  • 重写方法的返回类型可以不同吗?

    重写方法可以有不同的返回类型 Java supports covariant return types for overridden methods This means an overridden method may have a mo
  • Spring MVC 中拦截器和过滤器的区别

    我有点困惑Filter and Interceptor目的 据我从文档中了解到 Interceptor在请求之间运行 另一方面Filter在渲染视图之前运行 但在控制器渲染响应之后运行 那么两者的区别在哪里postHandle 在拦截器和d

随机推荐

  • MYSQL HTTP头部注入

    HTTP头部基础 Accept 浏览器能够处理的内容类型 Accept Charset 浏览器能够显示的字符集 Accept Encoding 浏览器能处理的压缩编码 Accept Language 浏览器当前设置的语言 Connectio
  • Hyper-V 的用途与安装

    什么是 Hyper V Hyper V是微软提出的一种系统管理程序虚拟化技术 能够实现桌面虚拟化 WSL2 和 WSA 与 Hyper V 的关系 Hyper V其实分两个部分 底层的虚拟机平台 上层的虚拟机管理软件 以前的Windows版
  • 2023华为OD机试真题Python实现【动态规划/找出重复代码】

    题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码
  • 两个日期选择器的联动

    让两个独立的日期选择器产生联动 我这里用的是elmentUI的 DatePicker日期选择器 效果展示 方案1
  • Linux下的dd命令

    简介 dd命令是Linux下的一个重要的磁盘操作命令 它的主要作用是备份和复制磁盘 dd的语法是 dd if 输入文件的名称 of 输出文件的名称 参数 值 if 输入文件的名称 指定输入文件的名称 可以是文件 设备 目录等 of 输出文件
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】流水线

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 流水线 知识点数组队列编程基础 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 一个工厂有m条流水线 来并行完成n个独立的作业 该工厂设置了一个调度系统 在安排作业时
  • aso优化师是什么_aso是什么意思 aso优化师是啥

    aso是什么意思 aso优化师是啥 年已过完 要收心工作学习了 今天李鑫自媒体就从头过滤一下aso方面的知识 用文字总结表述出来 加深自己理解的同时也帮助一些新手小伙伴了解aso aso是什么意思 ASO是App store Optimiz
  • element 的 this.$message( ) 消息提示实现

    在vue项目中 直接通过js代码 this message 就可以调出消息提示组件 这是如何实现的呢 主要分为以下几步 1 用 Vue extend 创建组件的模板 构造函数 2 创建一个函数 在函数内部 实例化组件并进行挂载到相应元素上
  • 【开发记录01】开发环境副本/页的导入&带用户权限管理系统

    在蒋老师的指导下大概了解了 1 开发环境的数据导入 导出 共享组件的同步 因为应用程序277是应用程序100的子程序 所以共享组件必须和100保持一致 但是会出现一个小问题 在APEX开发过程中同时打开两个不同的应用程序 但是编辑过程中经常
  • CVE-2017-12149

    春秋云镜 CVE 2017 12149 JBoss反序列化漏洞 靶标介绍 2017年8月30日 厂商Redhat发布了一个JBOSSAS 5 x 的反序列化远程代码执行漏洞通告 该漏洞位于JBoss的HttpInvoker组件中的 Read
  • 【教程】Github快速学习

    教程 Github快速学习 备注 一 Git基础 1 安装 2 git原理 3 基本配置 4 Gitignore 二 Git分支 1 基础命令 三 学习Github Github Docs官方文档 gt Github漫游指南 gt 开源指北
  • 毕业设计-基于大数据技术的旅游推荐系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • 大数据常用采集工具

    1 Flume Flume作为Hadoop的组件 是由Cloudera专门研发的分布式日志收集系统 尤其近几年随着Flume的不断完善 用户在开发过程中使用的便利性得到很大的改善 Flume现已成为Apache Top项目之一 Flume提
  • [转]一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)

    一文读懂PID控制算法 抛弃公式 从原理上真正理解PID控制 PID控制应该算是应用非常广泛的控制算法了 小到控制一个元件的温度 大到控制无人机的飞行姿态和飞行速度等等 都可以使用PID控制 这里我们从原理上来理解PID控制 PID pro
  • AcWing 1603. 整数集合划分

    给定一个包含 N 个正整数的集合 请你将它们划分为两个不相交的集合 A1 和 A2 其中 A1 包含 n1 个元素 A2 包含 n2 个元素 用 S1 表示集合 A1 内所有元素之和 S2 表示集合 A2 内所有元素之和 请你妥善划分 使得
  • 前端技术栈

    https juejin cn post 7036581158670303240 做了一份前端面试复习计划 保熟 掘金 1 Vue和React的区别 Vue和React的比较 布里渊区 CSDN博客 2 CI CD 做了哪些实践 什么是 C
  • LASlib 读写点云

    一 参考链接 1 LASlib LAStools 2 LASlib库将PCL库点云类型数据转换为las格式保存 3 las数据转 pcd并显示 las格式详解 1 孙爱怡 王健 LAS格式的解析与转换 J 全球定位系统 2016 41 02
  • 分布式搜索elasticsearch高级配置之(二)------线程池设置

    原文 http blog csdn net laigood article details 7943630 一个Elasticsearch节点会有多个线程池 但重要的是下面四个 索引 index 主要是索引数据和删除数据操作 默认是cach
  • Tensorrt下的Yolox部署

    这里写目录标题 一 Ubuntu系统的安装与显卡驱动安装 二 Tensorrt的安装 三 YOLOX的安装 四 torch2trt的安装 五 engine文件的准备 根据设备修改源文件 引擎生成 六 运行demo 先改一下CMakeList
  • 终于搞懂了,用大白话给你解释Zookeeper的选举机制,包教会

    号外号外 死磕 Java 并发编程 系列连载中 大家可以关注一波 死磕 Java 并发编程05 阿里面试失败后 一气之下我图解了Java中18把锁 死磕 Java 并发编程04 说说Java Atomic 原子类的实现原理 死磕 Java