在 Debian 上实现 Zookeeper 高可用
架构与准备
- 使用**奇数个节点(建议 3 台或以上)**组成集群,避免脑裂并保障多数派提交。
- 安装 Java(推荐 OpenJDK 11):sudo apt update && sudo apt install -y openjdk-11-jdk;验证:java -version。
- 规划主机名或 IP 与端口:客户端端口 2181,集群内通信端口 2888/3888。
- 准备目录:数据目录(如 /var/lib/zookeeper/data)、日志目录(如 /var/log/zookeeper),并确保目录权限正确。
安装与配置步骤
- 下载并解压 Zookeeper(示例为 3.7.0,请替换为最新稳定版):
wget https://downloads.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
tar -xzvf apache-zookeeper-3.7.0-bin.tar.gz -C /opt
- 配置 zoo.cfg(三节点示例,按实际主机名或 IP 替换):
tickTime=2000
dataDir=/var/lib/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888
- 创建 myid(各节点唯一,与 server.X 对应):
echo “1” > /var/lib/zookeeper/data/myid # zoo1
echo “2” > /var/lib/zookeeper/data/myid # zoo2
echo “3” > /var/lib/zookeeper/data/myid # zoo3
- 目录权限示例:chown -R zookeeper:zookeeper /var/lib/zookeeper /var/log/zookeeper。
启动与验证
- 启动集群(各节点):/opt/apache-zookeeper-3.7.0-bin/bin/zkServer.sh start
- 查看角色(各节点):/opt/apache-zookeeper-3.7.0-bin/bin/zkServer.sh status,应见到 Mode: leader 或 Mode: follower。
- 客户端连通性测试:/opt/apache-zookeeper-3.7.0-bin/bin/zkCli.sh -server zoo1:2181,在 CLI 中可执行 ls /、stat / 等命令。
- 日志排查:tail -f /var/log/zookeeper/zookeeper.out(路径以实际配置为准)。
系统服务与防火墙
- systemd 服务示例(/etc/systemd/system/zookeeper.service):
[Unit]
Description=Apache Zookeeper Server
After=network.target
[Service]
Type=forking
User=zookeeper
Group=zookeeper
ExecStart=/opt/apache-zookeeper-3.7.0-bin/bin/zkServer.sh start
ExecStop=/opt/apache-zookeeper-3.7.0-bin/bin/zkServer.sh stop
Restart=on-abort
[Install]
WantedBy=multi-user.target
启用:sudo systemctl daemon-reload && sudo systemctl enable --now zookeeper
- 防火墙放行(UFW):sudo ufw allow 2181/tcp;sudo ufw allow 2888/tcp;sudo ufw allow 3888/tcp。
高可用最佳实践与安全运维
- 规模与角色:保持奇数节点,必要时可加入 Observer 提升读扩展(不影响写一致性)。
- 网络与主机:保证节点间低时延/稳定网络,正确配置 /etc/hosts 或 DNS,避免主机名解析不一致。
- 安全:限制管理端口访问,启用 ACL 权限控制,必要时考虑 SSL/TLS 与 Kerberos 集成。
- 监控与备份:采集 JMX/Prometheus 指标,结合 Grafana 可视化;定期备份 dataDir 与配置,演练故障恢复。
- 维护:滚动升级、参数调优(如 tickTime/initLimit/syncLimit)、变更前后在测试环境验证。