本文是大数据系列第 27 篇,对 ZooKeeper 集群配置文件 zoo.cfg 的每个参数进行详细说明,并演示完整的启动与验证流程。

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

实验环境

主机规格角色(启动后)
h121.wzk.icu2C4GFollower
h122.wzk.icu2C4GLeader
h123.wzk.icu2C2GFollower

zoo.cfg 完整配置解析

# ---- 数据存储 ----
# 存放内存快照(snapshot)的目录
dataDir=/opt/servers/apache-zookeeper-3.8.4-bin/data

# 存放事务日志(WAL)的目录,建议与 dataDir 分开以避免 I/O 竞争
dataLogDir=/opt/servers/apache-zookeeper-3.8.4-bin/logs

# ---- 网络 ----
# 客户端连接端口,默认 2181
clientPort=2181

# ---- 时间参数 ----
# ZooKeeper 基础时间单元(毫秒),Session 超时、心跳均基于此计算
tickTime=2000

# Follower 初始连接 Leader 的超时上限 = initLimit × tickTime = 10 秒
initLimit=5

# Follower 与 Leader 之间同步心跳超时 = syncLimit × tickTime = 4 秒
# 超过此时间未响应的 Follower 将被踢出集群
syncLimit=2

# ---- 自动清理 ----
# 快照和日志保留份数(至少保留 3 份)
autopurge.snapRetainCount=3

# 自动清理周期(小时),0 表示不清理,1 表示每小时清理一次
autopurge.purgeInterval=1

# ---- 集群节点 ----
# 格式:server.<myid>=<host>:<quorum端口>:<选举端口>
# quorum 端口(2888):Follower 与 Leader 同步数据
# 选举端口(3888):Leader 选举通信
server.1=h121.wzk.icu:2888:3888
server.2=h122.wzk.icu:2888:3888
server.3=h123.wzk.icu:2888:3888

参数说明要点

tickTime:所有超时计算的基准。客户端 Session 超时默认为 2 × tickTime20 × tickTime(由客户端协商)。

initLimit vs syncLimit

  • initLimit:Follower 首次连接 Leader 并完成数据同步的最长等待时间。数据量大时需调大。
  • syncLimit:正常运行中 Follower 与 Leader 心跳检测超时。超时 Follower 将被移出 quorum。

双端口设计

  • 2888(quorum 端口):数据同步,仅 Follower → Leader 方向
  • 3888(选举端口):Leader 选举阶段使用,选举完成后基本空闲

myid 文件配置

myid 是 ZooKeeper 识别集群成员身份的唯一标识,必须与 zoo.cfgserver.<id> 的 id 一一对应。

# 确认 dataDir 目录存在
ls /opt/servers/apache-zookeeper-3.8.4-bin/data/

# 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

注意:myid 文件中只能有一个数字,末尾不能有空行,否则启动会报错。

集群启动流程

三台机器分别执行(顺序不影响最终结果,但建议逐台启动方便排查):

/opt/servers/apache-zookeeper-3.8.4-bin/bin/zkServer.sh start

启动过程中的状态变化:

  1. 第 1 台启动后,只有 1 个节点,无法形成 quorum,处于 LOOKING 状态
  2. 第 2 台启动后,2 个节点超过半数(3/2+1=2),触发 Leader 选举,产生 Leader
  3. 第 3 台启动后,加入已有集群,成为 Follower

验证集群状态

# 查看各节点角色
zkServer.sh status

预期输出示例:

# h121
Mode: follower

# h122
Mode: leader

# h123
Mode: follower

查看启动日志:

tail -f /opt/servers/apache-zookeeper-3.8.4-bin/logs/zookeeper-root-server-h121.out

日志中出现 LEADINGFOLLOWING 字样,表示选举完成。

客户端连接测试

# 连接任意节点
/opt/servers/apache-zookeeper-3.8.4-bin/bin/zkCli.sh -server h121.wzk.icu:2181

# 验证根节点
ls /

# 预期输出
[zookeeper]

防火墙端口放行

集群节点之间需要放行以下端口(注意区分客户端端口和集群内部端口):

端口用途
2181客户端连接
2888Follower 与 Leader 数据同步
3888Leader 选举通信

常见问题排查

Q:启动后节点一直处于 LOOKING 状态

  • 检查 myid 文件内容是否正确
  • 检查各节点的 zoo.cfg 是否完全一致(server.x 配置)
  • 检查防火墙是否放行 2888/3888 端口

Q:日志报 Cannot open channel to X at election address

  • 节点间 hostname 解析失败,检查 /etc/hosts 配置

小结

zoo.cfg 的核心是三组参数:存储路径(dataDir/dataLogDir)、时间参数(tickTime/initLimit/syncLimit)、集群拓扑(server.x)。配合唯一的 myid 文件,ZooKeeper 即可完成自动选举并对外提供服务。