11.2.4 集群配置与启动

集群配置与启动的核心目标是形成稳定多数派并完成选主。建议先完成主机名解析、时间同步与防火墙放行,再下发一致的 zoo.cfg,仅 myid 不同。

集群原理草图(选主与通信端口):

文章图片

一、统一配置文件示例(所有节点一致)
文件路径:/opt/zookeeper/conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181

autopurge.snapRetainCount=10
autopurge.purgeInterval=24

server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888

参数解释要点:
- tickTime:基础心跳周期(ms)。
- initLimit:Follower 初次同步最大心跳数。
- syncLimit:运行中同步最大心跳数。
- dataDir/dataLogDir:快照与事务日志目录。
- clientPort:客户端连接端口。
- server.X:集群成员配置,X 必须与 myid 对应。

二、节点 myid 创建(每台不同)

# zk1
echo 1 | sudo tee /data/zookeeper/data/myid

# zk2
echo 2 | sudo tee /data/zookeeper/data/myid

# zk3
echo 3 | sudo tee /data/zookeeper/data/myid

说明:myid 为纯数字,必须与 server.X 的 X 一致,否则无法入列。

三、启动前检查(命令可直接执行)

# 1) 解析与时间
grep -E "zk1|zk2|zk3" /etc/hosts
timedatectl status

# 2) 端口是否占用
ss -lntp | egrep '2181|2888|3888' || echo "ports free"

# 3) 目录权限
ls -ld /data/zookeeper/data /data/zookeeper/log

预期效果:端口未占用;目录对 ZooKeeper 运行用户可读写。

四、启动与验证(建议先多数派)

# 在 zk1、zk2 启动
/opt/zookeeper/bin/zkServer.sh start

# 查看状态
/opt/zookeeper/bin/zkServer.sh status

# 在 zk3 启动
/opt/zookeeper/bin/zkServer.sh start
/opt/zookeeper/bin/zkServer.sh status

预期效果:
- 至少一台显示 leader,其余为 follower
- 若显示 standalone,说明未形成集群(多为配置或网络问题)。

五、systemd 启动示例(可选)

# /etc/systemd/system/zookeeper.service
[Unit]
Description=ZooKeeper
After=network.target

[Service]
Type=forking
User=zookeeper
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
LimitNOFILE=65535
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now zookeeper
systemctl status zookeeper

六、常见排错(含命令)
1) 端口被占用

ss -lntp | egrep '2181|2888|3888'
# 解决:停止占用进程或修改 zoo.cfg 端口

2) 无法选主,status 显示 standalone

grep -E "server\." /opt/zookeeper/conf/zoo.cfg
cat /data/zookeeper/data/myid
# 解决:确保 server.X 与 myid 对应,且三台配置一致

3) 日志报错 cannot open dataDir

ls -ld /data/zookeeper/data /data/zookeeper/log
# 解决:chown -R zookeeper:zookeeper /data/zookeeper

七、练习
1) 将 tickTime 改为 3000,重启集群并确认选主是否正常。
2) 故意将 zk3 的 myid 改为 4,观察 status 与日志变化并恢复。
3) 使用 ss -lntp 检查三端口通断,写出每个端口的作用解释。