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

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

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

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

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

基本概念


了解选举前你得了解一些 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 台服务器进行举例:

| server | myid | zxid |

| — | — | — |

| zk1 | 1 | 0 |

| zk2 | 2 | 0 |

| zk3 | 3 | 0 |

依次启动 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

分享

1、算法大厂——字节跳动面试题

2、2000页互联网Java面试题大全

3、高阶必备,算法学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
9)]

3、高阶必备,算法学习

[外链图片转存中…(img-wqkx1Fy1-1713549023180)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-btORZaxg-1713549023180)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值