Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API

大家好,我是码哥,《Redis 高手心法》作者。

2025 年 3 月,Apache Kafka 迎来了具有划时代意义的 4.0 版本。这一版本不仅是技术架构的全面革新,更是功能场景的深度拓展。

码哥第一时间对 4.0 版本分析,为大家深度解读 Kafka 4.0 的核心特性,以下是码哥认为比较重要的特性:

  1. KRaft 全面替代 ZooKeeper

  2. 新一代消费者重平衡协议

  3. 点对点消息模型与共享组

  4. 移除旧协议 API 版本,提升系统性能

KRaft 全面替代 ZooKeeper

Apache Kafka 4.0 是一个重要的里程碑,标志着第一个完全无需 Apache ZooKeeper® 运行的主要版本。

通过默认运行在 KRaft 模式下,Kafka 简化了部署和管理,消除了维护单独 ZooKeeper 集群的复杂性。

这一变化显著降低了运营开销,增强了可扩展性,并简化了管理任务。

旧架构痛点回顾

在 Kafka 3.x 及更早版本中,ZooKeeper(ZK)是元数据管理的核心组件,负责 Broker 注册、Topic 分区分配、控制器选举等关键任务,如图所示。

然而,这种设计存在显著问题:

  • 运维复杂度高:需独立维护 ZK 集群,占用额外资源且增加故障点。

  • 性能瓶颈明显:元数据操作依赖 ZK 的原子广播协议(ZAB),大规模集群(如万级分区)下元数据同步延迟可达秒级。

  • 扩展性受限:ZK 的写性能随节点数增加而下降,限制 Kafka 集群规模。

KRaft 模式的技术实现

Apache Kafka Raft(KRaft)是在 KIP-500 中引入的共识协议,用于移除 Apache Kafka 对 ZooKeeper 进行元数据管理的依赖。这通过将元数据管理的责任集中在 Kafka 本身,而不是在两个不同的系统(ZooKeeper 和 Kafka)之间分割,从而大大简化了 Kafka 的架构。

KRaft 模式利用 Kafka 中的新法定多数控制器服务,取代了之前的控制器,并使用基于事件的 Raft 共识协议的变体。

Kafka 4.0 默认启用KRaft 模式(Kafka Raft),完全摒弃 ZK 依赖。其核心原理如下:

  1. 元数据自管理:基于 Raft 共识算法,将元数据存储于内置的__cluster_metadata主题中,由 Controller 节点(通过选举产生)统一管理。

  2. 日志复制机制:所有 Broker 作为 Raft 协议的 Follower,实时复制 Controller 的元数据日志,确保强一致性。

  3. 快照与恢复:定期生成元数据快照,避免日志无限增长,故障恢复时间从 ZK 时代的分钟级优化至秒级。

我们可以看出 KRaft 替换 ZK,并不是元数据存储重新造轮子,而核心是集群协调机制的演进。

整个通信协调机制本质上是事件驱动模型,也就是 Metadata as an Event Log,Leader 通过 KRaft 生产权威的事件,Follower 和 Broker 通过监听 KRaft 来获得这些事件,并且顺序处理事件,达到集群状态和期望的最终一致。

新一代消费者重平衡协议

传统消费者组采用Eager Rebalance 协议,存在两大瓶颈:

  1. 全局同步屏障(Stop-the-World):任何成员变更(如扩容、故障)都会触发全组暂停,导致分钟级延迟。

  2. 扩展性差:消费者数量受限于分区数,万级消费者组重平衡耗时高达数分钟。

Kafka 4.0 引入增量式重平衡协议(KIP-848),核心改进包括:

  1. 协调逻辑转移:由 Broker 端的GroupCoordinator统一调度,消费者仅需上报状态,无需全局同步。

  2. 增量分配:仅调整受影响的分区,未变更的分区可继续消费。

  3. 容错优化:局部故障仅触发局部重平衡,避免全组停机。

性能对比与实测数据
指标旧协议(Eager)新协议(Incremental)
重平衡延迟(万级组)60 秒<1 秒
资源消耗(CPU)降低 70%
扩展上限千级消费者十万级消费者

Kafka 4.0 引入了一种强大的新消费者组协议,旨在显著提高重新平衡性能。

这种优化显著减少了停机时间和延迟,增强了消费者组的可靠性和响应性,尤其是在大规模部署中。

点对点消息模型与共享组

传统上,Kafka 主要采用发布-订阅模式,消费者组模式下,分区需与消费者一一绑定,如下图所示。

无法实现多消费者协同处理同一分区消息,消费者数量不能超过分区数量——最多为一对一。

如下图所示,Consumer 5 无法处理 Topic 消息。

而在某些特定场景下,如点对点的消息传递、任务分配等,传统的队列语义更具优势。

Kafka 4.0 通过引入“队列”功能,共享组(Share Group)允许多消费者同时处理同一分区消息,实现点对点消费模式

