本文是大数据系列第 26 篇,介绍 ZooKeeper 分布式协调框架的基本概念、集群角色划分与 3 节点部署实践。
什么是 ZooKeeper
ZooKeeper 是 Apache 开源的高可用分布式协调服务,常被类比为”分布式系统的管家”。它不存储业务数据,而是提供一套轻量、可靠的协调原语,让分布式应用之间能够就状态达成共识。
一致性保证(五项特性):
- 顺序一致性:来自同一客户端的更新请求按发送顺序执行
- 原子性:写操作要么全部成功,要么全部失败,不存在中间状态
- 单一视图:无论连接到哪个服务器,客户端看到的数据视图一致
- 可靠性:一旦变更被提交,结果将持久化,不会丢失
- 实时性:在一定时间窗口内,客户端最终能看到最新数据
典型应用场景:
- 统一命名服务:如 Dubbo 服务注册中心,通过 ZNode 路径标识服务地址
- 分布式配置管理:Solr 集群同步配置,变更后触发 Watcher 通知各节点
- 消息队列(Pub/Sub):利用顺序节点实现有序消息分发
- 分布式锁:顺序临时节点竞争锁,最小序号者获锁
- 集群管理:临时节点生命周期绑定会话,Session 断开即自动注销
数据模型:ZNode 树
ZooKeeper 以类 Unix 文件系统的树形结构组织数据,每个节点称为 ZNode。
- 路径以
/分隔,根节点为/ - 每个 ZNode 最多存储约 1 MB 数据(字节数组)
- 同时保存版本号、时间戳、ACL 等元数据
集群角色:Leader / Follower / Observer
| 角色 | 职责 |
|---|---|
| Leader | 处理所有写请求,驱动 ZAB 协议的事务广播 |
| Follower | 处理读请求,参与 Leader 选举投票 |
| Observer | 只处理读请求,不参与投票,用于水平扩展读能力 |
Leader 是唯一的写入入口,所有写操作必须经过 Leader 提交后,再同步给 Follower(和 Observer)。
ZAB 协议与奇数节点
ZooKeeper 使用 ZAB(ZooKeeper Atomic Broadcast) 协议保障数据一致性。事务提交需要超过半数节点(N/2 + 1)确认,这就要求节点数设置为奇数:
| 集群规模 | 可容忍故障节点数 |
|---|---|
| 3 节点 | 1 |
| 5 节点 | 2 |
| 7 节点 | 3 |
生产环境推荐 3 节点(小集群)或 5 节点(高可用集群)。
安装 ZooKeeper 3.8.4
本次实验使用 3 台云服务器:
| 主机 | 规格 |
|---|---|
| h121.wzk.icu | 2C4G |
| h122.wzk.icu | 2C4G |
| h123.wzk.icu | 2C2G |
1. 下载并解压
从 Apache 镜像下载 apache-zookeeper-3.8.4-bin.tar.gz,解压到 /opt/servers/。
2. 创建数据与日志目录
mkdir -p /opt/servers/apache-zookeeper-3.8.4-bin/data
mkdir -p /opt/servers/apache-zookeeper-3.8.4-bin/logs
3. 编写 zoo.cfg
将 conf/zoo_sample.cfg 复制为 conf/zoo.cfg,关键配置如下:
# 数据目录(存放快照)
dataDir=/opt/servers/apache-zookeeper-3.8.4-bin/data
# 日志目录(事务日志)
dataLogDir=/opt/servers/apache-zookeeper-3.8.4-bin/logs
# 客户端连接端口
clientPort=2181
# 基础心跳时间(毫秒)
tickTime=2000
# Follower 初始同步超时(tickTime 的倍数)
initLimit=5
# Follower 与 Leader 同步超时
syncLimit=2
# 每小时自动清理快照和日志
autopurge.purgeInterval=1
# 集群节点配置:server.id=host:quorum端口:选举端口
server.1=h121.wzk.icu:2888:3888
server.2=h122.wzk.icu:2888:3888
server.3=h123.wzk.icu:2888:3888
4. 配置 myid
每个节点的 data 目录下创建 myid 文件,写入对应的节点 ID:
# h121 上执行
echo 1 > /opt/servers/apache-zookeeper-3.8.4-bin/data/myid
# h122 上执行
echo 2 > /opt/servers/apache-zookeeper-3.8.4-bin/data/myid
# h123 上执行
echo 3 > /opt/servers/apache-zookeeper-3.8.4-bin/data/myid
5. 启动并验证
三台机器分别执行:
/opt/servers/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start
查看各节点状态:
zkServer.sh status
预期输出中,一台显示 Mode: leader,其余两台显示 Mode: follower。
小结
ZooKeeper 通过 ZAB 协议和 Leader 集中写入模型,在分布式环境下提供了强一致的协调能力。3 节点集群是最常见的起步配置,掌握 zoo.cfg 核心参数和 myid 配置是集群运维的基础。下一篇将深入 ZNode 数据结构与 Watcher 监听机制。