Steef-Jan Wiggers 译者 | 平川 策划 | Tina Apache Kafka 4.0 的发布是一个重要的里程碑,本次大版本更新引入了大量的新功能和改进,其中最引人注目的是 KRaft 然而,Kafka 4.0 默认采用 KRaft,无需再单独维护 ZooKeeper 组件,简化了部署和管理。 这一转变简化了 Kafka 的架构,抛弃了独立的 ZooKeeper 系统,提高了可扩展性,并为自给自足的未来铺平了道路 —— 这一切都要归功于 KRaft 的 Raft 协议。 还有:KRaft 的优势:一个系统,数以百万计的分区,更快的恢复 —— Kafka 已经准备好翱翔蓝天! 除了架构上的转变,Kafka 4.0 还正式引入了下一代消费者组协议 KIP-848 。 原文链接: https://www.infoq.com/news/2025/04/kafka-4-kraft-architecture/ 声明:本文为 InfoQ 翻译,未经许可禁止转载。
本文我们就来讨论 Kafka 为什么要抛弃 ZooKeeper,以及 KRaft 的设计思路。 引入 KRaft 抛弃 ZooKeeper 之后,Kafka 演进到了 KRaft(Kafka Raft)模式,这是一种 Kafka 内部的共识协议,它可以让 Kafka 实现自我管理。 架构 KRaft KRaft 模式下,Broker 有两种角色,一种是 Controller Quorum,另一种是 Broker Nodes,可以在配置文件中通过 process.roles 参数来指定 部署方式 KRaft 模式下有两种部署方式,一种是混合模式,一种是隔离模式。 在新版本的 Kafka 中,已经全面拥抱 KRaft 了。
这是第一个标志着可以在生产环境中使用KRaft(Kafka Raft)共识协议的版本。 KRaft 使用了Raft共识算法的一种基于事件的变体,因此得名。 随 KRaft 引入的新的仲裁控制器确保元数据在整个仲裁中可以被准确复制。 KRaft 模式的优势 去除外部依赖:传统的 Kafka 集群依赖于 ZooKeeper 来存储集群元数据和进行领导选举等,引入 KRaft 后,Kafka 将自行管理这些功能,从而去除了对 ZooKeeper 改善可扩展性:KRaft 模式下,Kafka 能够更好地支持大规模集群,提高元数据操作的效率。 迁移到 KRaft 迁移到 KRaft 需要谨慎规划,尤其是对于已经在生产中运行的 Kafka 集群。 当前,对于新的 Kafka 集群,推荐直接采用 KRaft 模式部署。
这是第一个标志着可以在生产环境中使用 KRaft(Kafka Raft)共识协议的版本。 KRaft 是一种共识协议,可以直接在 Kafka 中管理元数据。元数据的管理被整合到了 Kafka 当中,而不需要使用像 ZooKeeper 这样的第三方工具,这大大简化了 Kafka 的架构。 这种新的 KRaft 模式提高了分区的可伸缩性和弹性,同时简化了 Kafka 的部署,现在可以不依赖 ZooKeeper 单独部署 Kafka 了。 KRaft 使用了 Raft 共识算法的一种基于事件的变体,因此得名。 随 KRaft 引入的新的仲裁控制器确保元数据在整个仲裁中可以被准确复制。 原文链接: https://www.infoq.com/news/2022/10/apache-kafka-kraft/ 声明:本文为InfoQ翻译,未经许可禁止转载。
Kafka-Kraft 模式 1. Kafka-Kraft 架构 左图为 Kafka 现有架构,元数据在 zookeeper 中,运行时动态选举 controller,由controller 进行 Kafka 集群管理。 右图为 kraft 模式架构(实验性),不再依赖 zookeeper 集群,而是用三台 controller 节点代替zookeeper,元数据保存在 controller 中,由 controller 2 Kafka-Kraft 集群部署 1)解压一份 kafka 安装包 tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module/ 2)重命名为 kafka2 mv -daemon config/kraft/server.properties bin/kafka-server-start.sh -daemon config/kraft/server.properties
我们前面演示都是依赖ZooKeeper的版本,本小节我们介绍2个版本不依赖ZooKeeper的版本,第一个版本就是我们前面使用的版本:kafka_2.13-2.8.2,它既支持使用ZooKeeper,也支持使用kraft kraft,你可以简单理解就它把存储在ZooKeeper里面的内容存储到Kafka节点里面。 /config/kraft/server.properties # 3. 启动 Kafka,注意配置文件使用,实际就是换了个配置文件 ./bin/kafka-server-start.sh . /config/kraft/server.properties 启动成功以后,会生成下面的内容。可以你可以把理解存储到ZooKeeper的换成了下面的内容。 下面是Kafka4.0版本,从目录文件来看,它已经没有单独的kraft目录,因为它已经不支持ZooKeeper,默认的配置都是用于支持Kraft的。
当然,只有一个节点能成为领导节点即Active Controller,领导选举就依赖于内置的Raft协议变种(又称为KRaft)实现。 Quorum节点状态机 在KRaft协议下,Quorum中的一个节点可以处于以下4种状态之一。 为了适应Kafka环境,KRaft协议以拉模式交互,定义的RPC消息有如下几种。 那么在KRaft协议中,是如何维护哪些元数据日志已经提交——即已经成功复制到多数的Follower节点上的呢? 状态机安全性保证 在安全性方面,KRaft与传统Raft的选举安全性、领导者只追加、日志匹配和领导者完全性保证都是几乎相同的。
当然,只有一个节点能成为领导节点即Active Controller,领导选举就依赖于内置的Raft协议变种(又称为KRaft)实现。 Quorum节点状态机 在KRaft协议下,Quorum中的一个节点可以处于以下4种状态之一。 为了适应Kafka环境,KRaft协议以拉模式交互,定义的RPC消息有如下几种。 那么在KRaft协议中,是如何维护哪些元数据日志已经提交——即已经成功复制到多数的Follower节点上的呢? 与传统Raft不同,KRaft附加了一个较强的约束:当新的Leader被选举出来,但还没有成功提交属于它的epoch的日志时,不会向前推进HW。
1 新的KRaft架构模式在Kafka 2.8之前,Kafka重度依赖于Zookeeper集群做元数据管理和集群的高可用(即所谓的共识服务)。 总体而言,使用KRaft的好处如下: Kafka不用再依赖外部框架,能够做到独立运行。类似于Redis的Sentinel,它的本质仍然是一个Kafka实例。 2 KRaft架构模式部署实战本次我们采用物理宿主机部署,本集群三个Kafka实例均在一台主机上。 修改KRaft必要配置和基于Zookeeper的模式不同,KRaft模式下的配置需要进入Kraft目录,找到server.properties文件:cd config/kraft依次修改每个服务器下的kraft 3 总结本文总结了Kafka KRaft模式的基本概念和优点,介绍了Kafka KRaft模式的部署过程。
如何在 Kubernetes 上手撸 KRaft 模式 Kafka 集群? 今天分享的主题是:不使用 Helm、Operator,如何在 Kubernetes 集群上手工部署一个开启 SASL 认证的 KRaft 模式的 Kafka 集群? 逐步引导您完成以下关键任务:配置 Kafka Secret:管理用户密码和集群 ID配置 Kafka Service:使用 NodePort 对外发布 Kafka 服务使用 StatefulSet 部署 KRaft 模式 Kafka 集群如何测试 Kafka 集群的可用性通过本文的指导,您将掌握在 Kubernetes 上部署 KRaft 模式 Kafka 集群的必备技能。 请使用 vi 编辑器,创建资源清单文件 kafka-kraft-cluster-id.yaml,并输入以下内容:kind: SecretapiVersion: v1metadata: name: kafka-kraft-cluster-id
...通过上述的处理时序,Controller 就可以做到“内存状态与 KRaft ”和“多节点之间的内存状态”的一致性:内存状态与 KRaft :Controller 的内存状态都是基于 KRaft 确认的 Records 变更 #replay出来的,因此内存状态和 KRaft 保持一致;多节点之间的内存状态:KRaft 底层保证了多节点的 KRaft Log 是一致的,然后基于 “内存状态与 KRaft ;响应仍旧是 KRaft 多数派确认后再返回;Follower 的内存状态仍旧是从 KRaft Log 的 Records #replay 更新;Controller 处理请求的最大吞吐为:Min(1s / Manager 代码执行 CPU 耗时, KRaft 写入吞吐)。 KRaft 确认过的数据。
所以在面对 kRaft 的时候,显得我略微生疏,换句话说就是根本没有了解过,所以今天就来学习一下 Kafka 的 KRaft 模式。 在 Kafka 3.3.1 版本,KRaft 被标记为生产就绪版本,也就是意味着可以引入生产。 目录,其中的 server.prorperties 就是 KRaft 模式的文件。 而对于 KRaft 模式,必需的配置就多了很多。1. process.roles在 Kraft 模式下,集群中必须有两个角色:controller 和 broker。 结语本篇文章文章的初衷就是记录一下 KRaft 模式下的 kafka 配置,弥补一下自己在这一块的知识空白。
kraft单机安装kafka无需安装zookeeper(Kafka2.8版本之后支持) 下载 官网地址: http://kafka.apache.org/downloads.html 这里选择的是kafka /server.properties [root@localhost kraft]# sh /usr/local/kafka/kafka_2.12-3.6.0/bin/kafka-storage.sh format -t C4mOgAy4TouDNwkz_35D0A -c /usr/local/kafka/kafka_2.12-3.6.0/config/kraft/server.properties Formatting /tmp/kraft-combined-logs with metadata.version 3.6-IV2. [root@localhost kraft]# 后台启动kafka sh /usr/local/kafka/kafka_2.12-3.6.0/bin/kafka-server-start.sh -daemon
本文是Kafka Raft技术系列中的第一篇,我们先来初步体验一下KRaft的入门使用。 KRaft 简介 Apache Kafka 不依赖 Apache Zookeeper的版本,被社区称之为 Kafka Raft 元数据模式,简称KRaft(craft)模式。 KRaft 架构 首先来看一下KRaft在系统架构层面和之前的版本有什么区别。 接下来,我们来看一下如何运行我们的第一个KRaft集群: 部署和配置 在当前架构中,新增了如下三个参数: # 标识该节点所承担的角色,在KRaft模式下需要设置这个值process.roles 在后续的文章中,我们会详细展开KRaft、Controler Quorum,Kafka Raft Snapshot相关的原理解析和代码讲解。让大家可以提前一步熟悉KRaft 3.0。
=PLAINTEXT.metadata_quorum=ISOLATED_KRAFT: Setting up... =PLAINTEXT.metadata_quorum=ISOLATED_KRAFT: Running... =PLAINTEXT.metadata_quorum=ISOLATED_KRAFT: Tearing down... AutoMQ 目前只支持 KRaft 模式下启动 Kafka 集群,因此我们更关注 KRaft 模式下的系统测试。 ,我们梳理并改造了相关测试,以支持 KRaft 模式下的验证。
KRaft模式崛起:基于Raft协议的内部机制 在Kafka的演进历程中,KRaft模式的出现标志着元数据管理机制的根本性变革。 以下从性能、可靠性、可扩展性和运维复杂度四个维度,系统对比ZooKeeper与KRaft的差异。 性能对比 在性能方面,ZooKeeper和KRaft表现出显著不同的特性。 面试中,可以讨论KRaft如何通过内置的元数据管理简化运维。 例如,在云环境中,KRaft模式更易于与Kubernetes等编排工具集成,实现自动化运维。 问题4:KRaft模式有缺点吗? 同时,随着边缘计算和物联网(IoT)的发展,轻量级KRaft部署或变种协议可能成为支撑低功耗设备集群元数据管理的新方案。 值得注意的是,尽管KRaft带来了诸多优势,其全面落地仍面临挑战。
最新版的Kafka 2.8.0,移除了对Zookeeper的依赖,通过KRaft进行自己的集群管理。很好很好,终于有点质的改变了。 一听到KRaft,我们就想到了Raft协议。 如何开始KRaft? Kafka使用内嵌的KRaft替代了ZooKeeper,是一个非常大的进步,因为像ES之类的分布式系统,这种集群meta信息的同步,都是自循环的。 但如何使用KRaft启动呢? /config/kraft/server.properties # ./bin/kafka-server-start.sh . /config/kraft/server.properties 经过一阵噼里啪啦的运行,No ZK的Kafka已经启动起来了。 ? 就是这么简单。 2. 如何配置的? 你可以使用vimdiff config/server.properties config/kraft/server.properties看一下这些主要的区别。
在 KRaft 模式下,controller.quorum.voters 是必需配置,用于指定集群的控制器节点。 \config\kraft\server.properties 表明 Kafka 存储格式化成功 小插曲 这个错误表明您正在尝试使用 KRaft 模式格式化存储,但配置文件是针对 旧版的 Zookeeper Kafka 从 3.0 版本开始引入了 KRaft 模式(不再需要 Zookeeper)。 所以应该使用kraft版本的配置文件 # 使用 kraft 版本的配置文件 kafka-storage.bat format -t JnhYFIOcRXipOJdyvUlVcA -c ..\.. \config\kraft\server.properties 启动 Kafka 在 bin\windows 目录下执行: kafka-server-start.bat ..\..
3.3 版本将 KRaft 模式标记仅作为适用于新集群的生产信息,请参考:KIP-833。 Kafka Broker Controller Producer Consumer 和 Admin Client KIP-833:将 KRaft 标记为生产就绪 KIP将 KRaft 标记为可用于 Kafka IP -833 KRaft 3.5.0 标记为连接 KRaft 的版本。版本。 KIP-778:KRaft 到 KRaft 的升级 KIP- 7788 允许升级 KRaft 集群,而不是臭名昭著的双滚模式。 KIP-835:监控 KRaft 控制器 Quorum 健康状况 使用 KRaft 模式,Apache Kafka 向集群添加了一个新的控制器仲裁。
然而,这种架构也存在单点瓶颈,后续章节将讨论如何通过KRaft模式进一步优化。 需要注意的是,KRaft模式在Kafka 3.x版本中已达到生产就绪状态,但在某些边缘功能(如某些监控接口和工具集成)上可能还存在与传统模式的差异。 KRaft并非万能解决方案。 KRaft模式下Controller有哪些变化? KRaft模式是Kafka在2.8版本之后引入的共识协议,用于替代ZooKeeper。 面试回答建议:强调KRaft的优势。 KRaft模式下的部署优化:如果使用KRaft(Kafka Raft Metadata模式),由于去除了ZooKeeper依赖,部署更为简化。