ZooKeeper核心能力
ZooKeeper 是一个分布式协调服务,由 Apache Hadoop 项目开发,核心基于 PAXOS 变种Zab 协议。
核心功能
1. 分布式配置管理
- 集中化管理配置,所有节点从 ZooKeeper 读取配置
- 配置变更时实时推送通知,无需重启服务
- 适用:微服务配置中心、特性开关(feature flag)
2. 命名服务 / 服务发现
- 服务注册与发现:服务启动时注册节点,下线时删除
- 客户端通过监听节点获取可用服务列表
- 适用:微服务架构中的服务注册发现(类似 etcd/Nacos)
3. 分布式锁
- 利用临时有序节点(EPHEMERAL_SEQUENTIAL)实现互斥锁
- 客户端监听前一个节点,排队获取锁
- 适用:分布式定时任务、数据库行锁、资源互斥访问
4. 集群管理(Master 选举)
- 多个竞争者创建临时节点,序列号最小的当选 Master
- Master 故障后临时节点消失,剩余节点重新选举
- 适用:主从架构、消息队列 broker 选举
5. 分布式队列
- 利用有序节点实现 FIFO 队列
- 消费者监听节点变更,按序处理任务
- 适用:异步任务分发、负载均衡
6. 分布式通知 / 协调
- Watch 机制:客户端注册监听,服务端变更时主动推送
- 适用:分布式事件触发、状态同步
典型使用场景
| 场景 | 说明 |
|---|---|
| Kafka | 使用 ZK管理Broker状态、Topic元数据、Consumer Group |
| Hadoop/HBase | NameNode选举、RegionServer管理 |
| 微服务 | 服务发现、配置中心、分布式锁 |
| 分布式定时任务 | 基于锁保证任务只在一个节点执行 |
| 分布式数据库 | 元数据管理、选主 |
核心数据模型
ZooKeeper 采用类似文件系统的树形结构(ZNode):
/zookeeper
/service/
/service/user-service ← 持久节点
/service/user-service/1 ← 临时有序节点(IP:port)
/service/user-service/2
四种 ZNode 类型:
- PERSISTENT — 持久节点,创建后一直存在
- EPHEMERAL — 临时节点,客户端断开自动删除(用于服务注册、选主)
- PERSISTENT_SEQUENTIAL — 持久有序节点
- EPHEMERAL_SEQUENTIAL — 临时有序节点(用于分布式锁、选主)
优势与局限
优势:
- 强一致性(CP),数据有序可见
- Watch 机制高效,被动推送
- API 简洁,成熟稳定
局限:
- 写性能有限(每次写需 Zab 选举确认),不适合高并发写场景
- 大量客户端连接和 Watch 会消耗内存
- 社区活跃度不如 etcd,新项目更多选 etcd/Nacos
ZooKeeper vs etcd
| 对比项 | ZooKeeper | etcd |
|---|---|---|
| 协议 | Zab | Raft |
| API | 类文件系统树形 | 键值存储(类似 Redis) |
| 成熟度 | 非常成熟 | 成熟 |
| 新生态倾向 | 已有生态锁定 | 更推荐新项目使用 |
| 多语言客户端 | Java 最成熟 | Go 原生,gRPC 友好 |