Skip to content

ZooKeeper 面试题

本页只放 ZooKeeper 面试标准回答、追问点、项目话术和原理页跳转。详细原理请跳到知识点页。

核心问题

问题标准回答原理页
ZooKeeper 是什么ZooKeeper 是分布式协调组件,提供 znode 树、临时节点、顺序节点、Watcher、Session 和一致性写入能力,常用于注册中心、配置通知、分布式锁、选主和集群成员管理。ZooKeeper 总览
ZooKeeper 适合做什么适合做低频、关键、强协调的元数据管理,例如服务注册发现、主备选举、分布式锁、配置通知。ZooKeeper 总览
ZooKeeper 不适合做什么不适合存大量业务数据,不适合高频读写,不适合作为消息队列,也不适合承载业务流量。ZooKeeper 总览运维排查
ZK 为什么常作为 Dubbo 注册中心传统Dubbo可用临时节点表达Provider Session所有权,Consumer通过Watch/Cache重新读取服务目录并更新Invoker快照。短暂断连不会立即删除节点,Session过期才删除;注册中心只做控制面,不转发RPC。Dubbo注册发现Session失效窗口

数据模型追问

追问标准回答原理页
znode 是什么znode是树形命名空间中的协调节点,可同时保存小型字节数据、直接子节点、Stat和ACL;它不是文件,通常整体读写且主要驻留内存,不适合大业务数据和事件日志。znode树为什么不是文件系统
有哪些节点类型常见Persistent、Ephemeral及Sequential组合;临时节点属于Session且不能有子节点。较新版本还有Container和TTL节点,但Server、Client与功能开关有版本边界,TTL也不是精确定时器。节点类型Container和TTL
临时节点什么时候删除临时节点属于Session而不是单条TCP连接;短暂断连可在协商Timeout内恢复原Session,服务端确认过期或客户端正常关闭后才清理临时节点。过期后旧Session不可恢复。Session建立过期语义
顺序节点有什么用顺序节点把并发创建请求转成稳定序号,可用于排队锁和业务选主;它提供近似FIFO,不保证按业务发起时间严格公平,也不能单独阻止过期旧客户端写外部资源。锁数据模型顺序节点作用
version、cversion、aversion区别version记录节点数据变化,cversion记录直接子节点集合变化,aversion记录ACL变化;setData/delete/setACL应使用对应期望版本,不能混用。Stat字段三类版本
BadVersion怎么办它是明确并发冲突,不是网络故障。应重读当前数据和version,合并业务意图后基于新version提交;不能用version=-1无条件覆盖来掩盖冲突。版本CAS排查
ZooKeeper multi能和数据库一起事务吗不能。multi只保证同一ZooKeeper集群中多个znode操作全部成功或全部失败,不能包含MySQL、Redis或MQ;响应丢失时仍可能结果未知。multi事务边界ConnectionLoss
ACL权限会自动继承吗不会。创建子节点时需显式提供ACL或由框架默认策略注入;CREATE和DELETE主要控制父节点下创建/删除子节点。父节点严格但子节点开放会产生漏洞。ACL模型ACL不继承
顺序节点后缀能永久当Fencing Token吗必须谨慎。传统顺序计数有有符号32位及溢出边界,父路径删除重建会破坏连续语义,不同父路径也不可比较。关键Token要保证父路径稳定或使用独立单调序列。顺序号边界Fencing Token

ZAB 和一致性追问

