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

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

相关推荐
回家路上绕了弯4 小时前
外卖员重复抢单?从技术到运营的全链路解决方案
分布式·后端
忍冬行者5 小时前
Kafka 概念与部署手册
分布式·kafka
深蓝电商API5 小时前
爬虫+Redis:如何实现分布式去重与任务队列?
redis·分布式·爬虫·python
在未来等你6 小时前
Elasticsearch面试精讲 Day 28:版本升级与滚动重启
大数据·分布式·elasticsearch·搜索引擎·面试
AAA小肥杨12 小时前
基于k8s的Python的分布式深度学习训练平台搭建简单实践
人工智能·分布式·python·ai·kubernetes·gpu
爬山算法15 小时前
Redis(73)如何处理Redis分布式锁的死锁问题?
数据库·redis·分布式
yumgpkpm17 小时前
华为鲲鹏 Aarch64 环境下多 Oracle 、mysql数据库汇聚到Cloudera CDP7.3操作指南
大数据·数据库·mysql·华为·oracle·kafka·cloudera
祈祷苍天赐我java之术17 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
猫林老师20 小时前
HarmonyOS线程模型与性能优化实战
数据库·分布式·harmonyos
阿里云云原生21 小时前
AI 时代的数据通道:云消息队列 Kafka 的演进与实践
云原生·kafka