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 友好