文章目录
-
- 先说结论
- 数据模型:一棵"会通知"的树
- Watch 机制:数据变了主动通知
- ZAB 协议:怎么保证数据一致
- 回答技巧与点评
-
- 加分回答
- 面试官点评
个人网站
Dubbo 用它做注册中心,Kafka 用它做 Controller 选举,HBase 用它做主备切换……ZooKeeper 到处都在,但很多人只知道它"是个注册中心"。面试官问这题,他想听的是:你能不能讲清 ZooKeeper 的数据模型、核心功能和 ZAB 协议?
先说结论
| 是啥 | 分布式协调服务,不是存储系统 |
| 数据模型 | 树形命名空间(ZNode),每个节点可存数据 |
| 核心功能 | 配置管理、服务注册、分布式锁、Leader 选举 |
| 一致性协议 | ZAB 协议(类 Paxos) |
| 读写模型 | 读任意节点,写必须过 Leader |
| 典型应用 | Dubbo 注册中心、Kafka Broker 管理、Hadoop HA |
|一句话记住:ZooKeeper 是分布式系统的"村委会"——不管谁家有事,都来找它协调"
数据模型:一棵"会通知"的树
ZooKeeper 的命名空间像文件系统,每个节点叫 ZNode:
/
├── dubbo
│ └── com.example.UserService
│ └── providers
│ ├── 192.168.1.1:20880 👈 临时节点,服务下线自动删除
│ └── 192.168.1.2:20880
├── config
│ └── db-url = "jdbc:mysql://…"
└── locks
└── order-lock
ZNode 有两种类型:
| 持久节点 | 创建者断开也不删 | 配置、路由表 |
| 临时节点 | 创建者断开自动删 | 服务注册、分布式锁 |
临时节点是 ZooKeeper 的"杀手级特性"——服务挂了,注册节点自动消失,不需要心跳检测,不需要手动摘除。
就像村里的"户籍系统":永久户口(持久节点)搬走了还在,暂住证(临时节点)人走了自动注销。
Watch 机制:数据变了主动通知
传统方式是"轮询"——隔一会儿问一次"数据变了没?"。ZooKeeper 用 Watch 机制——数据变了它主动通知你:
// 客户端注册 Watch
zk.getData("/dubbo/service/providers", watch -> {
System.out.println("服务列表变了!"); // 👈 变了才通知
}, stat);
// 服务上下线时,ZooKeeper 主动推送
// 不需要客户端反复轮询
Watch 是 一次性的——触发一次后失效,需要重新注册。这个设计是为了避免"通知风暴":如果数据连续变 100 次,你只需要关心最新状态,不需要处理 100 次通知。
就像快递到了发短信通知你——不用你每隔 5 分钟去门口看。
ZAB 协议:怎么保证数据一致
ZooKeeper 用 ZAB(Zookeeper Atomic Broadcast) 协议保证所有节点数据一致:
写数据流程:
客户端写请求 → Leader 节点
↓
Leader 生成事务提案(ZXID)
↓
广播给所有 Follower
↓
过半 Follower 确认 → Leader 提交 → 通知客户端
关键点:过半确认即可提交(不需要全部确认)。3 台集群容忍 1 台故障,5 台容忍 2 台故障。
Leader 选举:Leader 挂了怎么办?
// ZXID = epoch + counter
// epoch:Leader 任期号(每换一次 Leader +1)
// counter:事务计数器
// 比较规则:先比 epoch,再比 counter 👈 保证数据最新的当选
就像选村长:先比谁的消息最灵通(ZXID 最大),消息一样再比资历(myid),过半同意就当选。
ZooKeeper 全景
数据模型
├── ZNode 树形结构
├── 持久节点 —— 创建者断开不删
└── 临时节点 —— 创建者断开自动删(杀手级特性)
核心机制
├── Watch —— 数据变更主动通知(一次性)
└── 临时节点 —— 会话断开自动删除
一致性
├── ZAB 协议 —— 过半确认即可提交
├── Leader 写,Follower 读
└── 选举规则 —— ZXID 最大的优先
口诀:树形节点存数据,临时节点会消失;
Watch通知不用轮,一次生效需重注;
ZAB过半就算数,Leader挂了选最新;
协调服务非存储,轻量快速保一致
回答技巧与点评
标准回答:ZooKeeper 是分布式协调服务,数据模型是树形 ZNode,支持持久节点和临时节点。核心机制是 Watch(数据变更主动通知)和临时节点(会话断开自动删除)。一致性由 ZAB 协议保证:写请求由 Leader 处理,过半 Follower 确认即可提交;Leader 故障时选举 ZXID 最大的节点为新 Leader。
加分回答
面试官点评
这道题考的是你对 分布式协调 的理解。最忌讳的回答是"ZK 就是注册中心"——注册中心只是 ZK 的一个应用场景。面试官想听的是 数据模型(ZNode)、核心机制(Watch/临时节点)、一致性协议(ZAB) 三板斧。能把这些讲清楚,再说出 ZK 的局限性,就是高分回答。
原文阅读
内容有帮助?点赞、收藏、关注三连!评论区等你 💪