追问标准回答原理页
ZAB 是什么ZAB是ZooKeeper原子广播协议,完整过程包括Leader选举后的Discovery、新epoch建立、DIFF/TRUNC/SNAP历史同步和正常Broadcast,不只是“Leader把写复制给Follower”。ZAB三个阶段恢复全过程
写请求怎么处理写请求进入任一Server后最终由Leader校验、生成事务并分配zxid,广播Proposal;Follower持久化后ACK,Leader获得投票成员法定多数才推进Commit,各Server按zxid应用,再完成响应和Watch通知。写请求全过程Proposal与Commit
为什么要过半N个投票成员的普通多数是floor(N/2)+1,任意两个多数集合必有交集;网络分成3和2时只有3节点侧能提交,少数派旧Leader无法获得足够ACK。交集还需配合epoch和日志规则。Quorum多数派交集
为什么 ZK 集群常用奇数节点普通多数派下,4节点和3节点都只能容忍1个投票节点故障,6和5都只能容忍2个;偶数节点增加确认成本却不增加对应容错,常用3或5。Observer不参与投票。Quorum计算角色
ZooKeeper 是 CP 还是 AP网络分区时只有多数派侧能选主并提交写,少数派拒绝写来保护一致性,所以通常归为CP;多数派侧仍可用,某些只读模式可能提供陈旧读,不能把CP解释为整个集群永远不可用。ZooKeeper与CAP
zxid 是什么zxid是ZooKeeper事务顺序标识,常由高32位epoch和低32位时期内计数组成;它用于排序与恢复,不是时间戳、业务幂等键,也不等于znode version。zxidzxid边界
DIFF、TRUNC、SNAP是什么新Leader恢复时,Follower若只是缺少安全后缀就DIFF补齐;若保留冲突未提交尾部就TRUNC截断;差异太大或日志不足就用SNAP同步完整数据树,再进入广播。DIFF/TRUNC/SNAP
ZooKeeper读是线性一致吗写事务经Quorum排序提交,但读通常由当前Server本地处理,Follower可能短暂落后,因此不能概括为任意本地读都线性一致。需要看见之前完成的写时可正确使用sync后再读,并处理连接边界。读路径sync语义
写请求ConnectionLoss能直接重试吗不能。事务可能已获得多数派提交,只是响应丢失。应重连后读取数据、version和业务操作标识:目标已存在则幂等成功,仍是旧版本才条件重试,被他人推进则冲突处理。UNKNOWN结果

Watcher 和 Session 追问

追问标准回答原理页
Watcher 是什么标准Watch是一次性变化提示;existsgetDatagetChildren观察范围不同。触发后应重新读取完整事实并重新注册,而不是根据事件次数增减业务状态。Watch定义Watch类型一次性语义
Watcher 能当 MQ 吗不能。Watch不保存可重放事件流,断连期间的中间变化不应依赖逐条事件恢复。ZooKeeper 3.6持久/递归Watch也只是持续监听能力,离线恢复仍需重建快照。重注册窗口持久Watch
连接断开和 Session 过期区别Disconnected是不确定状态,Session可在Timeout内跨Server恢复;Expired是不可逆终态,旧临时节点和锁所有权失效。新连接成功不能自动恢复旧Leader或锁身份。连接状态断连与过期
SessionTimeout 怎么设置客户端期望值会受Server最小/最大范围协商。过短会被网络抖动、GC Pause和CPU饥饿误过期,过长会延长死实例残留;应比较协商值、最大停顿、网络和故障检测目标。超时协商GC Pause排查

分布式锁和选主追问

追问标准回答原理页
ZK 分布式锁怎么实现客户端创建临时顺序节点,排序后最小者持锁;其他客户端只对紧邻前驱执行exists+Watch,前驱不存在就立即重排,存在才等待。每次唤醒都重新确认自己是否最小。获取锁流程前驱Watch竞态
为什么监听前一个节点若所有等待者监听最小节点,释放时会同时唤醒并读取形成羊群效应;前驱链让一次释放主要唤醒下一个等待者,减少无效竞争。前驱Watch
ZK 锁和 Redis 锁怎么选ZK以Session、临时顺序节点和Watch排队,适合低频关键协调;Redis通常吞吐更高,以TTL和原子命令管理所有权。两者都存在旧持有者恢复边界,都需要外部Fencing和业务幂等。ZK与Redis锁对比
ZK 锁一定安全吗ZooKeeper能正确删除过期Session节点,但暂停旧线程恢复后仍可绕过ZK写数据库。必须让外部资源原子保存并比较递增Fencing Token,客户端本地判断无效。GC双执行窗口Fencing Token
Fencing Token为什么必须在外部资源校验旧客户端暂停时看不到新Token,恢复后本地仍可能认为自己有效;只有数据库、存储或设备网关在每次写入时原子拒绝小于当前Token的请求,才能强制隔离旧持有者。Token外部校验
ZK 怎么选主业务实例可创建临时顺序候选节点,最小者成为Leader;断连时暂停风险任务,Expired后永久撤销身份并重新竞争。应用Leader与ZooKeeper Server的ZAB Leader是不同概念。两种Leader区别业务选主流程
LeaderLatch能保证任务只执行一次吗不能。旧Leader可能执行一半后失去Session,新Leader会接管;回调和旧任务停止也有窗口。任务仍需唯一业务键、状态机、幂等、Token和接管对账。Leader不等于Exactly Once

