Kafka 2.6.0 升级到 3.0.0 官方支持滚动升级,可以在不停机的情况下完成,但需要严格控制交互协议版本,并确认客户端兼容性。
先说结论:支持平滑升级,但要注意客户端兼容性和配置顺序,不可直接修改协议版本。
- 适合:生产环境希望避免停机的场景
- 先准备:确认客户端版本和 ZooKeeper 兼容性(ZK 需 3.4.14+)
- 验收:升级后验证协议版本和消费延迟
升级前检查
在升级 Kafka 之前,必须确认 ZooKeeper 版本满足要求。Kafka 3.0.0 不再支持过低版本的 ZooKeeper。
| Kafka 版本 | 最低 ZooKeeper 版本 | 推荐 ZooKeeper 版本 |
|---|---|---|
| 2.6.0 | 3.4.14 | 3.4.14+ / 3.5.7+ |
| 3.0.0 | 3.4.14 | 3.4.14+ / 3.5.7+ |
如果当前 ZooKeeper 版本低于 3.4.14,请先单独升级 ZooKeeper 集群,稳定后再进行 Kafka 升级。
二进制文件替换操作
建议采用目录切换的方式替换二进制文件,便于快速回滚。假设 Kafka 安装在 /opt/kafka。
# 1. 下载并解压新版本到独立目录
cd /opt
wget https://downloads.apache.org/kafka/3.0.0/kafka_2.13-3.0.0.tgz
tar -xzf kafka_2.13-3.0.0.tgz
mv kafka_2.13-3.0.0 kafka_3.0.0
# 2. 备份当前软链接(如果有)或当前目录
ln -sfn /opt/kafka_2.6.0 /opt/kafka_current_backup
# 3. 停止当前 Broker 进程
# 注意:滚动升级时逐个停止,不要一次性停止所有
bin/kafka-server-stop.sh
# 4. 修改软链接指向新版本(或手动替换 bin 目录)
ln -sfn /opt/kafka_3.0.0 /opt/kafka
# 5. 确保配置文件 server.properties 存在且路径正确
# 通常建议配置文件独立于二进制目录,启动时指定
# bin/kafka-server-start.sh config/server.properties配置修改与滚动重启
升级过程中核心是修改 server.properties 配置,不要一次性改完。以下是关键配置项示例:
# 升级前保持原版本协议(所有 Broker 升级二进制期间保持此配置)
inter.broker.protocol.version=2.6
log.message.format.version=2.6
# 所有 Broker 升级完成后,再修改为 3.0
inter.broker.protocol.version=3.0
log.message.format.version=3.0操作步骤:
- 逐个升级 Broker:停止一个 Broker,替换二进制文件为 3.0.0,保持配置文件中的协议版本为 2.6,启动 Broker。等待该 Broker 重新加入 ISR 列表。
- 重复步骤:对集群中所有 Broker 重复上述操作,直到所有节点都运行 3.0.0 二进制文件。
- 切换协议版本:所有 Broker 升级完成后,修改所有节点的
server.properties,将inter.broker.protocol.version和log.message.format.version改为 3.0,逐个重启生效。
怎么验证是否生效
1. 检查 Broker 版本:使用命令行工具查看集群版本信息。
bin/kafka-broker-api-versions.sh `--bootstrap-server` localhost:90922. 观察日志:查看 logs/server.log,确认没有频繁的 Leader 选举或 ISR 收缩警告。
3. 监控指标:观察消费者 lag 是否有异常堆积,确认生产写入正常。
4. 确认协议版本:使用 ZooKeeper 客户端或 Kafka 工具确认集群协议版本已更新。
升级回滚步骤
如果升级过程中出现严重问题,需立即回滚。注意:一旦协议版本升至 3.0 通常不可逆,回滚仅限于二进制版本回退且未修改协议版本的情况。
# 1. 停止当前 Broker
bin/kafka-server-stop.sh
# 2. 恢复二进制软链接到旧版本
ln -sfn /opt/kafka_2.6.0 /opt/kafka
# 3. 恢复配置文件(如果修改过协议版本,必须改回 2.6)
# 编辑 server.properties
inter.broker.protocol.version=2.6
log.message.format.version=2.6
# 4. 启动 Broker
bin/kafka-server-start.sh config/server.properties
# 5. 验证集群状态恢复
bin/kafka-broker-api-versions.sh `--bootstrap-server` localhost:9092常见坑
1. 客户端过旧:部分老旧客户端依赖已移除的 API,升级后可能报错,建议先在测试环境验证客户端兼容性。
2. ZooKeeper 版本:Kafka 3.0 仍依赖 ZooKeeper,确认现有 ZK 版本在支持范围内(3.4.14+),不要误以为 3.0 默认就是 KRaft 模式。
3. KRaft 混淆:Kafka 3.0 引入了 KRaft 预览特性,但默认仍是 ZooKeeper 模式。除非明确计划迁移,否则不要修改 process.roles 等相关配置。
4. 配置顺序错误:严禁在所有 Broker 升级完成前修改协议版本,这会导致集群分裂。
参考来源
- Apache Kafka Documentation, "Upgrade Guide", https://kafka.apache.org/30/documentation.html#upgrade
- Apache Kafka 3.0.0 Release Notes, "Notable Changes", https://kafka.apache.org/30/documentation.html#notable_changes