蚂蚁面试官:Zookeeper 的选举流程是怎样的?我当场懵逼了

news2024/9/9 5:31:55

编辑切换为居中

添加图片注释,不超过 140 字(可选)

面试经常会遇到面试官问 Zookeeper 的选举原理,我心想,问这些有啥用吗?又不要我造火箭!

每次面试也只知道个大概,并没有深究具体的流程,所以在面试的时候总是不能打动面试官,总是特别吃亏,所以这篇就总结一下其中的要点,也希望能帮助大家搞定面试。

有一说一, Zookeeper 这些工作原理、选举流程,也许大多数人在工作中不会用到,但了解多一点也是自己的优势,避免求职面试被面试官打压工资。Zookeeper 也是现在后端主流的分布式协调框架,很多热门框架都有直接或者间接依赖它,比如:Dubbo、Elastic Job、Kafka 等,所以掌握 ZK 选举流程也是非常有必要的。

本文会以通俗易懂的方式进行, ZK 小白也能看懂。另外,我也将 Zookeeper 系列主流面试题和参考答案都整理好了,关注公众号愿天堂没有BUG回复关键字 "面试" 进行刷题。

基本概念

了解选举前你得了解一些 Zookeeper 的基本概念。

集群机器 ID

集群机器 ID 是指 myid,它是每一个集群机器中的编号文件,代表 ZooKeeper 集群服务器的标识,手动生成,全局全一。

事务 ID

事务 ID 是指 zxid,Zookeeper 会给每个更新请求分配一个事务 ID,它是一个 64 位的数字,由 Leader 统一进行分配,全局唯一,不断递增,在一个节点的状态信息中可以查看到最新的事务 ID 信息。

集群服务器角色

Zookeeper 集群服务器有以下 3 种角色:

1、Leader(主)

2、Follower(从,参与投票)

3、Observer(观察者,不参与投票)

集群服务器状态

Zookeeper 集群服务器有以下 4 种状态:

1、LOOKING

寻找 Leader 状态,当服务器处于该状态时,表示当前集群没有 Leader,因此会进入 Leader 选举状态。

2、FOLLOWING

跟随者状态,表示当前服务器角色是 Follower。

3、LEADING

领导者状态,表示当前服务器角色是 Leader。

4、OBSERVING

观察者状态,表示当前服务器角色是 Observer。

选举方式

Zookeeper 提供了 3 种选举方式:

  • LeaderElection

  • AuthFastLeaderElection

  • FastLeaderElection (最新默认)

选举场景

Zookeeper 会在以下场景进行选举:

1、Zookeeper 集群启动初始化时进行选举

2、Zookeeper 集群 Leader 失联时重新选举

选举前提条件

1、Zookeeper 服务器处于 LOOKING 竞选状态

此时说明 Zookeeper 服务器集群处于群龙无首状态,另外,观察者状态不能参与竞选投票。

2、Zookeeper 集群规模至少要 3 台机器或以上

集群规则为:2N + 1台,N > 0,即最少需要 3 台,因为 ZK 集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在 ZK 节点挂得太多,只剩一半或不到一半节点能工作时,集群才会失效。

如以下分析所示:

3 个节点的 Cluster 可以挂掉 1 个节点(Leader 可以得到 2 票 > 1.5) 2 个节点的 Cluster 就不能挂掉任何 1 个节点了(Leader 可以得到 1 票 <= 1)

所以你知道 ZK 集群为什么至少要 3 忘了吧?

3、Zookeeper 集群要 2 台及以上机器可以互相通信

只要达到 2 台服务器通信了才能进行选举,只有一台服务器启动时无法进行选举,因为服务器之间通信了才可以互相同步投票结果。

选举流程

1、集群初始选举

Zookeeper 在集群启动时会进行选举,这里拿 3 台服务器进行举例:

servermyidzxidzk110zk220zk330

依次启动 3 台服务器 zk1, zk2, zk3,初始情况下事务 ID 都为 0。

选举大致流程:

1、初始投票

服务器启动后,每个 Server 都会给自己投上一票,每次投票会包含所投票服务器的 myid 和 zxid,这里使用 Server(myid, zxid)的方式表示,此时的投票结果为:zk1(1, 0),zk2(2, 0),zk3(3, 0)

2、同步投票结果

集群中的服务器在投票后,会将各自的投票结果同步给集群中其他服务器。

3、检查投票有效性

各服务器在收到投票后会检查投票的有效性,如:是否本轮投票,是否来自 LOOKING 状态的服务器的投票等。

4、处理投票

服务器之间会进行投票比对,规则如下:

  • 优先检查 zxid,较大的服务器优先作为 Leader

  • 如果 zxid 相同,则 myid 较大的服务器作为 Leader

如:zk1 和 zk2 进行比对,此时 zk2 胜出,zk1 更新自己的投票为:zk1(2, 0)

5、统计投票结果

每轮投票比对之后都会统计投票结果,确认是否有超过半数的机器都得到相同的投票结果,如果是,则选出 Leader,否则继续投票。

