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

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 面试经常会遇到面试官问 Zookeeper 的选举原理,我心想,问这些有啥用吗?又不要我造火箭!每次面试也只知道个大概,并没有深究具体的流程,所以在面试的时候总是不能打动面试官,总是特别吃亏,所以这篇就总结一下其中的要点,也希望能帮助大家搞定面试。有一说一, Zookeeper 这些工作原理、选举流程,也许大多数人在工作中不会用到,但了解多一点也是自己的优势,避免求职面试被面试官打压工资。Zookeeper 也是现在后端主流的分布式协调框架,很多热门框架都有直接或者间接依赖它,比如:Dubbo、Elastic Job、Kafka 等,所以掌握 ZK 选举流程也是非常有必要的。

网络异常,图片无法展示
|

面试经常会遇到面试官问 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 选举流程你看懂了吗?这只是粗略版的选举流程,实际选举过程要更复杂,有兴趣的可以深入研究下源码。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
27天前
|
算法 测试技术 持续交付
面试的流程,面试的重点
本文介绍了面试流程及各轮面试的重点。通常面试为1-5轮,首轮关注技术实力与项目经验,次轮深入考察技术细节,第三轮侧重项目协调、创新及价值观等软性问题,如职业规划和沟通能力。面试题分为开放型(如项目经验、解决问题思路)和非开放型(如技术细节、手撕算法),需提前准备。测试类问题涉及自动化测试、持续集成等实际应用。
|
5月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
3月前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
104 6
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
3月前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
36 3
|
3月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
32 2
|
3月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
3月前
|
关系型数据库 MySQL Java
DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)
尼恩,一位40岁的资深架构师,分享了其读者群中关于DDD(领域驱动设计)的面试题及解答,涵盖DDD架构落地、微服务拆分、聚合与MySQL表的对应关系等内容。尼恩通过系统化的梳理,帮助读者在面试中展现强大的技术实力,让面试官印象深刻。此外,他还提供了《尼恩Java面试宝典》等多本技术圣经PDF,助力读者提升架构、设计和开发水平。关注【技术自由圈】公众号,获取更多资源。
DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)
|
4月前
|
运维 测试技术
拆分软件测试流程,一张图秒杀所有面试
本文主要介绍了软件测试流程的核心内容,包括需求分析、测试用例编写、测试执行、缺陷提交及回归测试等关键步骤。以迭代测试为例,详细说明了每个环节的具体操作和注意事项,并提供了一张测试流程图以便理解。测试流程确保了软件质量,是面试中常见的考察点。
109 7
拆分软件测试流程,一张图秒杀所有面试
|
3月前
|
分布式计算 负载均衡 算法
Hadoop-31 ZooKeeper 内部原理 简述Leader选举 ZAB协议 一致性
Hadoop-31 ZooKeeper 内部原理 简述Leader选举 ZAB协议 一致性
43 1