Docker + CentOS 部署 Zookeeper 集群详细步骤
环境说明
第一步:所有节点通用配置
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)
bash
echo "1" | sudo tee /opt/zookeeper/data/myid
bash
echo "2" | sudo tee /opt/zookeeper/data/myid
bash
echo "3" | sudo tee /opt/zookeeper/data/myid
bash
echo "4" | sudo tee /opt/zookeeper/data/myid
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)
参数说明:
第四步:验证集群状态
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 |
关键注意事项
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. 灾难恢复流程
bash
cp /opt/zookeeper/backups/<最新日期>/* /opt/zookeeper/data/
第六步:安全合规配置
1. 认证授权(SASL)
bash
# 所有节点创建配置文件
sudo tee /opt/zookeeper/conf/zoo.cfg <<EOF
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
requireClientAuthScheme=sasl
jaasLoginRenew=3600000
EOF
# 创建JAAS配置文件
sudo tee /opt/zookeeper/conf/zk_server.jaas <<EOF
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 <<EOF
/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实现自动化运维。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29726860/viewspace-3090468/ ,如需转载,请注明出处,否则将追究法律责任。