Ubuntu 上更新 Zookeeper 版本的安全做法
一 升级前准备
- 备份关键数据与配置:建议完整备份数据目录 /var/lib/zookeeper 与配置目录 /etc/zookeeper,以便快速回滚。示例:
- sudo cp -R /var/lib/zookeeper /var/lib/zookeeper-backup
- sudo cp -R /etc/zookeeper /etc/zookeeper-backup
- 检查当前运行状态与版本:确认服务正在运行及当前版本,便于制定升级顺序与回滚计划。
- sudo systemctl status zookeeper
- 使用四字命令查看版本:echo stat | nc 127.0.0.1 2181(如提示未授权,需在 zoo.cfg 末尾添加:4lw.commands.whitelist=* 并重启后再试)
- 环境核对:确认 JDK 版本满足新版本要求(常见为 OpenJDK 11),以及防火墙对 2181/2888/3888 端口的放行策略。
- 升级策略:生产环境优先采用滚动升级(逐台升级 Follower,最后升级 Leader),并在测试环境充分验证。
二 标准升级步骤
- 下载并解压新版本:从 Apache 镜像下载所需版本(优先选择带有 -bin 的发行包),解压到临时目录。示例:
- 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 /tmp
- 停止旧服务:
- sudo systemctl stop zookeeper
- 处理数据目录(两种常见做法,二选一)
- 沿用现有数据目录:将旧版 /var/lib/zookeeper 整体保留,仅替换二进制与配置(推荐,风险更低)。
- 迁移数据目录:将新包内的 data/ 移动到 /var/lib/zookeeper(注意权限与属主一致)。示例:
- sudo mv /var/lib/zookeeper /var/lib/zookeeper-old
- sudo mv /tmp/apache-zookeeper-3.7.0-bin/data /var/lib/zookeeper
- 更新配置:将旧配置与新包默认配置合并,保留自定义项(如 dataDir、dataLogDir、server.x 等)。示例:
- sudo cp /etc/zookeeper/conf/zoo.cfg /etc/zookeeper/conf/zoo.cfg.old
- cp /tmp/apache-zookeeper-3.7.0-bin/conf/zoo.cfg /etc/zookeeper/conf/zoo.cfg
- 如有新增参数,再按需合并回 /etc/zookeeper/conf/zoo.cfg
- 启动与验证:
- sudo systemctl start zookeeper
- sudo systemctl status zookeeper
- 使用 zkCli.sh 连接测试:echo stat | nc 127.0.0.1 2181 或 /opt/apache-zookeeper-3.7.0-bin/bin/zkCli.sh -server 127.0.0.1:2181
- 观察日志无异常后,再继续升级下一台节点
三 集群滚动升级要点
- 顺序:先升级全部 Follower,最后升级 Leader,以降低对业务的影响。
- 逐台操作:对每台节点重复“停止 → 升级二进制与配置 → 启动 → 验证”的流程,确认健康后再处理下一台。
- 配置一致性:确保各节点的 zoo.cfg 中 server.x 列表、端口与 myid 一致且正确。
- 版本兼容:跨小版本升级通常较为平滑,但务必阅读发行说明;如跨多个大版本,建议在测试环境验证后再上线。
四 回滚与常见问题
- 快速回滚:若升级异常,优先恢复服务与数据目录。
- 停止新版本:sudo systemctl stop zookeeper
- 恢复数据与配置:
- sudo mv /var/lib/zookeeper /var/lib/zookeeper-failed
- sudo mv /var/lib/zookeeper-old /var/lib/zookeeper
- sudo cp -R /etc/zookeeper-backup /etc/zookeeper
- 启动旧版本:sudo systemctl start zookeeper
- 常见问题处理:
- 四字命令不可用:在 zoo.cfg 末尾添加 4lw.commands.whitelist=* 并重启。
- JMX/监控不可用:检查新版本的启动脚本与 JVM 参数是否变化。
- 权限问题:确保 /var/lib/zookeeper 与 /var/log/zookeeper 属主与权限与运行用户一致(常见为 zookeeper 用户)。