本文是大数据系列第 26 篇,介绍 ZooKeeper 分布式协调框架的基本概念、集群角色划分与 3 节点部署实践。

完整图文版(含截图):CSDN 原文 | 掘金

什么是 ZooKeeper

ZooKeeper 是 Apache 开源的高可用分布式协调服务,常被类比为”分布式系统的管家”。它不存储业务数据,而是提供一套轻量、可靠的协调原语,让分布式应用之间能够就状态达成共识。

一致性保证(五项特性):

  • 顺序一致性:来自同一客户端的更新请求按发送顺序执行
  • 原子性:写操作要么全部成功,要么全部失败,不存在中间状态
  • 单一视图:无论连接到哪个服务器,客户端看到的数据视图一致
  • 可靠性:一旦变更被提交,结果将持久化,不会丢失
  • 实时性:在一定时间窗口内,客户端最终能看到最新数据

典型应用场景:

  1. 统一命名服务:如 Dubbo 服务注册中心,通过 ZNode 路径标识服务地址
  2. 分布式配置管理:Solr 集群同步配置,变更后触发 Watcher 通知各节点
  3. 消息队列(Pub/Sub):利用顺序节点实现有序消息分发
  4. 分布式锁:顺序临时节点竞争锁,最小序号者获锁
  5. 集群管理:临时节点生命周期绑定会话,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.icu2C4G
h122.wzk.icu2C4G
h123.wzk.icu2C2G

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 监听机制。