本轮选举中,zk1 和 zk2 都得到了相同的投票结果(2, 0),2 致 zk2,并且超过了半数的机器(2 > 3 / 2),所以此时 zk2 就成为了本轮选举的 Leader。

所以,即使 zk3 启动了,因为集群已经有了 Leader,所以选举也结束了,zk3 不再参与选举,后面进来的都是小弟。

6、更改服务器状态

一旦选出 Leader,每个服务器就会各自更新自己的状态:

 
 

zk1 >>> FOLLOWING zk2 >>> LEADING Zk3 >>> FOLLOWING

2、集群重新选举

Zookeeper 集群运行期间无法和 Leader 保持正常连接时,即如果 Leader 挂了,或者 Leader 服务器故障都会进行新一轮的 Leader 选举。

这里还是拿 3 台服务器进行举例:

servermyidzxidzk1(Follower)10zk2(Leader)20zk3(Follower)30

如果作为初始选举的 Leader zk2 挂了,集群就会暂停对外提供服务,从而进行新的 Leader 选举。

选举大致过程:

1、状态变更

既然过去的老大 Leader 不可用了,那所有的 Follower 服务器就需要从 FOLLOWING 状态变更为:LOOKING,开始新的一轮 Leader 选举。

2、开始投票

投票逻辑和启动初始时一致。

zk1, zk3 第一轮投票默认还是会先投给自己,zk2 挂了不能进行投票。

第一轮投票结果为:zk1(1, 66)、zk3(3, 28),zk1 和 zk3 各得一票,这里假设 zk1 事务 ID 比 zk3 更大一点。

3、同步投票结果

同步投票逻辑和启动初始时一致。

4、检查投票有效性

检查投票逻辑和启动初始时一致。

5、处理投票

处理投票逻辑和启动初始时一致。

此时 zk1 和 zk3 进行比对,根据规则,由于 zk1 的事务 ID 更大一点,所以 zk1 胜出,zk3 也更新自己的投票为:zk3(1, 28)

6、统计投票结果

统计投票逻辑和启动初始时一致。

本轮选举中,zk1 和 zk3 都得到了相同的投票结果 zk1,并且超过了半数的机器(2 > 3 / 2),所以此时 zk1 就成为了本轮选举的 Leader。

7、更改服务器状态

更改状态逻辑和启动初始时一致。

总结

所以,我们可以总结下,Zookeeper 集群按 myid 从小到大依次启动初始化时,在超过半数机器的投票的情况下,谁的 myid 最后,谁就是 Leader,知道这个定律,不同的集群规模我们都可以推算出谁是 Leader。

集群初始化时:

1)集群有 3 台机器,第 2 大的 myid 所在服务器就是 Leader;

2)集群有 4 台机器,第 3 大的 myid 所在服务器就是 Leader;

3)集群有 5 台机器,第 3 大的 myid 所在服务器就是 Leader;

3)集群有 6 台机器,第 4 大的 myid 所在服务器就是 Leader;

.....

集群重新选举时,根据 myid 和 zxid 的大小共同决断,zxid 更大的优先成为 Leader。

总之,谁得到半数以上的服务器支持,谁就是老大,Zookeeper 选举流程你看懂了吗?这只是粗略版的选举流程,实际选举过程要更复杂,有兴趣的可以深入研究下源码。

                                    资源获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

 精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式电源接入对配电网影响的研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

vue3 + element 从0到1搭建前端基础框架

一、框架搭建 框架代码 个人博客 往往从0到1开发项目时发觉无从下手&#xff0c;或者很可能一步一个坑&#xff0c;因为大多基础框架公司已经搭建完毕的&#xff0c;新加入的成员也都是在此基础上进行功能模块的拓展。网上也鲜有详尽的全流程参考&#xff0c;多是某个局部功能的…

【Vue】webpack的基本使用

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录webpack的学习目标前端工程化 小白眼中的前端开发 vs 实际的前端开发 什么是前端工程…

CISP考试大纲/范围

CISP考试主要是考CISP知识体系大纲&#xff0c;分别为信息安全保障、信息安全技术、信息安全管理、信息安全工程和信息安全标准法规这五大知识类&#xff0c;每个知识类根据其逻辑划分为多个知识体&#xff0c;每个知识体包含多个知识域&#xff0c;每个知识域由一个或多个知识…

Java项目:SSM失物招领管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 主要功能包括&#xff1a; 用户发布失物&#xff0c;或者招领失物&#xff0c;管理员对用户&#xff0c;失物信息进行增删改查。 环境需要 1…

新课程教学杂志新课程教学杂志社新课程教学编辑部2022年第19期目录

核心素养 核心素养视域下的历史教学设计——以“清朝君主专制的强化”为例 王威; 1-3 新中考背景下文本分析能力与核心素养的培育 黄嫄; 4-5《新课程教学》投稿&#xff1a;cn7kantougao163.com 基于核心素养的物理教学评价改良 李红; 6-7 初中语文综合性学习的…

Metabase学习教程:系统管理-6

Metabase可扩展性 扩展Metabase以支持更多人和数据库的最佳实践。 Metabase是一个可扩展的、经过实战的软件&#xff0c;被成千上万的公司用来提供高质量的自助服务分析。它通过水平扩展支持高可用性&#xff0c;而且它是开箱即用的高效工具&#xff1a;一台拥有4gb内存的单核…

