Zookeeper 的安装及使用
摘要
-
本文介绍 CentOS8 中 Zookeeper 的安装与使用。
Zookeeper 简介
-
ZooKeeper 是一个集中式服务,用于:
- 维护配置信息
- 提供命名服务
- 实现分布式同步
- 提供集群管理服务
-
ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。
-
不同于文件系统,每个节点都可以保存数据,每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识,每个节点都有一个版本(version),版本从0开始计数。
Zookeeper 安装
-
运行 Zookeeper 需要安装 JDK1.8+。我这里使用 OpenJDK11
1 | sudo mkdir -p /usr/local/jdk |
单机安装
-
下载 Zookeeper,目前最新的稳定版本为
3.8.4
1 | # 下载 |
-
修改配置文件
1 | cd zookeeper/conf |
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 | cd zookeeper |
集群安装
ZooKeeper 集群角色
1. Leader(领导者)
-
职责:
- 事务请求(写操作)的唯一调度者和处理者,保证集群事务处理的顺序性;
- 集群内部各个服务器的调度者;
- 对于
create
、setData
、delete
等写操作请求,统一转发给 Leader 处理; - Leader 负责决定编号、执行操作,这个过程称为 事务。
-
三台虚拟机 zoo.cfg 文件末尾添加配置,启动时会自动选举出 Leader 角色,则其余就是 Follower 角色。
1 | server.1=10.250.0.229: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 | 10.250.0.229 |
-
zoo.cfg
文件末尾添加配置
1 | server.1=10.250.0.229:2888:3888 |
-
分别在
dataDir
目录下创建myid
文件,在文件中添加与 server 对应的编号(注意:上下不要有空行,左右不要有空格) -
分别启动 Zookeeper 服务器
1 | # 分别启动4个节点的zookeeper server |
ZooKeeper 默认端口说明
端口 | 用途 | 说明 |
---|---|---|
2181 | 客户端连接端口 | 客户端通过这个端口访问 ZooKeeper |
2888 | 集群内部通信 | follower 与 leader 之间同步数据 |
3888 | leader 选举端口 | 集群选举 leader 使用 |
8080 (可选) | admin/metrics web端口 | 如果开启了 adminServer |
1 | # 永久开启端口 |
客户端连接
-
命令行
1 | # 默认连接 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 名称是唯一的
- 创建节点时,必须要带上全路径