特性传统消费者组共享组
并行消费分区数=消费者数消费者数>分区数
消息确认偏移量提交逐条 ACK/NACK
投递语义At-Least-OnceExactly-Once(可选)

主要特点:

  • 支持传统队列场景:适用于需要保证消息严格顺序且仅由一个消费者处理的场景。

  • 提升资源利用率:共享组机制使得多个消费者能够动态地共享分区资源,提高了系统资源的利用率和整体吞吐量。

  • 简化架构设计:开发者无需在 Kafka 与其他专门的队列系统之间进行复杂的集成和数据迁移。

共享组(Share Group)机制

Kafka 4.0 通过共享组实现队列语义,关键技术包括:

  1. 多消费者协同消费:同一分区的消息可由多个消费者并行处理,突破分区数限制。

  2. 记录级锁机制:每条消息被消费时加锁(TTL 控制),防止重复处理。

  3. ACK/NACK 语义:支持逐条确认(Exactly-Once)或重试(At-Least-Once)。

移除旧协议 API 版本,提升系统性能

Kafka 一直以来都致力于兼容各个版本的协议 API,但随着时间的推移,维护大量旧版本的协议 API 带来了许多不必要的复杂性和成本。

在 Kafka 4.0 中,旧版本的协议 API 被彻底移除,系统基准协议直接提升至 Kafka 2.1 版本。

改进点:

  • 简化代码:去除了历史包袱,简化了代码结构,统一KafkaProducerKafkaConsumer接口,减少冗余配置项,减少了测试难度。

  • 提高性能:去除了对旧协议 API 的支持,使得系统性能得到了显著提升。废弃 Kafka 2.1 之前的所有 API(如MessageFormatter v0)

值得注意的是,在 Kafka 4.0 中,Kafka 客户端和 Kafka Streams 需要 Java 11,而 Kafka Brokers,Connect 和工具现在需要 Java 17。

其他改进

Kafka 4.0 的其他新变化:

  1. 动态配置优化:

    1. 自动线程调整num.io.threads根据 CPU 核数动态分配,提升资源利用率。

    2. 时间窗口偏移量:支持从特定时间点(如 24 小时前)开始消费,替代固定偏移量。

  2. 安全性增强:OAuth 2.0 集成,支持基于 Token 的鉴权,替代 SASL/PLAIN;审计日志:记录所有元数据操作,满足金融级合规要求。

总结

Kafka 4.0 通过彻底摆脱 ZooKeeper,全面采用 KRaft 模式,不仅简化了部署和维护工作,还显著提升了系统的性能和稳定性。

同时,新一代消费者重平衡协议和队列功能的引入,为开发者提供了更为灵活和高效的消息处理模式。

这些架构革新使得 Kafka 4.0 成为了一个更加独立、高效和易用的分布式消息系统,为未来的发展奠定了坚实的基础。

最后,宣传下自己的新书《Redis 高手心法》,上市后得到了许多读者的较好口碑评价,而且上过京东榜单!原创不易,希望大家多多支持,谢谢啦。

本书基于 Redis 7.0 版本,将复杂的概念与实际案例相结合,以简洁、诙谐、幽默的方式揭示了Redis的精髓。

从 Redis 的第一人称视角出发,拟人故事化方式和诙谐幽默的言语与各路“神仙”对话,配合 158 张图,由浅入深循序渐进的讲解 Redis 的数据结构实现原理、开发技巧、运维技术和高阶使用,让人轻松愉快地学习。

图片

点击下方卡片即可购买

往期推荐

38 张图详解 Redis:核心架构、发布订阅机制、9大数据类型底层原理、RDB和AOF 持久化、高可用架构、性能问题排查和调优

高并发系统必看!G1如何让亿级JVM吞吐量提升300%?

性能提升300%!JVM分配优化三板斧,JVM 的内存区域划分、对象内存布局、百万 QPS 优化实践

从 12s 到 200ms,MySQL 两千万订单数据 6 种深度分页优化全解析

你真的懂 Redis 哨兵集群吗?一主二从三哨兵架构如何扛住百万级并发?

