Zookeeper面试题
17、zookeeper是如何保证事务的顺序一致性的?
zookeeper采用了全局递增的事务id来标识,所有的proposal(提议)都在被提出来的时候就被加上了zxid,zxid实际上是一个64位的数字·,高32位是epoch(时期,纪元,世;新时代)用来标识leader周期,如果有新的 leader 产生出来,epoch会自增,低 32 位用来递增计数。当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的
server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
18、zk节点宕机如何处理?
Zookeeper 本身也是集群,推荐配置不少于 3 个服务器。Zookeeper 自身也要保证当一个节点宕机时,其他节点会继续提供服务。
如果是一个 Follower 宕机,还有 2 台服务器提供访问,因为 Zookeeper 上的数据是有多个副本的,数据并不会丢失;
如果是一个 Leader 宕机,Zookeeper 会选举出新的 Leader。
ZK 集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在 ZK节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。
所以
3 个节点的 cluster 可以挂掉 1 个节点(leader 可以得到 2 票>1.5)
2 个节点的 cluster 就不能挂掉任何 1 个节点了(leader 可以得到 1 票<=1)
19、zookeeper负载均衡和nginx负载均衡区别
zk的负载均衡是可以调控,nginx只是能调权重,其他需要可控的都需要自己写插件,但是nginx吞吐量比zk大很多,应该多按业务选择用那种方式。
20、分布式集群中为什么会有Master?
在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,于是就需要进行leader 选举。
21、Zookeeper有几种部署模式?
部署模式:单机模式,伪集群模式,集群模式
22、集群最少要几台机器,集群规则是怎样的?
集群规则:2n+1台,n>0,最少即3台
23、集群支持动态添加机器吗?
其实就是水平扩容了,Zookeeper 在这方面不太好。两种方式:
全部重启:关闭所有 Zookeeper 服务,修改配置之后启动。不影响之前客户端的会话。
逐个重启:在过半存活即可用的原则下,一台机器重启不影响整个集群对外提供服务。这是比较常用的方式。
3.5 版本开始支持动态扩容
24、zookeeper对节点的watch监听通知是永久的吗?为什么不是永久的?
不是。官方声明:一个 Watch 事件是一个一次性的触发器,当被设置了 Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了 Watch 的客户端,以便通知它们。
为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,给网络和服务器造成很大压力。一般是客户端执行
getData(“/节点 A”,true),如果节点 A 发生了变更或删除,客户端会得到它的 watch 事件,但是在之后节点 A 又发生了变更,而客户端又没有设置 watch 事件,就不再给客户端
发送。
在实际应用中,很多情况下,我们的客户端不需要知道服务端的每一次变动,我只要最新的数据即可
25、zookeeper的Java客户端都有哪些?
java客户端:zk自带的zkcilent及Apache开源的curator
26、chubby是什么,和zookeeper比你怎么看?
chubby 是 google 的,
完全 实现 paxos 算法 ,不 开源 。zookeeper 是 chubby的开 源实 现,
使用 zab 协议 ,paxos 算法 的变 种。
27、说几个zookeeper常用的命令?
常用命令:ls get set create delete等
28、ZAB和Paxos算法的联系与区别?
相同点:
1、两者 都存 在一 个类 似于 Leader 进程 的角 色 ,由其 负责 协调 多个 Follower 进程的运 行
2、Leader 进程 都会 等待 超过 半数 的 Follower 做出 正确 的反 馈后 ,才会 将一 个提案进 行提 交
3、 ZAB 协议 中,
每个 Proposal 中都 包含 一个 epoch 值来 代表 当前 的 Leader周期 ,Paxos 中名 字为 Ballot
不同点:
ZAB 用来 构建 高可 用的 分布 式数 据主 备系 统( Zookeeper), Paxos 是用 来构 建分布 式一 致性 状态 机系 统。
29、zookeeper的典型应用场景
Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可以使用它来进行分布式数据的发布和订阅。
通过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机制,可以非常方便的构建一系列分布式应用中年都会涉及的核心功能,如:
1、数据发布/订阅
2、负载均衡
3、命名服务
4、分布式协调/通知
5、集群管理
6、Master 选举
7、分布式锁
8、分布式队列
30、数据发布订阅
数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者发布数据供订阅者进行数据订阅。
目的
动态获取数据(配置信息)
实现数据(配置信息)的集中式管理和数据的动态更新
设计模式
Push 模式
Pull 模式
数据(配置信息)特性
1、数据量通常比较小
2、数据内容在运行时会发生动态更新
3、集群中各机器共享,配置一致
如:机器列表信息、运行时开关配置、数据库配置信息等
基于 Zookeeper 的实现方式
数据存储:将数据(配置信息)存储到 Zookeeper 上的一个数据节点
数据获取:应用在启动初始化节点从 Zookeeper 数据节点读取数据,并在该节点上注册一个数据变更 Watcher
数据变更:当变更数据时,更新 Zookeeper 对应节点数据,Zookeeper会将数据变更通知发到各客户端,客户端接到通知后重新读取变更后的数据即可
31、zk的命名服务
命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程
的对象等等。
32、分布式通知和协调
对于系统调度来说:操作人员发送通知实际是通过控制台改变某个节点的状态,然后 zk 将这些变化发送给注册了这个节点的 watcher 的所有客户端。 对于执行情况汇报:每个
工作进程都在某个目录下创建一个临时节点。并携带工作的进度数据,这样汇总的进程可以监控目录子节点的变化获得工作进度的实时的全局情况。
33、zk的命名服务(文件系统)
命名服务是指通过指定的名字来获取资源或者服务的地址,利用 zk 创建一个全局的路径,即是唯一的路径,这个路径就可以作为一个名字,指向集群中的集群,提供的服务的地
址,或者一个远程的对象等等。
34、zk的配置管理(文件系统,通知机制)
程序分布式的部署在不同的机器上,将程序的配置信息放在 zk 的 znode 下,当有配置发生改变时,也就是 znode 发生变化时,可以通过改变 zk 中某个目录节点的内容,利用
watcher 通知给各个客户端,从而更改配置。
35、zookeeper集群管理(文件系统,通知机制)
所谓集群管理无在乎两点:是否有机器退出和加入、选举 master。对于第一点,所有机器约定在父目录下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机
器挂掉,该机器与 zookeeper 的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。
新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount 又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的
机器作为 master 就好。
36、zookeeper分布式锁(文件系统,通知机制)
有了 zookeeper 的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序 对于第一类,我们将 zookeeper 上的一个 znode 看作是一
把锁,通过 createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 distribute_lock 节
点就释放出锁。
对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选 master 一样,编号最小的获得锁,用完删除,依次方便。
37、zookeeper队列管理(文件系统,通知机制)
两种类型的队列:
1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达。
2、队列按照 FIFO 方式进行入队和出队操作。
第一类,在约定目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下创建 PERSISTENT_SEQUENTIAL 节点,创建成功时Watcher 通知等待的队
列,队列删除序列号最小的节点用以消费。此场景下Zookeeper 的 znode 用于消息存储,znode 存储的数据就是消息队列中的消息内容,SEQUENTIAL 序列号就是消息的编
号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息的丢失问题
38、zookeeper角色
Zookeeper 集群是一个基于主从复制的高可用集群,每个服务器承担如下三种角色中的一种
Leader:
1. 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader,它会发起并维护与各 Follwer及 Observer 间的心跳。
2. . 所有的写操作必须要通过 Leader 完成再由 Leader 将写操作广播给其它服务器。 只要有超过半数节点(不包括 observeer 节点)
写入成功,该写请求就会被提交(类2PC 协议)。
Follower:
1. 一个 Zookeeper 集群可能同时存在多个 Follower,它会响应 Leader 的心跳,
2. Follower 可直接处理并返回客户端的读请求,同时会将写请求转发给 Leader 处理
3. 并且负责在 Leader 处理写请求时对请求进行投票
Observer:
角色与 Follower 类似,但是无投票权。 Zookeeper 需保证高可用和强一致性,为了支持更多的客户端,需要增加更多 Server; Server 增多,投票阶段延迟增大,影响性能;
引入 Observer,Observer 不参与投票;Observers 接受客户端的连接,并将写请求转发给 leader 节点;
加入更多 Observer 节点,提高伸缩性,同时不影响吞吐率。
39、事务编号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 必须单调递增
40、epoch
epoch:可以理解为当前集群所处的年代或者周期,每个 leader 就像皇帝,都有自己的年号,所以每次改朝换代, leader 变更之后,都会在前一个年代的基础上加 1。这样就算
旧的 leader 崩溃恢复之后,也没有人听他的了,因为 follower 只听从当前年代的 leader 的命令。
41、zab协议有两种模式-恢复模式(选主),广播模式(同步)
Zab 协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)
。当服务启动或者在领导者崩溃后, Zab 就进入了恢复模式,当领导者被选举出来,且大多数 Server
完成了和 leader 的状态同步以后,恢复模式就结束了。状态同步保证了 leader 和 Server 具有相同的系统状态。
42、Leader election(选举阶段-选出准Leader)
Leader election(选举阶段)
:
节点在一开始都处于选举阶段,只要有一个节点得到超半数节点的票数,它就可以当选准 leader。只有到达 广播阶段(broadcast)
准 leader
才会成为真正的 leader。这一阶段的目的是就是为了选出一个准 leader,然后进入下一个阶段
43、Discovery(发现阶段-接收提议,生成epoch,接收epoch)
Discovery(发现阶段)
:
在这个阶段, followers 跟准 leader 进行通信,同步 followers最近接收的事务提议。这个一阶段的主要目的是发现当前大多数节点接收的最新提
议,并且准 leader 生成新的 epoch,让 followers 接受,更新它们的 accepted Epoch
一个 follower 只会连接一个 leader,
如果有一个节点 f 认为另一个 follower p 是 leader, f在尝试连接 p 时会被拒绝, f 被拒绝之后,就会进入重新选举阶段
44、Synchronized(同步阶段-同步follower副本)
Synchronization(同步阶段)
:
同步阶段主要是利用 leader 前一阶段获得的最新提议历史,同步集群中所有的副本。 只有当 大多数节点都同步完成,准 leader 才会成为真正
的 leader。follower 只会接收 zxid 比自己的 lastZxid 大的提议。
45、Broadcast(广播阶段-leader消息广播)
Broadcast(广播阶段)
:
到了这个阶段, Zookeeper 集群才能正式对外提供事务服务,并且 leader 可以进行消息广播。同时如果有新的节点加入,还需要对新节点进行同步
46、zab协议java实现(fle发现阶段和同步合并为Recovery Phase(恢复阶段))
协议的 Java 版本实现跟上面的定义有些不同,选举阶段使用的是 Fast Leader Election(FLE),它包含了 选举的发现职责。因为 FLE 会选举拥有最新提议历史的节点作为
leader,这样就省去了发现最新提议的步骤。实际的实现将 发现阶段 和 同步合并为 Recovery Phase(恢复阶段)。所以, ZAB 的实现只有三个阶段: Fast Leader Election;
Recovery Phase; Broadcast Phase。
47、投票机制
每个 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 成为小弟
48、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 都恢复到一个正确的状态
49、znode有四种形式的目录
1. PERSISTENT:持久的节点。
2. EPHEMERAL:
暂时的节点。
3. PERSISTENT_SEQUENTIAL:持久化顺序编号目录节点。
4. EPHEMERAL_SEQUENTIAL:暂时化顺序编号目录节点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报