Kafka与ZooKeeper滚动升级及回滚实施方案

Kafka 与 ZooKeeper 滚动升级及回滚实施方案

一、方案概述

(一)升级目标

  1. 版本升级:Kafka 集群从 2.2.0 滚动升级至 3.7.0,ZooKeeper 集群升级至 3.8.4

  2. 服务连续性:升级期间保持消息生产消费不中断

  3. 验证指标

  • 消息格式兼容性(旧 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 独立集群

二、升级前准备(新增回滚相关)

(一)全量数据备份策略

  1. 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 份
  1. 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 文档

(三)回滚工具链准备

  1. 自动化回滚脚本
  • 编写 shell 脚本rollback_node.sh,支持参数:节点类型(zk/kafka)、节点 ID、备份时间戳

  • 功能包括:服务停止、旧版本安装包恢复、数据文件替换、配置文件还原

  1. 一致性校验工具
  • ZooKeeper:zkEnv.sh`` checkquorum 校验集群节点一致性

  • Kafka:kafka-run-class.sh`` kafka.log.LogVerifier 校验日志文件完整性

三、ZooKeeper 滚动升级(含回滚流程)

(一)单节点升级步骤(以节点 ZK-01 为例)

  1. 预检查
  • 确认节点角色:zkServer.sh`` status 记录角色(Leader/Follower)

  • 备份当前数据:执行zk_backup.sh`` ZK-01

  1. 停止服务
  • 非 Leader 节点直接停止:zkServer.sh`` stop

  • Leader 节点处理:等待新 Leader 选举完成(通过zkCli.sh`` stat /确认 Leader 变更)

  1. 升级操作
  • 替换安装包:删除旧目录/opt/zookeeper-3.4.13,解压 3.8.4 安装包

  • 配置迁移:保留zoo.cfg中的数据目录配置,新增maxSessionTimeout等参数

  1. 启动验证
  • 启动服务:zkServer.sh`` start

  • 状态校验:

    • zkCli.sh`` stat / 确认节点加入集群

    • 监控日志:检查zookeeper.out中无Unrecognized configuration等错误

(二)回滚触发条件(满足任一条件启动回滚)

  1. 节点启动后 5 分钟内未加入集群

  2. zkCli.sh`` get /brokers/ids 返回数据缺失超 30%

  3. 集群节点状态不一致(Leader/Follower 数量异常)

(三)ZooKeeper 回滚步骤(基于备份时间戳 202505221500)

  1. 停止新版本服务
/opt/zookeeper-3.8.4/bin/zkServer.sh stop
  1. 恢复旧版本
  • 解压旧安装包到原目录:tar -xzf zookeeper-3.4.13.tar.gz -C /opt/

  • 替换配置文件:cp /backup/zookeeper/202505221500/zoo.cfg /opt/zookeeper-3.4.13/conf/

  1. 数据恢复
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/
  1. 启动验证
  • 检查 myid 一致性:cat /data/zookeeper/data/myid 应等于节点 ID

  • 集群状态校验:通过zkCli.sh确认所有旧节点正常通信

四、Kafka 滚动升级(含回滚流程)

(一)单 Broker 升级步骤(以 Broker-001 为例)

  1. 负载迁移
  • 手动触发分区重平衡(可选):kafka-reassign-partitions.sh`` --reassign-json-file rebalance.json --zookeeper <zk_hosts>

  • 确认该 Broker 非首选 Leader:kafka-preferred-replica-election.sh`` --zookeeper <zk_hosts>

  1. 停止服务
/opt/kafka-2.2.0/bin/kafka-server-stop.sh force


# 强制停止前通过JMX确认无活跃连接(可配置超时30秒)
  1. 升级操作
  • 安装包替换:解压 3.7.0 到/opt/kafka-3.7.0,保留旧目录作为回滚备份

  • 配置调整:

# server.properties新增配置


inter.broker.protocol.version=3.7  # 强制使用最新协议


log.message.format.version=3.7    # 消息格式升级(可选,根据兼容性需求)
  1. 启动验证
  • 启动服务:/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

(二)回滚触发条件(满足任一条件启动回滚)

  1. 升级后 Broker 无法连接 ZooKeeper(超 5 分钟)

  2. 消息消费出现 CRC 校验错误(连续 10 条以上)

  3. __consumer_offsets分区数据不一致(通过kafka-consumer-groups.sh对比偏移量)

(三)Kafka 回滚步骤(基于 Broker-001 的 202505221530 备份)

  1. 停止新版本服务
/opt/kafka-3.7.0/bin/kafka-server-stop.sh
  1. 恢复旧版本
  • 移除新版本目录:rm -rf /opt/kafka-3.7.0

  • 恢复旧安装包:从备份复制旧目录/backup/kafka/001/202505221530/old_version//opt/kafka-2.2.0

  1. 数据恢复
# 停止后删除当前日志目录(确保回滚到备份点)


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}')/
  1. 一致性校验
  • 日志文件校验: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

(二)消息丢失验证流程

  1. 基准测试
  • 启动压测工具:kafka-producer-perf-test.sh`` --topic test_topic --num-records 1000000

  • 消费端同步校验:使用kafka-consumer-perf-test.sh`` --topic test_topic --group rollback_test

  1. 差异分析
  • 计算生产消费差值:produced_records - consumed_records ≤ 0.01%

  • 异常处理:若差值 > 1%,通过kafka-log-dump.sh解析日志确认丢失分区

(三)元数据保留验证清单

元数据类型 验证点 对比方法 允许差异
Topic 配置 分区数、副本因子、清理策略 升级前后describe输出对比 0
消费者组 偏移量、成员列表、协议版本 list-groups+describe仅时间戳变化
Broker 元数据 节点 ID、监听端口、日志目录 ls /brokers/ids 内容对比 0

(四)回滚能力验证

  1. 单节点回滚时间
  • 目标:ZooKeeper≤30 分钟,Kafka≤60 分钟

  • 测试方法:模拟升级失败场景,记录从触发回滚到服务恢复的时间

  1. 数据一致性校验
  • 回滚后对比备份文件与当前数据的 MD5 值

  • 验证消费者组偏移量与回滚前记录一致(误差≤1 条,因可能存在未提交偏移)

六、风险控制与应急预案

(一)关键风险点

风险场景 发生概率 影响程度 应对措施
ZooKeeper 集群脑裂 5% 服务中断 启用仲裁机制(确保节点数为奇数)
Kafka 日志格式不兼容 3% 消费失败 提前设置log.message.format.version=2.2
回滚脚本执行错误 2% 数据丢失 手动恢复备份前先做完整性校验

(二)应急预案

  1. 集群不可用
  • 立即停止所有升级操作,启动 ZooKeeper 集群回滚(优先恢复 3 个节点达成仲裁)

  • 通过 VIP 切换流量到备用集群(若有),确保业务流量不中断

  1. 元数据损坏
  • 使用 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 statuskafka-topics.sh --describe
数据备份 见备份脚本部分 见备份脚本部分
强制停止服务 zkServer.sh stop forcekafka-server-stop.sh force
日志校验 zkEnv.sh checkquorumkafka-log-dump.sh --verify
消费者组检查 通过 Kafka 命令间接检查 kafka-consumer-groups.sh --describe
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Levi.Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值