Zookeeper 的安装及使用

摘要

Zookeeper 简介

  • ZooKeeper 是一个集中式服务,用于:

    • 维护配置信息
    • 提供命名服务
    • 实现分布式同步
    • 提供集群管理服务
  • ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。

  • 不同于文件系统,每个节点都可以保存数据,每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识,每个节点都有一个版本(version),版本从0开始计数。

Zookeeper 安装

  • 运行 Zookeeper 需要安装 JDK1.8+。我这里使用 OpenJDK11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo mkdir -p /usr/local/jdk
cd /usr/local/jdk
sudo wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/11/jdk/x64/linux/OpenJDK11U-jdk_x64_linux_hotspot_11.0.28_6.tar.gz
sudo tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.28_6.tar.gz
sudo ln -s jdk-11.0.28+6 jdk11
# 配置环境变量
vim /etc/profile # 添加如下内容
export JAVA_HOME=/usr/local/jdk/jdk11
export PATH=$JAVA_HOME/bin:$PATH
# 立即生效
source /etc/profile
# 查看java版本
java -version
openjdk version "11.0.28" 2025-07-15
OpenJDK Runtime Environment Temurin-11.0.28+6 (build 11.0.28+6)
OpenJDK 64-Bit Server VM Temurin-11.0.28+6 (build 11.0.28+6, mixed mode)

单机安装

1
2
3
4
5
6
# 下载
wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.4/apache-zookeeper-3.8.4-bin.tar.gz
# 解压
tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz
# 配置个软连接,方便以后升级
ln -s apache-zookeeper-3.8.4-bin zookeeper
  • 修改配置文件

1
2
3
4
cd zookeeper/conf
cp zoo_sample.cfg zoo.cfg
# 建议修改 zoo.cfg 配置文件,将 dataDir=/tmp/zookeeper 修改为指定的data目录
vim zoo.cfg

zoo.cfg 参数说明

配置项 说明 默认值 单位 / 备注
tickTime ZooKeeper 时间配置中的基本单位 2000 毫秒
initLimit follower 初始化连接到 leader 的最大时长,单位为 tickTime 倍数 10 10 × tickTime = 20000 ms
syncLimit follower 与 leader 数据同步的最大时长,单位为 tickTime 倍数 5 5 × tickTime = 10000 ms
dataDir 数据和日志存储目录(未指定 dataLogDir 时,日志也会保存在此目录) /tmp/zookeeper 目录路径
clientPort 客户端连接 ZooKeeper 的端口号 2181 默认 2181
maxClientCnxns 单个客户端最大并发连接数 60 超过限制后新连接会被拒绝
autopurge.snapRetainCount 快照文件保留个数,超过数量的将会被清理 3 默认 3
autopurge.purgeInterval 清理任务执行间隔时间,单位小时,0 表示不自动清理 1 1 小时
  • 启动 zookeeper

1
2
3
4
5
6
7
8
9
10
11
12
cd zookeeper
# 启动
bin/zkServer.sh start
# 指定配置文件
bin/zkServer.sh start conf/zoo.cfg

# 停止
bin/zkServer.sh stop
# 查看状态
bin/zkServer.sh status
# 查看版本
./bin/zkServer.sh version

集群安装

ZooKeeper 集群角色

1. Leader(领导者)
  • 职责:

    • 事务请求(写操作)的唯一调度者和处理者,保证集群事务处理的顺序性;
    • 集群内部各个服务器的调度者;
    • 对于 createsetDatadelete 等写操作请求,统一转发给 Leader 处理;
    • Leader 负责决定编号、执行操作,这个过程称为 事务
  • 三台虚拟机 zoo.cfg 文件末尾添加配置,启动时会自动选举出 Leader 角色,则其余就是 Follower 角色。

1
2
3
server.1=10.250.0.229:2888:3888
server.2=10.250.0.152:2888:3888
server.3=10.250.0.36:2888:3888
2. Follower(跟随者)
  • 职责:

    • 处理客户端非事务(读操作)请求(可以直接响应);
    • 转发事务请求给 Leader;
    • 参与集群 Leader 选举投票。

leader节点可以处理读写请求,follower只可以处理读请求。follower在接到写请求时会把写请求转发给leader来处理。

3. Observer(观察者)
  • 职责:

    • 对于非事务请求(读操作)可以独立处理;
    • 对于事务请求会转发给 Leader 处理;
    • 接收来自 Leader 的 inform 信息,更新本地存储;
    • 不参与提交和选举投票;
    • 通常用于 提升集群非事务处理能力,不影响集群事务处理性能。
  • 配置一个 ID 为 4 的观察者节点:

1
server.4=10.250.0.56:2888:3888:observer

集群搭建

  • 环境准备:4台服务器,按照 单机安装 的方式准备好 Zookeeper 环境

1
2
3
4
10.250.0.229
10.250.0.152
10.250.0.36
10.250.0.56
  • zoo.cfg 文件末尾添加配置

1
2
3
4
server.1=10.250.0.229:2888:3888
server.2=10.250.0.152:2888:3888
server.3=10.250.0.36:2888:3888
server.4=10.250.0.56:2888:3888:observer
  • 分别在 dataDir 目录下创建 myid 文件,在文件中添加与 server 对应的编号(注意:上下不要有空行,左右不要有空格)

  • 分别启动 Zookeeper 服务器

1
2
3
4
5
# 分别启动4个节点的zookeeper server
bin/zkServer.sh start

# 查看状态,可以看到节点角色类型
bin/zkServer.sh status