运维排查追问

追问标准回答原理页
ruok=imok能证明集群健康吗不能,只能说明进程/命令端口有响应;还要检查Leader、Quorum、角色、磁盘fsync、Follower zxid、outstanding、Session、业务路径和Dubbo Directory。分层健康检查四字命令
ZK 延迟高怎么排查将写延迟拆成排队、Leader处理、txnlog fsync、Quorum网络/ACK和响应;再查outstanding、最慢Follower、GC、大multi、大znode、Snapshot IO和写流量突增。写延迟Runbook延迟指标
客户端频繁重连怎么排查按应用/IP查连接建立速率,检查是否每请求创建客户端、NAT共享IP与maxClientCnxns、GC Pause、网络、文件描述符和协商Session Timeout;重连必须退避加抖动。连接风暴Runbook
Leader反复选举怎么排查检查投票成员Election/Quorum端口、网络RTT/丢包、Leader和Follower GC、CPU节流、txnlog fsync、initLimit/syncLimit,以及自动化是否同时重启多数节点。Leader选举Runbook
Follower长期同步怎么办比较Follower和Leader zxid,判断DIFF/TRUNC/SNAP,检查Snapshot大小、日志保留、网络和磁盘;一次恢复一个节点并等追平,避免多个落后节点同时拖垮Leader。Follower同步Runbook
磁盘满了能直接删除txnlog吗不能。启动需要最近Snapshot及其后的事务日志,随机删除可能破坏恢复。应先保住Quorum、停止非必要写、用官方清理/已验证历史释放空间,一次处理一个Follower并修复autopurge。磁盘满autopurge
节点数持续增长怎么办按路径统计Persistent/Ephemeral和children,重点查Persistent Sequential、审计日志式节点、锁取消失败和注册类型错误;清理前备份并验证引用,不能直接递归删除生产父路径。数据模型Runbook容量模型
滚动升级怎样避免集群不可用始终保持Quorum,一次处理一个Follower,启动后等待角色稳定和zxid追平再继续,最后处理Leader;跨版本按官方兼容矩阵验证磁盘格式、TLS、动态配置和客户端。滚动升级
Dubbo No Provider 和 ZK 有什么关系先确认ZK有Leader/Quorum,再查Provider export/register、接口级或应用级实例和元数据、namespace/chroot与ACL、Consumer通知和Directory、Router候选,最后验证Provider数据面。ZooKeeper侧RunbookDubbo注册发现

项目话术

我们项目里 ZooKeeper 主要用于 Dubbo 注册中心和少量协调场景。Provider 启动后把服务地址注册成临时节点,Consumer 订阅服务目录变化并缓存 Provider 列表。对于多实例定时任务或低频关键操作,会使用 Curator 的分布式锁或 LeaderLatch 做主备协调。但核心业务不会只依赖 ZK 锁,会配合幂等号、状态机、唯一约束和补偿任务,防止 Session 过期或客户端暂停导致的数据覆盖。

常见错误回答纠正

错误回答为什么错正确说法
ZK 是数据库ZK 不适合大量业务数据ZK 是协调元数据组件
Watcher 是消息队列Watcher 是一次性通知可靠消息用 MQ
连接断开锁就释放Session 未过期锁节点仍在Session 过期才删除临时节点
ZK 锁绝对安全客户端 GC 和 Session 过期仍有风险用 Fencing Token 和业务兜底
节点越多越好写入投票成本更高常用 3 或 5 节点

本章小结

ZooKeeper 面试要围绕“协调”展开:znode 数据模型提供节点能力,临时节点表达存活,顺序节点表达排队,Watcher 表达变化通知,Session 管理客户端状态,ZAB 保证写入顺序和多数派一致。再结合项目说明注册中心、锁、选主、运维排查和业务兜底,答案才完整。