综合 Kafka 4.0 落地笔记:默认 KRaft 去掉 ZooKeeper,消费者组协议换成 KIP-848

2026-09-22 21:03:33

Kafka 4.0 落地笔记:默认 KRaft 去掉 ZooKeeper,消费者组协议换成 KIP-848

Apache Kafka 4.0 于 2025-03-18 发布,官方发布公告见 Apache Kafka 4.0.0 Release Announcement。这是第一个完全不需要 Apache ZooKeeper 的主要版本,默认以 KRaft 模式运行,部署时不再需要单独维护一套 ZooKeeper 集群。

KRaft:元数据管理收进 Kafka 自身(KIP-500)

KRaft 由 KIP-500 引入,把元数据管理从外部系统搬回 Kafka 内部:

  • 元数据存放在内置的 __cluster_metadata 主题中;
  • 由选举产生的 Controller 统一管理元数据;
  • Broker 作为 Raft Follower 复制元数据日志;
  • 定期生成快照,避免元数据日志无限增长。

对运维的直接收益是故障恢复时间:从原来的分钟级降到秒级。因为不再有 ZooKeeper 与 Kafka 之间的元数据双写和状态同步,集群的元数据路径只有一条。

KIP-848:下一代消费者重平衡协议 GA

KIP-848 在这次版本中转 GA,核心变化是告别 stop-the-world 重平衡。服务端默认启用新协议,但消费者端需要显式 opt-in:

group.protocol=consumer

新协议完全增量式,不再依赖全局同步屏障。重平衡时间缩短,可扩展性提升——组规模变大时,不再需要整组停下来等一次同步。

KIP-932:Queues for Kafka 早期访问

KIP-932 引入共享组(share group),用普通 topic 实现协同消费/点对点队列语义。实现上依靠记录级锁(TTL 控制)防止同一条记录被重复处理,并支持逐条 ACK/NACK。这个特性目前是早期访问状态,适合先做验证,不要直接压到生产关键链路。

升级前要确认的两组约束

协议版本(KIP-896)。 旧版客户端协议 API 版本被移除,基准协议提升到 2.1。两个方向都要检查:

  • 升级 Java 客户端(含 Connect、Streams)到 4.0 之前,确保 Broker ≥ 2.1;
  • 升级 Broker 到 4.0 之前,确保 Java 客户端 ≥ 2.1。

Java 版本(KIP-750 / KIP-1013)。

组件Java 版本
Kafka Clients、Kafka StreamsJava 11
Broker、Connect、ToolsJava 17

另外 KIP-1032 把 Connect 升级到 Jakarta 与 JavaEE 10 API,自定义 Connect 插件如果依赖旧的 javax.* 命名空间,需要一并调整。

其他几个值得关注的 KIP

  • KIP-966:合格领导者副本(Eligible Leader Replicas, ELR)预览。 ELR 是 ISR 的子集,保证数据完整性达到高水位线,可以安全用于领导者选举,避免数据丢失。
  • KIP-996:KRaft 预投票机制。 避免因瞬时网络问题或 GC 暂停被误判为领导者失联,从而触发不必要的选举;如果未获得多数预投票认可,则进入冷却期(election.backoff.ms)。
  • KIP-1106:消费者客户端支持基于时长的偏移重置。 新增配置 auto.offset.reset.duration,偏移失效时可以从指定时间点(比如 24 小时前)开始消费,避免全量重处理。
  • KIP-1043:组管理命令行工具调整。 新增 kafka-groups.sh,并更新 kafka-consumer-groups.shkafka-share-groups.sh,用于查看所有组类型(含 KIP-848 消费者组、KIP-932 共享组),同时修复了 Admin API 的兼容性问题。
  • KIP-1076:扩展 KIP-714。 支持嵌入式客户端(例如 Kafka Streams)上报应用级指标。

移除项

Kafka 4.0 移除了已废弃 12 个月以上的 API,用来简化平台。这一步和 KIP-896 的协议版本基线是一起生效的,升级前建议先把手上的客户端版本盘一遍,再决定是客户端先行还是 Broker 先行。

复制全文 生成海报 Kafka 消息队列 分布式 运维

推荐文章

程序员茄子在线接单