4. 版本兼容性与升级路径规划

在把现有 Kafka 集群迁移到 Confluent Platform 之前,最容易被低估的风险不是“装不上”,而是“版本对不上”。Apache Kafka 与 Confluent Platform 并不是两条完全独立的版本线:Confluent Platform 以某个 Apache Kafka 版本为内核,再叠加 Confluent 自研组件(Schema Registry、Connect、ksqlDB、Control Center、Tiered Storage、RBAC 等)和补丁。因此,规划升级路径的第一步,是先把“Kafka 内核版本”和“平台组件版本”分开看,再判断它们之间的兼容边界。

一、先厘清两条版本线的对应关系

Apache Kafka 的版本号形如 2.8.0、3.4.0、3.6.1,其中前两位表示特性版本,第三位是补丁版本。Confluent Platform 的版本号形如 6.2.0、7.4.0、7.6.0,它内部绑定的 Kafka 版本并不与自身版本号一致。例如 Confluent Platform 7.4.x 对应 Apache Kafka 3.4.x,7.6.x 对应 Apache Kafka 3.6.x。规划时必须先查清目标 CP 版本所绑定的 Kafka 内核版本,再判断源集群的 Kafka 版本能否直接升级到该内核版本。

除了内核,还要关注三类组件版本:一是协议版本,包括消息格式版本(message format version)和 inter-broker 协议版本;二是客户端版本,生产者和消费者的 API 版本;三是生态组件版本,如 Schema Registry、Connect 插件、ksqlDB 查询引擎。它们各自的兼容策略不同,不能用一个“大版本”笼统覆盖。

判断兼容性时,优先看官方 Compatibility Matrix,而不是凭经验推断。Kafka 官方对 broker 间、broker 与客户端之间通常承诺“双向兼容一个主版本”,但 Confluent 组件往往有更严格的绑定关系。

二、兼容性判断的三个维度

第一是协议兼容。Kafka 的 wire protocol 在 0.8 到 3.x 之间经历过多次演进,尤其是消息格式从 V0/V1 升级到 V2(Record Batch)后,旧客户端无法直接读写新格式。若源集群仍在使用 V0/V1 消息格式,升级到 3.x 前必须先把 log.message.format.version 和 message.format.version 提升到目标版本,并等待旧数据被滚动覆盖或完成迁移。

第二是客户端兼容。老版本客户端(如 0.10.x、0.11.x)连接新 broker 时,可能因 API 版本协商失败而报 UnsupportedVersionException。规划时要盘点所有生产者和消费者的客户端版本,优先升级到与目标 broker 同主版本或至少 2.x 以上的客户端。

第三是组件兼容。Schema Registry 对 Kafka 内核版本有明确要求,Connect 插件的 API 版本必须与 Connect 运行时匹配,ksqlDB 对 Kafka 流处理 API 的依赖更强。若源集群使用了自研 Connect 插件或自定义 SerDe,需要逐个验证其在目标 CP 版本下能否加载。

Apache Kafka 与 Confluent Platform 版本映射与升级路径 Apache Kafka 版本线 0.10.x / 0.11.x 旧消息格式 V0/V1 2.0 – 2.8 V2 消息格式普及 3.0 – 3.3 KRaft 预览 3.4 – 3.6 KRaft 生产可用 3.7+ ZooKeeper 移除 Confluent Platform 映射 CP 3.x – 5.x 对应 Kafka 0.10 – 2.0 CP 6.x 对应 Kafka 2.6 – 2.8 CP 7.0 – 7.3 对应 Kafka 3.0 – 3.3 CP 7.4 – 7.6 对应 Kafka 3.4 – 3.6 CP 8.x 对应 Kafka 3.7+ 推荐升级路径 ① 盘点与评估 版本、客户端、插件 ② 消息格式升级 V0/V1 → V2 ③ 滚动升级 broker 逐台替换,保持副本 ④ 升级客户端 生产者/消费者分批 ⑤ 启用 CP 组件 SR / Connect / C3 风险点:跨主版本跳升、旧消息格式未升级、客户端 API 不匹配、自研插件不兼容

三、制定升级路径的实操方法

升级路径不是“一步到位”,而是分阶段收敛风险。推荐按以下顺序推进。

第一步,盘点现状。用 kafka-broker-api-versions.sh 查看 broker 支持的 API 版本,用 kafka-topics.sh --describe 检查各 topic 的 message.format.version,用客户端依赖清单确认生产者/消费者的 Kafka 客户端版本。把结果整理成一张“版本—组件—风险”对照表。

第二步,先升消息格式,再升 broker。如果源集群消息格式仍是 V0/V1,直接升级 broker 会导致新旧格式混用。正确做法是先把 log.message.format.version 设为当前 broker 支持的最高版本,滚动重启,等待旧格式数据被清理或迁移,再执行 broker 升级。

第三步,滚动升级 broker。每次只停一台 broker,升级后确认 ISR 恢复、副本同步正常,再处理下一台。对于使用 ZooKeeper 的旧集群,若目标 CP 版本已默认 KRaft,需要额外规划元数据迁移,不能简单替换二进制包。

第四步,分批升级客户端。先升级非核心业务的生产者,观察 record-error-rate 和 request-latency-avg;再升级消费者,重点看 records-lag-max 和 rebalance 次数。客户端升级通常比 broker 升级更容易回滚,适合作为验证窗口。

第五步,启用 Confluent 组件。broker 稳定后,再部署 Schema Registry、Connect、Control Center。Schema Registry 需要与 broker 同版本或兼容版本,Connect 插件要逐个验证加载。建议先在测试环境用一份生产 topic 的 schema 做兼容性测试。

四、一个可参考的升级检查清单

检查项判断依据不通过时的处理
源 Kafka 版本是否跨 2 个以上主版本分多跳升级,不跳版
消息格式版本是否为 V2先升格式再升 broker
客户端版本是否 ≥ 2.0先升级客户端或使用兼容层
自研 Connect 插件能否在目标 CP 加载重编译或替换插件
Schema Registry 兼容性schema 是否可注册调整兼容级别或迁移 schema
元数据模式ZooKeeper 还是 KRaft规划 ZK → KRaft 迁移
不要在生产环境直接跨多个主版本升级。Kafka 官方虽支持部分跨版本,但 Confluent 组件的绑定关系更紧,跳版极易触发协议协商失败或元数据不兼容。稳妥做法是逐主版本递进,每跳都做一次回归验证。

最后,升级路径规划的输出不应只是一张时间表,而应包含“版本映射、兼容性判断、分阶段操作、回滚方案、验证指标”五个部分。只有把每一步的输入、判断依据和观察指标写清楚,才能在真正执行时快速定位问题,而不是等到 broker 起不来才回头查版本。