跳转至

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 refusedZooKeeper 未启动启动服务
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 年