深色模式
Zookeeper 运维
摘要:ZooKeeper 为分布式系统提供选主、配置管理与分布式锁,靠"过半数(quorum)"保证一致性。本文部署一个三节点集群,讲清 Leader 选举过程,并给出四字命令巡检、数据目录维护与故障处置方法。
适用环境
bash
java -version 2>&1 | head -1 # ZooKeeper 需要 JDK 8/11/17
nproc; free -g # 建议 2C4G 起,独立磁盘放事务日志
hostname # 三节点主机名要能互相解析
# 到 https://zookeeper.apache.org/releases.html 核对版本后下载1
2
3
4
5
2
3
4
5
操作步骤
1. 安装与目录规划
bash
sudo tar -xzf apache-zookeeper-3.9.2-bin.tar.gz -C /opt
sudo ln -sfn /opt/apache-zookeeper-3.9.2-bin /opt/zookeeper
sudo mkdir -p /data/zookeeper/{data,log}
sudo useradd -r -s /sbin/nologin zookeeper 2>/dev/null || true
sudo chown -R zookeeper:zookeeper /data/zookeeper /opt/apache-zookeeper-3.9.2-bin1
2
3
4
5
2
3
4
5
2. 写集群配置(三节点除 dataDir/myid 外一致)
properties
# /opt/zookeeper/conf/zoo.cfg
tickTime=2000
initLimit=10 # Follower 初始连接 Leader 的超时(tickTime 倍数)
syncLimit=5 # Follower 与 Leader 同步的超时
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log # 事务日志独立磁盘,显著提升性能
clientPort=2181
maxClientCnxns=200
autopurge.snapRetainCount=10
autopurge.purgeInterval=6 # 每 6 小时自动清理快照
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:38881
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
端口含义:2181 客户端连接,2888 Follower 与 Leader 数据同步,3888 选举通信。
3. 写入 myid(每台机器的编号必须与 server.N 对应)
bash
echo 1 | sudo tee /data/zookeeper/data/myid # zk1 写 1,zk2 写 2,zk3 写 3
sudo chown zookeeper:zookeeper /data/zookeeper/data/myid1
2
2
4. 启动集群
bash
sudo tee /etc/systemd/system/zookeeper.service <<'EOF'
[Unit]
Description=Apache ZooKeeper
After=network.target
[Service]
User=zookeeper
Type=forking
Environment=ZOO_LOG_DIR=/data/zookeeper/log
ExecStart=/opt/zookeeper/bin/zkServer.sh start
ExecStop=/opt/zookeeper/bin/zkServer.sh stop
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now zookeeper
sudo /opt/zookeeper/bin/zkServer.sh status1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
5. 理解选举与过半机制
- 集群节点数必须为奇数:3 节点容忍 1 台故障,5 节点容忍 2 台。
- Leader 只有在获得过半数节点投票后才能确立;不足半数时集群拒绝写入。
- 启动顺序无关紧要,先启动的节点会互相投票选出 Leader。
6. 基本数据操作
bash
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
[zk: 127.0.0.1:2181] create /demo hello
[zk: 127.0.0.1:2181] get /demo
[zk: 127.0.0.1:2181] ls /
[zk: 127.0.0.1:2181] delete /demo1
2
3
4
5
2
3
4
5
验证
bash
# 1) 三节点角色(应恰好一个 leader,其余 follower)
for h in zk1 zk2 zk3; do echo -n "$h: "; echo srvr | nc $h 2181 | grep Mode; done
# 2) 四字命令巡检
echo stat | nc 127.0.0.1 2181 | head -10 # 连接数、延迟、节点模式
echo ruok | nc 127.0.0.1 2181 # 返回 imok 表示存活
echo mntr | nc 127.0.0.1 2181 | head -15 # 关键监控指标
echo conf | nc 127.0.0.1 2181 # 运行中配置
# 3) 数据一致性:在 leader 上写,在 follower 上读1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
常见坑
WARNING
四字命令(如 srvr、mntr)在 3.5+ 版本默认被白名单限制,需要配置 4lw.commands.whitelist=srvr,mntr,ruok,stat 才能使用,否则返回 ... is not executed because it is not in the whitelist。
WARNING
myid 与 server.N 不匹配、或 myid 文件内容有空格/换行,节点会一直停留在 LOOKING 状态无法完成选举。
DANGER
事务日志(dataLogDir)与快照(dataDir)放在同一块慢盘或未开启 autopurge,磁盘会被快照撑爆,进而导致集群整体不可用。务必开启自动清理并监控磁盘。