ZooKeeper 默认端口说明

端口 用途 说明
2181 客户端连接端口 客户端通过这个端口访问 ZooKeeper
2888 集群内部通信 follower 与 leader 之间同步数据
3888 leader 选举端口 集群选举 leader 使用
8080 (可选) admin/metrics web端口 如果开启了 adminServer
1
2
3
4
5
6
7
8
9
10
11
12
# 永久开启端口
sudo firewall-cmd --permanent --add-port=2181/tcp
sudo firewall-cmd --permanent --add-port=2888/tcp
sudo firewall-cmd --permanent --add-port=3888/tcp
# 如果使用 adminServer
sudo firewall-cmd --permanent --add-port=8080/tcp

# 重新加载防火墙配置
sudo firewall-cmd --reload

# 查看是否开放成功
sudo firewall-cmd --list-all

客户端连接

  • 命令行

1
2
3
4
# 默认连接 127.0.0.1:2181
bin/zkCli.sh
# 指定 -server ip:port,如果是集群,则连接任意一个节点,ZooKeeper 会自动处理与 Leader/Follower 的交互
bin/zkCli.sh -server 127.0.0.1:2181

客户端命令简介:参考官网

命令 语法示例 功能描述 常用参数及说明 示例
help help 显示所有操作命令 help
quit quit 退出客户端 quit
ls ls [-s] [-w] [-R] path 查看节点的子节点 - -w: 监听子节点变化
- -s: 显示节点状态信息
- -R: 递归查看
ls -s -w /zk_test
create create [-s] [-e] [-c] [-t ttl] path [data] [acl] 创建节点 - -s: 顺序节点
- -e: 临时节点
- -c: 容器节点
- -t ttl: TTL节点,单位毫秒
create -e /zk_test_ephemeral "temp_data"
get get [-s] [-w] path 获取节点数据信息 - -s: 显示节点状态信息
- -w: 监听节点变化
get -s -w /zk_test
set set [-s] [-v version] path data 设置节点数据 - -s: 顺序节点
- -v: 指定版本号
set /zk_test "new_data"
getAcl getAcl [-s] path 获取节点访问控制信息 - -s: 显示节点状态信息 getAcl /zk_test
setAcl setAcl [-s] [-v version] [-R] path acl 设置节点访问控制列表 - -s: 显示节点状态信息
- -v: 指定版本号
- -R: 递归设置
setAcl /zk_test world:anyone:r
stat stat [-w] path 查看节点状态信息 - -w: 监听节点变化 stat -w /zk_test
delete delete [-v version] path 删除某一节点(无子节点) - -v: 节点版本号 delete /zk_test
deleteall deleteall path 递归删除某一节点及其子节点 deleteall /zk_test
setquota setquota [-n] [-b] val path 对节点增加限制 - -n: 子节点最大个数
- -b: 数据值最大长度,-1 表示无限制
setquota -n 5 /zk_test
  • GUI 工具

名称 类型 / 运行方式 优点 注意事项
PrettyZoo 桌面应用(JavaFX)(GitHub) 支持 Mac/Windows/Linux,界面友好;支持节点创建/删除/更新/查询,ACL 管理,多 ZK 实例管理,SSH 隧道等功能。(GitHub) 项目已经 archived,维护可能不活跃。最新版可能在兼容性或 Bug 修复方面不如活跃项目。也可能需要自己构建或调试。(GitHub)
ZooNavigator Web 界面 + 可 Docker 部署或本地启动(GitHub) 功能丰富;支持多个 Zookeeper 版本(如 3.5.x ~ 3.9.x);浏览 / 编辑 /搜索节点;导入导出配置;支持浏览器访问,无需本地 heavy GUI。(GitHub) 因为 Web 应用,可能对浏览器安全策略与网络延迟敏感;需要部署自己版本或 Docker;如果要求本地脱机操作时,有些功能可能稍不如桌面应用。
ZooKeeper Assistant 桌面/管理员面板类型(支持监控界面等)(DEV Community) 除了浏览节点树以外,还提供健康状态监控(延迟、请求数等)、不同数据格式支持(JSON/XML 等)、导入/导出节点数据、命令行操作集成。(DEV Community) 有些功能可能在 Mac 上兼容性或视觉体验需要调试;具体版本支持情况要看最近更新。某些监控界面可能依赖于 ZK 的指标或插件。

Zookeeper 节点类型

节点类型 生命周期说明 创建命令示例 特点说明
持久节点 (Persistent) 节点一直存在,除非手动删除,即使客户端会话关闭,节点也不会消失 create /locks 适合存储配置信息、元数据等持久数据
临时节点 (Ephemeral) 客户端会话关闭(异常或超时)时,节点自动被删除 create -e /locks/DBLock 常用于分布式锁、临时会话数据
有序节点 (Sequential) 在持久或临时节点基础上,增加有序编号,ZooKeeper 自动在节点名后加递增序号 create -e -s /jobs/job 常用于分布式锁、队列等需要顺序的场景
容器节点 (Container) V3.5.3+,当容器节点下的最后一个子节点被删除后,容器节点也会自动删除 create -c /work 适合分布式任务临时目录、动态数据目录
TTL 节点 (TTL) 在指定 TTL 时间内未修改且无子节点,节点会被自动删除(需开启 extendedTypesEnabled=true 配置) create -t 3000 /ttl_node 适合临时缓存、临时状态数据,过期自动清理
  • 注意

    • 同一级节点 key 名称是唯一的
    • 创建节点时,必须要带上全路径