JAVA面试——Zookeeper

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: JAVA面试——Zookeeper

11.1.1. Zookeeper 概念

Zookeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等。

Zookeeper 提供了一个类似于 Linux 文件系统的树形结构(可认为是轻量级的内存文件系统,但

只适合存少量信息,完全不适合存储大量文件或者大文件),同时提供了对于每个节点的监控与

通知机制。

11.1.1. Zookeeper 角色

Zookeeper 集群是一个基于主从复制的高可用集群,每个服务器承担如下三种角色中的一种

11.1.1.1. Leader

1. 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader,它会发起并维护与各 Follwer

及 Observer 间的心跳。

2. 所有的写操作必须要通过 Leader 完成再由 Leader 将写操作广播给其它服务器只要有超过

半数节点(不包括 observeer 节点)写入成功,该写请求就会被提交(类 2PC 协议)。

11.1.1.2. Follower

1. 一个 Zookeeper 集群可能同时存在多个 Follower,它会响应 Leader 的心跳,

2. Follower 可直接处理并返回客户端的读请求,同时会将写请求转发给 Leader 处理,

3. 并且负责在 Leader 处理写请求时对请求进行投票

11.1.1.3. Observer

角色与 Follower 类似,但是无投票权。Zookeeper 需保证高可用和强一致性,为了支持更多的客

户端,需要增加更多 Server;Server 增多,投票阶段延迟增大,影响性能引入 Observer,

Observer 不参与投票; Observers 接受客户端的连接,并将写请求转发给 leader 节点; 加入更

多 Observer 节点,提高伸缩性,同时不影响吞吐率。

image.png

11.1.1.1. ZAB 协议

