Kafka 源码 KRaft 模式本地运行

KRaft(Kafka Raft Metadata mode) ,从版本 2.8.0 开始作为测试特性引入,并在后续版本中持续得到改进和增强。

KRaft 模式是指 Kafka 使用 Raft 协议来管理集群元数据的一种运行模式,这标志着 Kafka 向去除对 ZooKeeper 依赖迈出了重要一步。

在 KRaft 之前,Kafka 依赖于外部服务 ZooKeeper 来管理集群的元数据,包括主题、分区、配置信息等。ZooKeeper 在 Kafka 集群中扮演着协调者的角色,负责维护集群的状态,进行领导者选举等关键操作。

这种设计带来了一些挑战:

  • 复杂性:部署和管理一个额外的 ZooKeeper 集群增加了运维的复杂性。
  • 性能瓶颈:对 ZooKeeper 的依赖可能成为系统扩展性的瓶颈。
  • 故障隔离:ZooKeeper 的问题可能会影响整个 Kafka 集群的稳定性和可用性。

KRaft 模式

通过使用 Raft 协议直接在 Kafka 内部管理元数据,旨在消除对 ZooKeeper 的依赖,从而简化架构,提高性能和可靠性。

Raft 是一个为分布式系统设计的一致性算法,它提供了一种相对简单的方式来实现分布式系统中的领导者选举和日志复制。

特点和优势如下:

  • 简化架构:没有了 ZooKeeper,Kafka 集群的部署和管理变得更简单。
  • 提高性能:去除了与 ZooKeeper 的交互,减少了延迟,提高了元数据操作的效率。
  • 增强可靠性:KRaft 模式通过简化系统组件和操作,降低了系统出错的可能性,提升了集群的稳定性。

接下来我们就以 trunk 分支代码来展示下本地运行 KRaft 模式的 kafka。只展示单个配置既是 broker 也是 controller 的场景。

准备配置文件

KRaft 模式的配置文件在 config/kraft 这个目录下。

properties 复制代码
# 服务角色,这里配置的是即是broker也是controller,可以只是broker或者controller
process.roles=broker,controller
node.id=1
# 参与选举的controller的连接串,多个逗号隔开
controller.quorum.voters=1@localhost:9093
# 服务器监听地址,9092是broker的,9094是controller的
listeners=PLAINTEXT://:9092,CONTROLLER://:9094
inter.broker.listener.name=PLAINTEXT
# 服务器向客户端公告的地址,如果角色包含broker,则只能设置broker监听地址,不能有controller的,如果角色是controller,不能配置该地址,否则都会报错
advertised.listeners=PLAINTEXT://localhost:9092
controller.listener.names=CONTROLLER
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
num.network.threads=3
num.io.threads=8
# 存储目录
log.dirs=/xx/logs/kraft/9092

生成集群 ID

sh 复制代码
bin % ./kafka-storage.sh random-uuid
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
mrK5v9Z0TgW5RzOhJINKAg

格式化存储目录

使用上面生成的集群 ID 来格式化存储目录

sh 复制代码
bin % ./kafka-storage.sh format -t mrK5v9Z0TgW5RzOhJINKAg -c /xx/kafka/config/kraft/server.properties
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Reload4jLoggerFactory]
Formatting /xx/logs/kraft/9092 with metadata.version xx.

Formatting /xx/logs/kraft/9092 with metadata.version xx. 看到这段输出表示格式化成功了,如果要启动多个节点,确保每个节点使用上面生成的集群 ID 来格式化目录。

存储目录下会生成 meta.properties 文件,内容如下:

properties 复制代码
#Thu Nov 07 15:35:41 CST 2024
node.id=1
directory.id=4kbMnKtvhPVAX2hpLdcy-g
version=1
cluster.id=mrK5v9Z0TgW5RzOhJINKAg

启动服务

在 idea 中直接配置启动类,设置配置文件地址为上面格式化目录时指定的地址:config/kraft/server.properties

启动成功,不需要在额外依赖其他服务了,对于本地调试来说,会方便很多。

相关推荐
泡海椒5 小时前
深度解析JQuick-SQL SQL解析与AST生成机制|分布式SQL原理
数据库·分布式·sql
ZealSinger7 小时前
Boot4升后Kafka retry属性怎么改
kafka·retry·boot4·升级踩坑
2603_954708318 小时前
微能网协调控制箱的架构优势对能源管理的影响?
大数据·人工智能·分布式·安全·架构
starzy19908 小时前
KafkaProducer 源码深度剖析:处理粘包问题的完美方案
大数据·kafka
方方洛9 小时前
ray教程-14-RayTune与超参搜索
人工智能·分布式·机器学习
深圳市恒星物联科技有限公司9 小时前
排水管网监测分层分布式架构:感知-传输-平台-应用详解
分布式·架构
chunyublog10 小时前
FinalShell 远程连接 Hadoop 三节点集群教程
大数据·hadoop·分布式
泡海椒11 小时前
深度解析JQuick-SQL 逻辑计划到物理计划生成机制|分布式SQL原理
数据库·分布式·sql
MrWind灬11 小时前
我给自己写了个 Kafka 桌面客户端:MrWindKafkaClient
kafka·pyqt
磁场转动100万匹11 小时前
Spark Core 核心原理:从 RDD 到分布式计算
大数据·分布式·spark