vue.js axios 数据不刷新

getServerList(){axios.get(/server/showList).then(function(response){this.servers response.data // 不刷新console.log(response.data)}).catch(function (error) {console.log(error);}); } 打印this&#xff1a;this不是vue对象修改为&#xff1a;getServerList(){axi…

Mysql各种缓冲区的功能及之间的联系

buffer poolmysql数据存放在磁盘里面&#xff0c;如果每次查询都直接从磁盘里面查询&#xff0c;会影响性能&#xff0c;因此需要内存态缓存池。另外缓存池的淘汰机制不是基础LRU&#xff0c;而是是改进版LRU&#xff0c;防止大量临时缓存挤出热点数据。buffer pool读缓存分为老…

代码随想录算法训练营第五十三天| LeetCode1143. 最长公共子序列、LeetCode1035. 不相交的线、LeetCode53. 最大子数组和

一、LeetCode1143. 最长公共子序列 1&#xff1a;题目描述&#xff08;1143. 最长公共子序列&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一…

Leetcode 1687. 从仓库到码头运输箱子 [四种解法] 动态规划 从朴素出发详细剖析优化步骤

你有一辆货运卡车&#xff0c;你需要用这一辆车把一些箱子从仓库运送到码头。这辆卡车每次运输有 箱子数目的限制 和 总重量的限制 。给你一个箱子数组 boxes 和三个整数 portsCount, maxBoxes 和 maxWeight &#xff0c;其中 boxes[i] [ports​​i​, weighti] 。ports​​i …

网页制作课作业基于HTML+CSS+JavaScript+jquery仿慕课网教学培训网站设计实例 企业网站制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

【强化学习论文】离线元强化学习中基于对比学习的稳定表示

离线元强化学习中基于对比学习的稳定表示 最近几年来深度强化学习在算法上有很多进展&#xff0c;已初步用在很多场景中。目前深度强化学习有两个重要的问题&#xff1a;数据利用问题&#xff0c;泛化能力。深度强化学习通常要与环境进行大量的交互&#xff0c;通常效率较低&am…

Redis数据库 ---- 五种数据类型常用命令汇总

❤️ 作者简介&#xff1a;大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生&#xff0c;蓝桥杯国赛二等奖获得者&#x1f41f; 个人主页 &#xff1a;https://blog.csdn.net/qq_52007481⭐ 个人社区&#xff1a;【小鱼干爱编程】 文章目录RedisRedis键(key)数据库相关…

Java面向对象:对象的概念及面向对象的三个基本特征

面向对象简称 OO&#xff08;Object Oriented&#xff09;&#xff0c;20 世纪 80 年代以后&#xff0c;有了面向对象分析&#xff08;OOA&#xff09;、 面向对象设计&#xff08;OOD&#xff09;、面向对象程序设计&#xff08;OOP&#xff09;等新的系统开发方式模型的研究。…

element-ui 中 el-tree 和 el-table 样式调整

使用 el-tree 和 el-table 时&#xff0c;往往需要根据项目整体环境做一些样式调整&#xff0c;记录一下常用样式。 el-tree <!-- 树结构 --> <el-treeref"tree":data"data":props"defaultProps":default-expand-all"isExpanded&…

51单片机烟雾报警器mq2烟雾报警ADC0832采集实践制作DIY- GC0026-烟雾报警器

一、功能说明&#xff1a; 基于51单片机设计-烟雾报警器 功能介绍&#xff1a; STC89C52单片机&#xff08;AT89C51/52&#xff09;lcd1602adc0832mq2烟雾传感器蜂鸣器2个按键设定报警阈值 1.通过ADC0832采集MQ2烟雾输出的电压换算位烟雾浓度0~100 2.如果烟雾浓度超过设定…

机器学习9衡量线性回归法的指标,MSE,RMS,MAE

文章目录一、衡量线性回归法的指标&#xff0c;MSE,RMS,MAE1、MSE均方误差&#xff08;Mean Squared Error&#xff09;2、RSE均方误差&#xff08;Root Mean Squared Error&#xff09;3、平均绝对误差MAE&#xff08;Mean Absolute Error&#xff09;二、演示&#xff1a;三、…

清华、北大、中科大、UMA、MSU五位博士生畅聊深度学习理论

点击蓝字关注我们AI TIME欢迎每一位AI爱好者的加入&#xff01;伴随着深度学习的蓬勃发展&#xff0c;进入人们视线的好像都是算法或AlphaGo等应用层面的东西。但是在理论上&#xff0c;深度学习似乎却没有很出圈的相关理论。因此&#xff0c;部分人也在批评深度学习是缺乏理论…

易基因课程回顾|表观遗传学和表观育种在品种改良中的应用研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 传统作物育种包括杂交、选择所需性状的遗传变异&#xff0c;导致遗传基础缩窄和遗传多样性缺失&#xff0c;从而阻碍作物改良。表型性状受遗传学和表观遗传学影响&#xff0c;利用表观遗传…