事务编号 Zxid(事务请求计数器+ epoch

在 ZAB ( ZooKeeper Atomic Broadcast , ZooKeeper 原子消息广播协议) 协议的事务编号 Zxid

设计中,Zxid 是一个 64 位的数字,其中低 32 位是一个简单的单调递增的计数器,针对客户端每

一个事务请求,计数器加 1;而高 32 位则代表 Leader 周期 epoch 的编号,每个当选产生一个新

的 Leader 服务器,就会从这个 Leader 服务器上取出其本地日志中最大事务的 ZXID,并从中读取

epoch 值,然后加 1,以此作为新的 epoch,并将低 32 位从 0 开始计数。

Zxid(Transaction id)类似于 RDBMS 中的事务 ID,用于标识一次更新操作的 Proposal(提议)

ID。为了保证顺序性,该 zkid 必须单调递增。

epoch

epoch:可以理解为当前集群所处的年代或者周期,每个 leader 就像皇帝,都有自己的年号,所

以每次改朝换代,leader 变更之后,都会在前一个年代的基础上加 1。这样就算旧的 leader 崩溃

恢复之后,也没有人听他的了,因为 follower 只听从当前年代的 leader 的命令

Zab 协议有两种模式-恢复模式(选主)、广播模式(同步)

Zab 协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导

者崩溃后,Zab 就进入了恢复模式,当领导者被选举出来,且大多数 Server 完成了和 leader 的状

态同步以后,恢复模式就结束了。状态同步保证了 leader 和 Server 具有相同的系统状态。

ZAB 协议 4 阶段

Leader election(选举阶段-选出准 Leader

1. Leader election(选举阶段):节点在一开始都处于选举阶段,只要有一个节点得到超半数

节点的票数,它就可以当选准 leader。只有到达 广播阶段(broadcast) 准 leader 才会成

为真正的 leader。这一阶段的目的是就是为了选出一个准 leader,然后进入下一个阶段

Discovery(发现阶段-接受提议、生成 epoch、接受 epoch

2. Discovery(发现阶段):在这个阶段,followers 跟准 leader 进行通信,同步 followers

最近接收的事务提议。这个一阶段的主要目的是发现当前大多数节点接收的最新提议,并且

准 leader 生成新的 epoch,让 followers 接受,更新它们的 accepted Epoch

一个 follower 只会连接一个 leader,如果有一个节点 f 认为另一个 follower p 是 leader,f

在尝试连接 p 时会被拒绝,f 被拒绝之后,就会进入重新选举阶段

Synchronization(同步阶段-同步 follower 副本)

3. Synchronization(同步阶段):同步阶段主要是利用 leader 前一阶段获得的最新提议历史,

同步集群中所有的副本只有当 大多数节点都同步完成,准 leader 才会成为真正的 leader

follower 只会接收 zxid 比自己的 lastZxid 大的提议。

Broadcast(广播阶段-leader 消息广播)

4. Broadcast(广播阶段):到了这个阶段,Zookeeper 集群才能正式对外提供事务服务,

并且 leader 可以进行消息广播。同时如果有新的节点加入,还需要对新节点进行同步。

ZAB 提交事务并不像 2PC 一样需要全部 follower 都 ACK,只需要得到超过半数的节点的 ACK 就

可以了。

ZAB 协议 JAVA 实现(FLE-发现阶段和同步合并为 Recovery Phase(恢复阶段)

协议的 Java 版本实现跟上面的定义有些不同,选举阶段使用的是 Fast Leader Election(FLE),

它包含了 选举的发现职责。因为 FLE 会选举拥有最新提议历史的节点作为 leader,这样就省去了

发现最新提议的步骤。实际的实现将 发现阶段 和 同步合并为 Recovery Phase(恢复阶段)。所

以,ZAB 的实现只有三个阶段:Fast Leader Election;Recovery Phase;Broadcast Phase。

11.1.1.2. 投票机制

每个 sever 首先给自己投票然后用自己的选票和其他 sever 选票对比,权重大的胜出,使用权

重较大的更新自身选票箱。具体选举过程如下:

1. 每个 Server 启动以后都询问其它的 Server 它要投票给谁。对于其他 server 的询问,

server 每次根据自己的状态都回复自己推荐的 leader 的 id 和上一次处理事务的 zxid(系

统启动时每个 server 都会推荐自己)

2. 收到所有 Server 回复以后,就计算出 zxid 最大的哪个 Server,并将这个 Server 相关信

息设置成下一次要投票的 Server。

3. 计算这过程中获得票数最多的的 sever 为获胜者,如果获胜者的票数超过半数,则改

server 被选为 leader。否则,继续这个过程,直到 leader 被选举出来

4. leader 就会开始等待 server 连接

5. Follower 连接 leader,将最大的 zxid 发送给 leader

6. Leader 根据 follower 的 zxid 确定同步点,至此选举阶段完成。

7. 选举阶段完成 Leader 同步后通知 follower 已经成为 uptodate 状态

8. Follower 收到 uptodate 消息后,又可以重新接受 client 的请求进行服务了

目前有 5 台服务器,每台服务器均没有数据,它们的编号分别是 1,2,3,4,5,按编号依次启动,它们

的选择举过程如下:

1. 服务器 1 启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反

馈信息,服务器 1 的状态一直属于 Looking。

2. 服务器 2 启动,给自己投票,同时与之前启动的服务器 1 交换结果,由于服务器 2 的编号

大所以服务器 2 胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是

LOOKING。

3. 服务器 3 启动,给自己投票,同时与之前启动的服务器 1,2 交换信息,由于服务器 3 的编

号最大所以服务器 3 胜出,此时投票数正好大于半数,所以服务器 3 成为领导者,服务器

1,2 成为小弟。

4. 服务器 4 启动,给自己投票,同时与之前启动的服务器 1,2,3 交换信息,尽管服务器 4 的

编号大,但之前服务器 3 已经胜出,所以服务器 4 只能成为小弟。

5. 服务器 5 启动,后面的逻辑同服务器 4 成为小弟。

11.1.2. Zookeeper 工作原理(原子广播)

1. Zookeeper 的核心是原子广播,这个机制保证了各个 server 之间的同步。实现这个机制

的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。

2. 当服务启动或者在领导者崩溃后,Zab 就进入了恢复模式,当领导者被选举出来,且大多

数 server 的完成了和 leader 的状态同步以后,恢复模式就结束了。

3. 状态同步保证了 leader 和 server 具有相同的系统状态

4. 旦 leader 已经和多数的 follower 进行了状态同步后,他就可以开始广播消息了,即进

入广播状态。这时候当一个 server 加入 zookeeper 服务中,它会在恢复模式下启动,发

现 leader,并和 leader 进行状态同步。待到同步结束,它也参与消息广播。Zookeeper

服务一直维持在 Broadcast 状态,直到 leader 崩溃了或者 leader 失去了大部分的

followers 支持。

5. 广播模式需要保证 proposal 被按顺序处理,因此 zk 采用了递增的事务 id 号(zxid)来保

证。所有的提议(proposal)都在被提出的时候加上了 zxid。

6. 实现中 zxid 是一个 64 为的数字,它高 32 位是 epoch 用来标识 leader 关系是否改变,

每次一个 leader 被选出来,它都会有一个新的 epoch。低 32 位是个递增计数。

7. 当 leader 崩溃或者 leader 失去大多数的 follower,这时候 zk 进入恢复模式,恢复模式

需要重新选举出一个新的 leader,让所有的 server 都恢复到一个正确的状态。

11.1.3. Znode 有四种形式的目录节点

1. PERSISTENT:持久的节点。

2. EPHEMERAL:暂时的节点。

3. PERSISTENT_SEQUENTIAL:持久化顺序编号目录节点。

4. EPHEMERAL_SEQUENTIAL:暂时化顺序编号目录节点。


目录
相关文章
|
3月前
|
Java 测试技术 微服务
最新技术栈下 Java 面试高频技术点实操指南详解
本指南结合最新Java技术趋势,涵盖微服务(Spring Cloud Alibaba)、响应式编程(Spring WebFlux)、容器化部署(Docker+Kubernetes)、函数式编程、性能优化及测试等核心领域。通过具体实现步骤与示例代码,深入讲解服务注册发现、配置中心、熔断限流、响应式数据库访问、JVM调优等内容。适合备战Java面试,提升实操能力,助力技术进阶。资源链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)
152 25
|
3月前
|
缓存 Java 关系型数据库
2025 年最新华为 Java 面试题及答案,全方位打造面试宝典
Java面试高频考点与实践指南(150字摘要) 本文系统梳理了Java面试核心考点,包括Java基础(数据类型、面向对象特性、常用类使用)、并发编程(线程机制、锁原理、并发容器)、JVM(内存模型、GC算法、类加载机制)、Spring框架(IoC/AOP、Bean生命周期、事务管理)、数据库(MySQL引擎、事务隔离、索引优化)及分布式(CAP理论、ID生成、Redis缓存)。同时提供华为级实战代码,涵盖Spring Cloud Alibaba微服务、Sentinel限流、Seata分布式事务,以及完整的D
149 0
|
2月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
294 0
|
3月前
|
存储 安全 Java
常见 JAVA 集合面试题整理 自用版持续更新
这是一份详尽的Java集合面试题总结,涵盖ArrayList与LinkedList、HashMap与HashTable、HashSet与TreeSet的区别,以及ConcurrentHashMap的实现原理。内容从底层数据结构、性能特点到应用场景逐一剖析,并提供代码示例便于理解。此外,还介绍了如何遍历HashMap和HashTable。无论是初学者还是进阶开发者,都能从中受益。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
173 4
|
3月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
561 48
|
3月前
|
算法 架构师 Java
Java 开发岗及 java 架构师百度校招历年经典面试题汇总
以下是百度校招Java岗位面试题精选摘要(150字): Java开发岗重点关注集合类、并发和系统设计。HashMap线程安全可通过Collections.synchronizedMap()或ConcurrentHashMap实现,后者采用分段锁提升并发性能。负载均衡算法包括轮询、加权轮询和最少连接数,一致性哈希可均匀分布请求。Redis持久化有RDB(快照恢复快)和AOF(日志更安全)两种方式。架构师岗涉及JMM内存模型、happens-before原则和无锁数据结构(基于CAS)。
82 5
|
3月前
|
Java API 微服务
2025 年 Java 校招面试全攻略:从面试心得看 Java 岗位求职技巧
《2025年Java校招最新技术要点与实操指南》 本文梳理了2025年Java校招的核心技术栈,并提供了可直接运行的代码实例。重点技术包括: Java 17+新特性(Record类、Sealed类等) Spring Boot 3+WebFlux响应式编程 微服务架构与Spring Cloud组件 Docker容器化部署 Redis缓存集成 OpenAI API调用 通过实际代码演示了如何应用这些技术,如Java 17的Record类简化POJO、WebFlux构建响应式API、Docker容器化部署。
109 5
|
3月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
146 6
|
3月前
|
安全 Java API
2025 年 Java 校招面试常见问题及详细答案汇总
本资料涵盖Java校招常见面试题,包括Java基础、并发编程、JVM、Spring框架、分布式与微服务等核心知识点,并提供详细解析与实操代码,助力2025校招备战。
139 1
|
3月前
|
算法 Java 微服务
2025 年 Java 面试宝典社招春招秋招实操全方位攻略
2025年Java面试宝典涵盖核心技术及最新趋势,分为四大板块:1. Java基础:深入数据类型、多态等特性,结合学生信息管理等实例;2. JVM核心:解析内存模型与GC算法,附多线程转账等场景应用;3. 高并发方案:详解synchronized与线程池配置,提供Web服务器优化案例;4. Spring生态:剖析IoC/AOP原理,演示微服务架构实现。特别新增Java 17+特性实操,包括Record类、密封接口等语法糖,整合Spring Boot 3、响应式编程及云原生技术,通过订单状态机、API网关配置。
196 1