Kafka 与 ZooKeeper 滚动升级及回滚实施方案
一、方案概述
(一)升级目标
-
版本升级:Kafka 集群从 2.2.0 滚动升级至 3.7.0,ZooKeeper 集群升级至 3.8.4
-
服务连续性:升级期间保持消息生产消费不中断
-
验证指标:
-
消息格式兼容性(旧 Producer / 新 Broker、新 Producer / 旧 Broker 互操作)
-
消息零丢失(生产消费数量一致性校验)
-
元数据完整保留(Topic 配置、消费者组偏移量等)
-
可靠回滚能力(4 小时内完成单节点回滚,数据恢复率 100%)
(二)集群架构
组件 | 旧版本 | 新版本 | 节点数 | 数据存储目录 | 依赖关系 |
---|---|---|---|---|---|
Kafka | 2.2.0 | 3.7.0 | N 个 | /data/kafka/logs | 依赖 ZooKeeper |
ZooKeeper | 3.4.13 | 3.8.4 | M 个 | /data/zookeeper/data, /logs | 独立集群 |
二、升级前准备(新增回滚相关)
(一)全量数据备份策略
- ZooKeeper 备份
-
备份内容:
myid
文件、事务日志(version-2 目录)、快照文件(snapshot.*) -
脚本:
# 单节点备份脚本(执行于每个ZooKeeper节点)
BACKUP\_DIR=/backup/zookeeper/\$(date +%Y%m%d%H%M%S)
mkdir -p \$BACKUP\_DIR
cp -r /data/zookeeper/data \$BACKUP\_DIR/
cp -r /data/zookeeper/logs \$BACKUP\_DIR/
cp /etc/zookeeper/conf/zoo.cfg \$BACKUP\_DIR/
- 存储要求:备份保留 7 天,异地存储 3 份
- Kafka 备份
-
备份内容:
-
Broker 配置文件(server.properties)
-
日志数据(log.dirs 目录下所有文件,含__consumer_offsets)
-
集群元数据(/brokers 节点数据,通过 zkCli 导出)
-
-
脚本:
\# 单节点Kafka备份(执行于每个Broker节点)
BROKER\_ID=\$(grep 'broker.id=' /etc/kafka/server.properties | awk -F'=' '{print \$2}')
BACKUP\_DIR=/backup/kafka/\${BROKER\_ID}/\$(date +%Y%m%d%H%M%S)
mkdir -p \$BACKUP\_DIR/config \$BACKUP\_DIR/logs
cp /etc/kafka/server.properties \$BACKUP\_DIR/config/
cp -r \$(grep 'log.dirs=' /etc/kafka/server.properties | awk -F'=' '{print \$2}')/\* \$BACKUP\_DIR/logs/
(二)版本兼容性矩阵
场景 | 兼容性状态 | 验证方法 | 参考文档 |
---|---|---|---|
旧 Producer -> 新 Broker | 兼容 | 发送 V1 格式消息到新 Broker | Kafka 版本兼容性文档 |
新 Producer -> 旧 Broker | 兼容 | 发送 V2 格式消息到旧 Broker(需配置) | Kafka 客户端协议文档 |
旧 Consumer -> 新 Broker | 兼容 | 使用旧客户端消费新 Broker 数据 | Consumer API 文档 |
(三)回滚工具链准备
- 自动化回滚脚本
-
编写 shell 脚本
rollback_node.sh
,支持参数:节点类型(zk/kafka)、节点 ID、备份时间戳 -
功能包括:服务停止、旧版本安装包恢复、数据文件替换、配置文件还原
- 一致性校验工具
-
ZooKeeper:
zkEnv.sh`` checkquorum
校验集群节点一致性 -
Kafka:
kafka-run-class.sh`` kafka.log.LogVerifier
校验日志文件完整性
三、ZooKeeper 滚动升级(含回滚流程)
(一)单节点升级步骤(以节点 ZK-01 为例)
- 预检查
-
确认节点角色:
zkServer.sh`` status
记录角色(Leader/Follower) -
备份当前数据:执行
zk_backup.sh`` ZK-01
- 停止服务
-
非 Leader 节点直接停止:
zkServer.sh`` stop
-
Leader 节点处理:等待新 Leader 选举完成(通过
zkCli.sh`` stat /
确认 Leader 变更)
- 升级操作
-
替换安装包:删除旧目录
/opt/zookeeper-3.4.13
,解压 3.8.4 安装包 -
配置迁移:保留
zoo.cfg
中的数据目录配置,新增maxSessionTimeout
等参数
- 启动验证
-
启动服务:
zkServer.sh`` start
-
状态校验:
-
zkCli.sh`` stat /
确认节点加入集群 -
监控日志:检查
zookeeper.out
中无Unrecognized configuration
等错误
-
(二)回滚触发条件(满足任一条件启动回滚)
-
节点启动后 5 分钟内未加入集群
-
zkCli.sh`` get /brokers/ids
返回数据缺失超 30% -
集群节点状态不一致(Leader/Follower 数量异常)
(三)ZooKeeper 回滚步骤(基于备份时间戳 202505221500)
- 停止新版本服务
/opt/zookeeper-3.8.4/bin/zkServer.sh stop
- 恢复旧版本
-
解压旧安装包到原目录:
tar -xzf zookeeper-3.4.13.tar.gz -C /opt/
-
替换配置文件:
cp /backup/zookeeper/202505221500/zoo.cfg /opt/zookeeper-3.4.13/conf/
- 数据恢复
rm -rf /data/zookeeper/data/\* /data/zookeeper/logs/\*
cp -r /backup/zookeeper/202505221500/data/\* /data/zookeeper/data/
cp -r /backup/zookeeper/202505221500/logs/\* /data/zookeeper/logs/
- 启动验证
-
检查 myid 一致性:
cat /data/zookeeper/data/myid
应等于节点 ID -
集群状态校验:通过
zkCli.sh
确认所有旧节点正常通信
四、Kafka 滚动升级(含回滚流程)
(一)单 Broker 升级步骤(以 Broker-001 为例)
- 负载迁移
-
手动触发分区重平衡(可选):
kafka-reassign-partitions.sh`` --reassign-json-file rebalance.json --zookeeper <zk_hosts>
-
确认该 Broker 非首选 Leader:
kafka-preferred-replica-election.sh`` --zookeeper <zk_hosts>
- 停止服务
/opt/kafka-2.2.0/bin/kafka-server-stop.sh force
# 强制停止前通过JMX确认无活跃连接(可配置超时30秒)
- 升级操作
-
安装包替换:解压 3.7.0 到
/opt/kafka-3.7.0
,保留旧目录作为回滚备份 -
配置调整:
# server.properties新增配置
inter.broker.protocol.version=3.7 # 强制使用最新协议
log.message.format.version=3.7 # 消息格式升级(可选,根据兼容性需求)
- 启动验证
-
启动服务:
/opt/kafka-3.7.0/bin/``kafka-server-start.sh`` -daemon /etc/kafka/server.properties
-
核心校验:
-
kafka-topics.sh`` --describe --topic test_topic
确认分区状态为ISR
-
生产消费测试:5 分钟内发送 10 万条消息,验证吞吐量≥80MB/s
-
(二)回滚触发条件(满足任一条件启动回滚)
-
升级后 Broker 无法连接 ZooKeeper(超 5 分钟)
-
消息消费出现 CRC 校验错误(连续 10 条以上)
-
__consumer_offsets
分区数据不一致(通过kafka-consumer-groups.sh
对比偏移量)
(三)Kafka 回滚步骤(基于 Broker-001 的 202505221530 备份)
- 停止新版本服务
/opt/kafka-3.7.0/bin/kafka-server-stop.sh
- 恢复旧版本
-
移除新版本目录:
rm -rf /opt/kafka-3.7.0
-
恢复旧安装包:从备份复制旧目录
/backup/kafka/001/202505221530/old_version/
到/opt/kafka-2.2.0
- 数据恢复
# 停止后删除当前日志目录(确保回滚到备份点)
rm -rf \$(grep 'log.dirs=' /etc/kafka/server.properties | awk -F'=' '{print \$2}')/\*
cp -r /backup/kafka/001/202505221530/logs/\* \$(grep 'log.dirs=' /etc/kafka/server.properties | awk -F'=' '{print \$2}')/
- 一致性校验
-
日志文件校验:
kafka-run-class.sh`` kafka.log.LogVerifier --log-dirs /data/kafka/logs
-
元数据对比:使用
kafka-topics.sh`` --describe
确认 Topic 配置与备份记录一致
五、升级验证体系(新增回滚验证)
(一)消息兼容性验证矩阵
验证场景 | 预期结果 | 执行频率 | 工具 / 命令 |
---|---|---|---|
旧 Producer -> 新 Broker | 消息接收率 100% | 每节点升级后 | kafka-console-producer.sh |
新 Producer -> 旧 Broker | 消息接收率≥99.9% | 回滚后验证 | 配置api.version.request=2.2 |
跨版本消费者组同步 | 偏移量正常提交 | 持续监控 | kafka-consumer-groups.sh |
(二)消息丢失验证流程
- 基准测试
-
启动压测工具:
kafka-producer-perf-test.sh`` --topic test_topic --num-records 1000000
-
消费端同步校验:使用
kafka-consumer-perf-test.sh`` --topic test_topic --group rollback_test
- 差异分析
-
计算生产消费差值:
produced_records - consumed_records ≤ 0.01%
-
异常处理:若差值 > 1%,通过
kafka-log-dump.sh
解析日志确认丢失分区
(三)元数据保留验证清单
元数据类型 | 验证点 | 对比方法 | 允许差异 |
---|---|---|---|
Topic 配置 | 分区数、副本因子、清理策略 | 升级前后describe 输出对比
| 0 |
消费者组 | 偏移量、成员列表、协议版本 | list-groups +describe | 仅时间戳变化 |
Broker 元数据 | 节点 ID、监听端口、日志目录 | ls /brokers/ids 内容对比
| 0 |
(四)回滚能力验证
- 单节点回滚时间
-
目标:ZooKeeper≤30 分钟,Kafka≤60 分钟
-
测试方法:模拟升级失败场景,记录从触发回滚到服务恢复的时间
- 数据一致性校验
-
回滚后对比备份文件与当前数据的 MD5 值
-
验证消费者组偏移量与回滚前记录一致(误差≤1 条,因可能存在未提交偏移)
六、风险控制与应急预案
(一)关键风险点
风险场景 | 发生概率 | 影响程度 | 应对措施 |
---|---|---|---|
ZooKeeper 集群脑裂 | 5% | 服务中断 | 启用仲裁机制(确保节点数为奇数) |
Kafka 日志格式不兼容 | 3% | 消费失败 | 提前设置log.message.format.version=2.2 |
回滚脚本执行错误 | 2% | 数据丢失 | 手动恢复备份前先做完整性校验 |
(二)应急预案
- 集群不可用
-
立即停止所有升级操作,启动 ZooKeeper 集群回滚(优先恢复 3 个节点达成仲裁)
-
通过 VIP 切换流量到备用集群(若有),确保业务流量不中断
- 元数据损坏
-
使用 ZooKeeper 的
zkCli.sh`` restore
命令从快照恢复 -
对 Kafka 集群执行分区重建(通过
kafka-reassign-partitions.sh
)
七、实施时间计划
阶段 | 时间窗口 | 关键任务 | 负责人 |
---|---|---|---|
准备阶段 | D-3 ~ D-1 | 备份验证、脚本测试、资源申请 | 运维组 |
ZooKeeper 升级 | D 日 00:00-04:00 | 节点依次升级(每节点 60 分钟) | 运维组 |
Kafka 升级 | D 日 05:00-15:00 | 节点依次升级(每节点 90 分钟) | 开发组 |
回滚演练 | D+1 09:00-11:00 | 模拟 Broker 升级失败并执行回滚 | 测试组 |
八、附录:关键命令速查表
操作类型 | ZooKeeper 命令 | Kafka 命令 |
---|---|---|
状态查看 | zkServer.sh status | kafka-topics.sh --describe |
数据备份 | 见备份脚本部分 | 见备份脚本部分 |
强制停止服务 | zkServer.sh stop force | kafka-server-stop.sh force |
日志校验 | zkEnv.sh checkquorum | kafka-log-dump.sh --verify |
消费者组检查 | 通过 Kafka 命令间接检查 | kafka-consumer-groups.sh --describe |