ZooKeeper 协调¶
一句话概述:ZooKeeper 是 Apache 的分布式协调服务,为分布式系统提供配置管理、命名服务、分布式锁、Leader 选举等基础能力,是 Hadoop/Kafka 生态的核心组件。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| ZNode | 节点 = ZooKeeper 中的数据单元(类似文件系统的文件/目录) |
| Persistent Node | 持久节点 = 创建后一直存在 |
| Ephemeral Node | 临时节点 = 客户端断开连接后自动删除 |
| Sequential Node | 顺序节点 = 自动编号(用于分布式锁) |
| Watch | 监听 = 节点变化时收到通知 |
| Ensemble | 集群 = ZooKeeper 的服务器组(建议奇数个:3/5/7) |
安装配置¶
# Docker
docker run -d --name zookeeper -p 2181:2181 zookeeper:latest
# Python 客户端
pip install kazoo
基本使用¶
from kazoo.client import KazooClient
zk = KazooClient(hosts='localhost:2181') # 连接
zk.start()
# 创建节点
zk.ensure_path("/config") # 确保路径存在
zk.create("/config/db_host", b"localhost") # 创建节点
# 读取节点
data, stat = zk.get("/config/db_host")
print(data.decode()) # localhost
# 监听节点变化
@zk.DataWatch("/config/db_host")
def watch_node(data, stat):
print(f"节点变化: {data.decode() if data else 'deleted'}")
# 分布式锁
lock = zk.Lock("/locks/analysis", "worker-1")
with lock:
print("获得锁,执行临界区操作...")
zk.stop()
常见报错¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
Connection refused | ZooKeeper 未启动 | 启动服务 |
NodeExistsError | 节点已存在 | 用 ensure_path 或先检查 |
NoNodeError | 节点不存在 | 先创建父节点 |
速查表¶
# === CLI (zkCli.sh) ===
ls / # 列出子节点
create /path "data" # 创建节点
get /path # 读取节点
set /path "newdata" # 更新节点
delete /path # 删除节点
stat /path # 查看节点信息
# === ZooKeeper 用途 ===
# 配置管理(集中存储配置)
# 服务发现(临时节点注册服务)
# 分布式锁(顺序临时节点)
# Leader 选举(最小编号为 Leader)
# 注意:ZooKeeper 逐渐被 etcd/Consul 替代
参考:ZooKeeper 文档 | 更新于 2026 年