<think>嗯,用户现在问的是KRaft模式是否不能使用外部ZooKeeper。我需要先理解用户的问题。之前的对话中,用户遇到了Helm安装Kafka时的错误,提示同时启用了ZooKeeperKRaft模式,导致冲突。现在用户可能想确认在KRaft模式下是否需要完全脱离ZooKeeper,或者是否可以继续使用外部ZooKeeper。 首先,我应该回顾Kafka的架构变化。KRaftKafka的新共识协议,旨在取代ZooKeeper,使Kafka不再依赖外部ZooKeeper集群。所以,理论上在KRaft模式下,Kafka应该不需要ZooKeeper了。用户可能误解了配置,或者想了解是否还能在KRaft模式下继续用外部的ZooKeeper,比如迁过程中是否需要同时使用。 接下来,我需要确认官方文档的信息。根据Apache Kafka的文档,KRaft模式是去ZooKeeper化的,因此在KRaft模式下,Kafka不应该再配置任何ZooKeeper连接。这意味着如果启用了KRaft,必须禁用所有ZooKeeper相关的配置,包括外部ZooKeeper的地址。 用户可能在迁过程中遇到问题,或者混淆了两种模式的配置。比如,可能在values.yaml文件中同时设置了kraft.enabled=true和externalZookeeper.servers,这会导致冲突。需要明确告诉用户,KRaft模式下不能使用任何形式的ZooKeeper,无论是内置还是外部。 还需要考虑用户的实际应用场景。如果他们正在从ZooKeeperKRaft,可能需要指导他们如何正确过渡,而不是同时启用两者。这时候应该强调两种模式的互斥性,并提供正确的配置示例,确保用户不会在配置文件中遗留ZooKeeper的设置。 另外,用户可能有历史集群使用外部ZooKeeper,现在想切换到KRaft,但不确定是否需要完全ZooKeeper配置。这时候需要明确指出,KRaft模式必须完全独立,任何ZooKeeper的配置都会导致错误,如之前遇到的安装失败。 最后,要确保回答清晰,分点说明KRaft模式与ZooKeeper的不兼容性,并提供配置建议和常见错误示例,帮助用户避免配置冲突。同时,可能需要提醒用户检查他们的values.yaml文件,确保所有ZooKeeper相关的参数都被正确禁用或删除。</think>### **核心结论** **KRaft模式与ZooKeeper完全互斥**。在KRaft模式下,Kafka**不再依赖任何形式的ZooKeeper服务**(无论是内置还是外部)。以下是关键原理与配置说明: --- ### **KRaft模式的设计目标** 1. **去ZooKeeper化** - KRaftKafka Raft)是Kafka自研的共识协议,旨在替代ZooKeeper的元数据管理功能。 - 通过内置的控制器节点(Controller)直接管理集群元数据,**消除对ZooKeeper的依赖**。 2. **架构简化** - 传统模式下需维护ZooKeeperKafka两套集群,而KRaft模式仅需Kafka集群自身。 --- ### **KRaft模式的配置要求** 若启用KRaft模式(`kraft.enabled=true`),必须**同时满足以下条件**: 1. **禁用所有ZooKeeper配置** - 关闭内置ZooKeeper:`zookeeper.enabled=false` - 清空外部ZooKeeper地址:`externalZookeeper.servers=""` 2. **明确配置控制器节点** - 控制器节点(Controller)负责元数据管理,需独立部署: ```yaml controller: replicaCount: 3 # 建议奇数(如3、5) ``` 3. **Broker节点需同时运行Broker和Controller角色(可选)** - 生产环境中通常分离角色,但测试环境可合并: ```yaml broker: combinedMode: true # 合并Broker与Controller角色 ``` --- ### **常见错误示例** #### **错误1:同时启用KRaftZooKeeper** ```yaml # values.yaml(错误配置) kraft: enabled: true # 启用KRaft模式 zookeeper: enabled: true # 未关闭内置ZooKeeper ``` **结果**:Helm安装失败,报错提示模式冲突。 #### **错误2:残留外部ZooKeeper地址** ```yaml # values.yaml(错误配置) kraft: enabled: true externalZookeeper: servers: "zk:2181" # 未清空外部ZooKeeper地址 ``` **结果**:Kafka启动异常,日志中提示`ZooKeeper is not used in KRaft mode`。 --- ### **正确配置示例(KRaft模式)** ```yaml # values.yaml # 禁用ZooKeeper zookeeper: enabled: false externalZookeeper: servers: "" # 清空外部地址 # 启用KRaft kraft: enabled: true # 配置控制器节点 controller: replicaCount: 3 # 控制器数量(必须为奇数) storageClass: "ssd" persistence: enabled: true # 配置Broker节点 broker: replicaCount: 3 combinedMode: false # 角色分离(生产推荐) ``` --- ### **迁场景的特殊说明** 若需从ZooKeeper模式迁KRaft模式: 1. **使用Kafka官方迁工具**,逐步将元数据从ZooKeeperKRaft控制器节点。 2. **迁期间需临时启用混合模式**,但Helm Chart默认不直接支持,需手动调整配置。 3. **完成迁后彻底关闭ZooKeeper**,确保集群仅运行在KRaft模式下。 --- ### **验证KRaft模式是否生效** 1. **检查Pod角色** ```bash kubectl -n app-a get pods -l app.kubernetes.io/component=kafka ``` - 输出应包含`controller`和`broker`两类Pod(若角色分离)。 2. **查看控制器日志** ```bash kubectl -n app-a logs kafka-controller-0 | grep "KRaft" ``` - 预期输出:`Transitioning from state STARTING to ACTIVE`(控制器选举成功)。 --- ### **总结** - **KRaft模式下不能使用任何ZooKeeper服务**(内置或外部),两者是替代关系。 - 迁过程中需严格遵循Kafka官方流程,避免配置冲突。 - 生产环境建议优先使用KRaft模式以简化架构并提高性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值