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

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

相关推荐
WHFENGHE8 小时前
输电线路分布式故障监测装置技术解析
分布式
nightunderblackcat8 小时前
新手向:实现验证码程序
java·spring boot·spring·java-ee·kafka·maven·intellij-idea
a587699 小时前
消息队列(MQ)高级特性深度剖析:详解RabbitMQ与Kafka
java·分布式·面试·kafka·rabbitmq·linq
hmb↑9 小时前
Kafka 3.9.x 安装、鉴权、配置详解
分布式·kafka·linq
java干货9 小时前
还在重启应用改 Topic?Spring Boot 动态 Kafka 消费的“终极形态”
spring boot·kafka·linq
lifallen9 小时前
KafkaStreams 计算图节点设计:ProcessorNode、SourceNode、SinkNode
java·数据结构·算法·kafka·apache
AAA修煤气灶刘哥10 小时前
缓存世界的三座大山:穿透、击穿、雪崩,今天就把它们铲平!
redis·分布式·后端
失散1311 小时前
分布式专题——4 大厂生产级Redis高并发分布式锁实战
java·redis·分布式·缓存·架构
eqwaak012 小时前
科技信息差(9.10)
网络·人工智能·分布式·ar·智能硬件
一个帅气昵称啊13 小时前
C#,RabbitMQ从入门到精通,.NET8.0(路由/分布式/主题/消费重复问题 /延迟队列和死信队列/消息持久化 )/RabbitMQ集群模式
分布式·微服务·架构·rabbitmq·.net