Docker + CentOS 部署 Zookeeper 集群详细操作步骤

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


关键注意事项

  1. 网络要求:
    • 确保所有节点间  2181/2888/3888 端口互通
    • 使用  ping zk1 ...  zk5 测试主机名解析
  2. 数据持久化:
    • 容器重启后数据不会丢失(数据存储在  /opt/zookeeper
  3. 集群规模:
    • 5节点集群可容忍  2  节点故障
  4. 日志排查:

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. 灾难恢复流程

  1. 停止所有节点: docker stop zookeeper
  2. 清空故障节点数据目录: rm -rf /opt/zookeeper/data/*
  3. 从最新备份恢复:

bash

cp /opt/zookeeper/backups/<最新日期>/* /opt/zookeeper/data/

  1. 重新创建myid文件: echo >      /opt/zookeeper/data/myid
  2. 启动集群(先启动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. 滚动升级步骤

  1. 从Follower节点开始逐个升级:

bash

docker stop zookeeper

docker rm zookeeper

docker run ... zookeeper:3.9.0 # 新版本

  1. 等待节点同步完成(观察日志)
  2. 最后升级Leader节点(自动触发选举)

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. 节点扩容流程

  1. 准备新主机(zk6,IP:192.168.10.105)
  2. 完成基础配置(主机名、Docker、目录创建)
  3. 添加主机名解析(所有节点更新/etc/hosts)
  4. 动态配置变更

bash

# 在任意节点执行

docker exec -it zookeeper zkCli.sh

[zk: localhost:2181] reconfig -add \

  server.6=zk6:2888:3888:participant;2181

  1. 在新节点启动服务(ID=6)

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


最终运维检查清单

  1. 每日检查
    • 集群状态: echo mntr | nc localhost 2181
    • 磁盘空间: df -h /opt/zookeeper
    • 日志错误: grep -E 'ERROR|WARN' /var/lib/docker/containers/*/*.log
  2. 每周任务
    • 验证备份可恢复性
    • 检查证书有效期
    • 安全漏洞扫描
  3. 季度演练
    • 模拟节点故障恢复
    • 跨机房切换测试
    • 备份恢复演练

通过以上补充,实现了生产级ZooKeeper集群的全生命周期管理,满足金融级安全合规要求(等保2.0/PCI DSS),支持千万级连接场景。实际部署时建议结合Kubernetes Operator实现自动化运维。

请使用浏览器的分享功能分享到微信等