Skip to content

ZooKeeper 新手教程

English · GitHub source English version: README.md

ZooKeeper 是一个分布式协调服务。应用通过它保存少量共享的协调状态,例如选出一台 leader、记录哪些 worker 可用,或在小型配置变更时通知客户端。

它不是通用数据库、消息队列、对象存储,也不应用来保存大文件或密码等敏感信息。

何时使用

当多个应用实例需要就一小段状态达成一致时,可以使用 ZooKeeper。

  • Leader 选举:只允许一个 scheduler、controller 或 worker 处于活动状态。
  • 服务协调:worker 使用 ephemeral znode 注册;session 结束时,ZooKeeper 会删除该临时节点。
  • 配置通知:小型配置变更时通知客户端。

不要用它保存业务记录、事件流、大型 payload 或凭据。这些场景应使用数据库、消息系统、对象存储或密钥管理服务。

五个核心概念

术语 含义
Ensemble 多台 ZooKeeper server 作为一个服务协同工作。
Quorum ensemble 中的多数成员。三成员 ensemble 至少需要两台达成一致。
znode ZooKeeper 树中的小节点,类似 /apps/api 这样的路径。
Session 客户端与 ZooKeeper 之间的活动连接。
Watch znode 变化时的一次性通知;如仍需更新,客户端需要重新注册 watch。

在一个 ensemble 中,一台 server 是 leader,其他 server 保存相同协调数据的副本。客户端可连接任一可用成员。首次本地练习时,一台 server 已足够,但它不提供高可用。

在本地试用 CLI

本示例假设本机单机 server 已完成配置:存在 conf/zoo.cfg,其中的 dataDir 已存在,且使用 clientPort=2181。它刻意不讲安装或生产配置。在解压后的 ZooKeeper 目录中启动本地 server,并使用自带客户端连接:

bin/zkServer.sh start
bin/zkCli.sh -server 127.0.0.1:2181

zk: 提示符下,创建临时 znode、读取它、列出父节点、修改它并删除它:

create /demo "hello"
get /demo
ls /
set /demo "hello again"
get /demo
delete /demo
quit

create 创建 znode,get 读取值,ls 列出子 znode,set 修改值,delete 删除空 znode。若 /demo 已存在,可先删除它,或换用其他临时路径。

完成后停止本地 server:

bin/zkServer.sh stop

下一步学习什么

应用通常通过 ZooKeeper client library,而不是手动输入 CLI 命令。在将它用于应用前,应了解 session、ephemeral znode、sequential znode、watch 与 ACL 如何影响 client 设计。

生产环境应使用单独评审过的部署设计,其中必须覆盖 ensemble 规模、网络访问、认证与 ACL、数据持久性、监控、备份和恢复;本新手教程不规定这些选择。