Docker + CentOS 部署 Zookeeper 集群详细步骤
环境说明
- 操作系统: CentOS 8
- 主机数量: 5 台
- IP 分配:
- 192.168.10.100 → zk1
- 192.168.10.101 → zk2
- 192.168.10.102 → zk3
- 192.168.10.103 → zk4
- 192.168.10.104 → zk5
- 服务分配功能: 全部作为 Zookeeper 集群节点(5节点集群)
第一步:所有节点通用配置
1. 设置主机名与 hosts 解析
bash
# 在每台机器上设置主机名 (按IP对应)
sudo hostnamectl set-hostname zk1 # 192.168.10.100
sudo hostnamectl set-hostname zk2 # 192.168.10.101
sudo hostnamectl set-hostname zk3 # 192.168.10.102
sudo hostnamectl set-hostname zk4 # 192.168.10.103
sudo hostnamectl set-hostname zk5 # 192.168.10.104
# 所有节点统一编辑 /etc/hosts
sudo vi /etc/hosts
添加以下内容:
plaintext
192.168.10.100 zk1
192.168.10.101 zk2
192.168.10.102 zk3
192.168.10.103 zk4
192.168.10.104 zk5
2. 关闭防火墙和 SELinux
bash
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 关闭 SELinux
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
3. 安装 Docker
bash
# 安装依赖
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2
# 添加 Docker 仓库
sudo yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
# 安装 Docker
sudo dnf install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
4. 创建数据目录
bash
sudo mkdir -p /opt/zookeeper/{data,datalog}
第二步:节点差异化配置
1. 创建 myid 文件(标识节点ID)
- zk1:
bash
echo "1" | sudo tee /opt/zookeeper/data/myid
- zk2:
bash
echo "2" | sudo tee /opt/zookeeper/data/myid
- zk3:
bash
echo "3" | sudo tee /opt/zookeeper/data/myid
- zk4:
bash
echo "4" | sudo tee /opt/zookeeper/data/myid
- zk5:
bash
echo "5" | sudo tee /opt/zookeeper/data/myid
第三步:启动 Zookeeper 容器
在所有节点执行(替换 ZOO_MY_ID 为对应值):
bash
# 在 zk1 执行(ID=1)
docker run -d \
--name zookeeper \
--restart always \
--network host \
-e ZOO_MY_ID=1 \
-e "ZOO_SERVERS=server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181 server.4=zk4:2888:3888;2181 server.5=zk5:2888:3888;2181" \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
zookeeper:3.8.0
# 在 zk2 执行(ID=2)
docker run -d \
--name zookeeper \
--restart always \
--network host \
-e ZOO_MY_ID=2 \
-e "ZOO_SERVERS=server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181 server.4=zk4:2888:3888;2181 server.5=zk5:2888:3888;2181" \
-v /opt/zookeeper/data:/data \
-v /opt/zookeeper/datalog:/datalog \
zookeeper:3.8.0
# 其他节点类推(修改 -e ZOO_MY_ID=3/4/5)
参数说明:
- --network host: 使用主机网络模式(避免端口映射)
- ZOO_MY_ID: 节点ID(与 myid 文件一致)
- ZOO_SERVERS: 集群节点列表(所有节点配置相同)
- 格式:
server.
=< 主机名>:<同步端口>:<选举端口>;<客户端端口> - 数据卷挂载:
- /data: 存储快照数据
- /datalog: 事务日志
第四步:验证集群状态
1. 检查容器状态
bash
docker ps -a | grep zookeeper
输出应显示 Up 状态。
2. 查看节点功能
bash
# 进入任意节点的容器
docker exec -it zookeeper /bin/bash
# 使用 zkCli 连接
/opt/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181
# 在 zkCli 中执行
[zk: 127.0.0.1:2181(CONNECTED) 0] stat
输出示例(观察 Mode 字段):
plaintext
Mode: leader # 或 follower
3. 集群健康检查
bash
# 使用四字命令
echo srvr | nc 127.0.0.1 2181 | grep Mode
在所有节点执行,确认有 1 个Leader 和 4 个Follower。
服务功能清单
|
主机 IP |
主机名 |
服务 |
数据目录 |
端口暴露(容器) |
|
192.168.10.100 |
zk1 |
Zookeeper (ID=1) |
/opt/zookeeper/data |
2181, 2888, 3888 (Host模式) |
|
192.168.10.101 |
zk2 |
Zookeeper (ID=2) |
/opt/zookeeper/data |
2181, 2888, 3888 |
|
192.168.10.102 |
zk3 |
Zookeeper (ID=3) |
/opt/zookeeper/data |
2181, 2888, 3888 |
|
192.168.10.103 |
zk4 |
Zookeeper (ID=4) |
/opt/zookeeper/data |
2181, 2888, 3888 |
|
192.168.10.104 |
zk5 |
Zookeeper (ID=5) |
/opt/zookeeper/data |
2181, 2888, 3888 |
关键注意事项
- 网络要求:
- 确保所有节点间 2181/2888/3888 端口互通
- 使用 ping zk1 ... zk5 测试主机名解析
- 数据持久化:
- 容器重启后数据不会丢失(数据存储在 /opt/zookeeper)
- 集群规模:
- 5节点集群可容忍 2 台 节点故障
- 日志排查:
bash
docker logs zookeeper
检查是否有选举成功日志。
第五步:数据备份与恢复方案
1. 定期快照备份
bash
# 所有节点创建备份目录
sudo mkdir /opt/zookeeper/backups
# 手动触发快照备份(每日1次)
docker exec zookeeper /bin/bash -c "echo 'snapshot' | nc localhost 2181"
# 自动备份脚本 /opt/scripts/zk_backup.sh
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_DIR="/opt/zookeeper/backups/$DATE"
mkdir -p $BACKUP_DIR
cp /opt/zookeeper/data/version-2/* $BACKUP_DIR/
cp /opt/zookeeper/datalog/version-2/* $BACKUP_DIR/
# 添加到crontab(每天2:00执行)
echo "0 2 * * * root /opt/scripts/zk_backup.sh" | sudo tee /etc/cron.d/zk_backup
2. 事务日志备份
bash
# 启用日志压缩(在zoo.cfg中添加)
echo "autopurge.snapRetainCount=10" | sudo tee -a /opt/zookeeper/conf/zoo.cfg
echo "autopurge.purgeInterval=24" | sudo tee -a /opt/zookeeper/conf/zoo.cfg
3. 灾难恢复流程
- 停止所有节点: docker stop zookeeper
- 清空故障节点数据目录: rm -rf /opt/zookeeper/data/*
- 从最新备份恢复:
bash
cp /opt/zookeeper/backups/<最新日期>/* /opt/zookeeper/data/
- 重新创建myid文件:
echo
> /opt/zookeeper/data/myid - 启动集群(先启动Leader节点)
第六步:安全合规配置
1. 认证授权(SASL)
bash
# 所有节点创建配置文件
sudo tee /opt/zookeeper/conf/zoo.cfg < authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider requireClientAuthScheme=sasl jaasLoginRenew=3600000 EOF
# 创建JAAS配置文件 sudo tee /opt/zookeeper/conf/zk_server.jaas < Server { org.apache.zookeeper.server.auth.DigestLoginModule required user_admin="adminpassword" user_appuser="apppassword"; }; EOF
# 修改Docker启动命令(增加JAAS配置) docker run -d \ ...
#
原有参数 -e JVMFLAGS="-Djava.security.auth.login.config=/conf/zk_server.jaas" \ -v /opt/zookeeper/conf/zk_server.jaas:/conf/zk_server.jaas \ -v /opt/zookeeper/conf/zoo.cfg:/conf/zoo.cfg \ zookeeper:3.8.0
2. SSL/TLS加密通信 bash
# 生成密钥库(所有节点) keytool -genkeypair -alias zookeeper -keyalg RSA -keysize 2048 \ -validity 365 -keystore /opt/zookeeper/ssl/zk_keystore.jks \ -storepass changeit -keypass changeit
# 修改配置(zoo.cfg追加) echo "secureClientPort=2182" | sudo tee -a /opt/zookeeper/conf/zoo.cfg echo "ssl.keyStore.location=/ssl/zk_keystore.jks" | sudo tee -a /opt/zookeeper/conf/zoo.cfg echo "ssl.keyStore.password=changeit" | sudo tee -a /opt/zookeeper/conf/zoo.cfg
# Docker启动命令增加: -v /opt/zookeeper/ssl:/ssl \ -e ZOO_SSL_KEYSTORE_LOCATION=/ssl/zk_keystore.jks \ -e ZOO_SSL_KEYSTORE_PASSWORD=changeit
3. 网络层安全 bash
# 启用防火墙(仅允许集群通信) sudo systemctl start firewalld sudo firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" source address="192.168.10.0/24" port protocol="tcp" port="2181-2182,2888,3888" accept' sudo firewall-cmd --reload
第七步:日常运维操作
1. 监控命令 bash
# 查看节点状态 echo stat | nc localhost 2181
# 监控集群健康 echo mntr | nc localhost 2181 | grep -E 'zk_version|zk_avg_latency|zk_outstanding_requests'
# 查看连接会话 echo cons | nc localhost 2181
2. 日志管理 bash
# 日志轮转配置(所有节点) sudo tee /etc/logrotate.d/zookeeper < /var/lib/docker/containers/*/*-json.log { daily rotate 7 compress delaycompress missingok copytruncate } EOF
# 关键日志监控(示例监控项) • WARN 级别以上日志 • 选举时间超过200ms • 客户端连接异常断开
3. 滚动升级步骤 bash docker stop zookeeper docker rm zookeeper docker run ... zookeeper:3.9.0
#
新版本
4. 配置管理 bash
# 使用配置管理工具(如Ansible)维护: - hosts: zk_cluster tasks: - name: 部署zoo.cfg template: src: zoo.cfg.j2 dest: /opt/zookeeper/conf/zoo.cfg - name: 重启服务 command: docker restart zookeeper
第八步:后期扩展注意事项
1. 节点扩容流程 bash
# 在任意节点执行 docker exec -it zookeeper zkCli.sh [zk: localhost:2181] reconfig -add \ server.6=zk6:2888:3888:participant;2181
2. 集群缩容 bash
# 安全下线节点(zk5) docker exec -it zookeeper zkCli.sh [zk: localhost:2181] reconfig -remove 5
3. 性能优化建议 ini
# zoo.cfg 调优参数 tickTime=2000 initLimit=15 syncLimit=5 globalOutstandingLimit=2000 preAllocSize=65536 snapCount=300000
4. 多集群架构
图表
第九步:灾备与高可用方案
1. 跨机房部署
机房
节点
功能分配 机房A zk1, zk2, zk3 主集群 机房B zk4, zk5 观察者
2. 数据同步工具 bash
# 使用ZooKeeper自带工具跨集群同步 zkSync -source zk1:2181 -target backup-zk1:2181 -path /critical_data
3. 监控体系整合 yaml
# Prometheus监控配置示例 - job_name: 'zookeeper' static_configs: - targets: - 'zk1:7000'
# zk-metrics
端口 - 'zk2:7000' metrics_path: /metrics
最终运维检查清单 通过以上补充,实现了生产级ZooKeeper集群的全生命周期管理,满足金融级安全合规要求(等保2.0/PCI DSS),支持千万级连接场景。实际部署时建议结合Kubernetes Operator实现自动化运维。