准备跳槽必看的这道【Java面试题】:谈谈你对Zookeeper 选举原理的理解

简介: 一位工作了 7 年的程序员,最近在面试时被问到一个关于Zookeeper的问题。因为平时很少研究,所以面试的时候只能一直说:不知道,不知道,不知道。当时,他感觉很尴尬,面试还没结束,就已经知道应该被Pass了。于是又来问我,希望我能分享一期这样的视频。

一位工作了 7 年的程序员,最近在面试时被问到一个关于Zookeeper的问题。因为平时很少研究,所以面试的时候只能一直说:不知道,不知道,不知道。当时,他感觉很尴尬,面试还没结束,就已经知道应该被Pass了。于是又来问我,希望我能分享一期这样的视频。

那今天,我给大家分享一下我的理解。

另外,我把往期分享的视频全部整理成一份500页的PDF面试题解析配套文档,希望能够以此来提高各位粉丝的通过率,

ee90d9963df444db88b33d6e798a5b94.gif

如何获取? :

扫描文章底部名片领取!

1、什么是Leader选举

首先,Zookeeper 集群节点由三种角色组成,分别是:

image.png

Leader,负责所有事务请求的处理,以及过半提交的投票发起和决策。

Follower,负责接收客户端的非事务请求,而事务请求会转发给 Leader 节点来处理, 另外,Follower 节点还会参与 Leader 选举的投票。

Observer,负责接收客户端的非事务请求,事务请求会转发给 Leader 节点来处理,Observer 节点不参与任何投票,只是为了扩展 Zookeeper 集群来分担读操作的压力。

image.png


其次,Zookeeper 集群是一种典型的中心化架构,也就是会有一个 Leader 作为决策节点,专门负责事务请求的处理和数据的同步。这种架构的好处是可以减少集群架构里面数据同步的复杂度,集群管理会更加简单和稳定。

但是,会带来 Leader 选举的一个问题,也就是说,如果 Leader 节点宕机了,为了保证集群继续提供可靠的服务,Zookeeper 需要从剩下的 Follower 节点里面去选举一个新的节点作为Leader,也就是所谓的 Leader 选举。

image.png

2、选举原理

接下来,给大家介绍一下Zookeeper的选举原理。

首先呢,Zookeeper中的每一个节点都会向集群里面的其他节点发送一个票据 Vote,这个票据有三个属性。

epoch, 逻辑时钟,用来表示当前票据是否过期。

zxid,事务 id,表示当前节点最新存储的数据的事务编号

myid,服务器 id,在 myid 文件里面填写的数字。

每个节点都会选自己当 Leader,所以第一次投票的时候携带的是当前节点的信息。

接下来每个节点用收到的票据和自己节点的票据做比较,根据 epoch、zxid、myid的顺序逐一比较,以值最大的一方获胜。比较结束以后这个节点下次再投票的时候,发送的投票请求就是获胜的 Vote 信息。

image.png


然后,通过多轮投票以后,每个节点都会去统计当前达成一致的票据,以少数服从多数的方式,最终获得票据最多的节点成为 Leader。

最后我再补充一下,为什么要选择 epoch/zxid/myid 作为投票评判依据?我是这么

理解的。

首先,epoch ,因为网络通信延迟的可能性,有可能在新一轮的投票里面收到上一轮投票的票据,这种数据应该丢弃,否则会影响投票的结果和效率。

然后,zxid 越大,说明这个节点的数据越接近 leader,所以用 zxid 做判断条件是为了避免数据丢失的问题

最后,myid是服务器 id,这个是避免投票时间过长,直接用 myid 最大值作为快速终结投票的属性。

Leader 选举是一个比较复杂的问题,它涉及到集群节点的数据一致性算法。在很多中间件里面都有涉及到类似的问题,这个思想其实还是很有研究价值的。除此之外,还有 Paxos、raft、等一致性算法。

以上就是我对Zookeeper选举原理的理解。

最后,我把往期分享的面试题全部整理成了1份10W字的文档,希望能够以此来提高各位粉丝的通过

ee90d9963df444db88b33d6e798a5b94.gif

我是被编程耽误的文艺Tom,只弹干货不掺水!你们的支持就是我最大的动力!关注我,面试不再难!

相关文章
|
7月前
|
存储 缓存 Java
我们来详细讲一讲 Java NIO 底层原理
我是小假 期待与你的下一次相遇 ~
262 2
|
6月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
197 0
|
8月前
|
存储 缓存 Java
【高薪程序员必看】万字长文拆解Java并发编程!(5):深入理解JMM:Java内存模型的三大特性与volatile底层原理
JMM,Java Memory Model,Java内存模型,定义了主内存,工作内存,确保Java在不同平台上的正确运行主内存Main Memory:所有线程共享的内存区域,所有的变量都存储在主存中工作内存Working Memory:每个线程拥有自己的工作内存,用于保存变量的副本.线程执行过程中先将主内存中的变量读到工作内存中,对变量进行操作之后再将变量写入主内存,jvm概念说明主内存所有线程共享的内存区域,存储原始变量(堆内存中的对象实例和静态变量)工作内存。
265 0
|
7月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
502 58
|
6月前
|
人工智能 安全 Java
Go与Java泛型原理简介
本文介绍了Go与Java泛型的实现原理。Go通过单态化为不同类型生成函数副本,提升运行效率;而Java则采用类型擦除,将泛型转为Object类型处理,保持兼容性但牺牲部分类型安全。两种机制各有优劣,适用于不同场景。
230 24
|
7月前
|
XML JSON Java
Java 反射:从原理到实战的全面解析与应用指南
本文深度解析Java反射机制,从原理到实战应用全覆盖。首先讲解反射的概念与核心原理,包括类加载过程和`Class`对象的作用;接着详细分析反射的核心API用法,如`Class`、`Constructor`、`Method`和`Field`的操作方法;最后通过动态代理和注解驱动配置解析等实战场景,帮助读者掌握反射技术的实际应用。内容翔实,适合希望深入理解Java反射机制的开发者。
673 13
|
6月前
|
存储 缓存 安全
深入讲解 Java 并发编程核心原理与应用案例
本教程全面讲解Java并发编程,涵盖并发基础、线程安全、同步机制、并发工具类、线程池及实际应用案例,助你掌握多线程开发核心技术,提升程序性能与响应能力。
270 0
|
7月前
|
算法 Java 索引
说一说 Java 并发队列原理剖析
我是小假 期待与你的下一次相遇 ~
|
7月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
5114 1