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 检查三端口通断,写出每个端口的作用解释。