Kafka 4.0 抛弃 ZooKeeper:KRaft 重构集群协调的底层逻辑

Kafka 4.0 抛弃 ZooKeeper:KRaft 重构集群协调的底层逻辑

    • 1. 引言:一个时代的终结
    • 2. 历史回顾:ZooKeeper 模式及其局限
      • 2.1 传统架构概览
      • 2.2 ZooKeeper 模式的五大痛点
    • 3. KRaft:Kafka 的原生元数据管理
      • 3.1 KRaft 是什么?
      • 3.2 核心架构
      • 3.3 节点角色
      • 3.4 核心组件
    • 4. KRaft 核心原理深度解析
      • 4.1 元数据即事件日志
      • 4.2 Controller 的一致性保障
      • 4.3 Broker 的声明式状态同步
    • 5. ZooKeeper vs. KRaft:全维度对比
    • 6. 版本演进与迁移路线图
      • 6.1 KRaft 版本里程碑
      • 6.2 从 ZK 模式迁移的路径
    • 7. 总结:KRaft 的价值与展望

🌺The Begin🌺点点关注,收藏不迷路🌺

从“双系统运维”到“自包含架构”,Kafka 十年的架构演进之路

1. 引言:一个时代的终结

如果你在 2024 年之后部署 Kafka,会发现一个显著的变化:ZooKeeper 不见了

长期以来,ZooKeeper 一直是 Kafka 集群不可或缺的组成部分,负责存储元数据、选举 Controller、管理 Broker 存活状态。但这一组合也带来了运维复杂度高、集群规模受限等痛点。

随着 Kafka 4.0 的发布,ZooKeeper 被完全移除,KRaft(Kafka Raft)模式成为唯一原生架构。本文将深入剖析这一架构变革背后的技术逻辑。

2. 历史回顾:ZooKeeper 模式及其局限

2.1 传统架构概览

在 KRaft 出现之前,一个生产级 Kafka 集群需要同时运维两套系统:

Kafka Cluster

ZooKeeper Ensemble

ZK节点1

ZK节点2

ZK节点3

Controller
选举与协调

Broker 1

Broker 2

Broker 3

2.2 ZooKeeper 模式的五大痛点

  1. 运维复杂度翻倍:需要独立维护 ZooKeeper 集群,两套系统的部署、监控、升级、容灾体系完全割裂。

  2. 集群规模受限:传统模式下,单集群 Broker 上限约 200-300 个,分区总数上限约几十万。ZooKeeper 无法支撑超大规模场景。

  3. Controller 故障恢复慢:当 Controller 发生故障时,新 Controller 需要从 ZooKeeper 全量加载元数据,耗时可达秒级甚至数十秒。

  4. 元数据传播延迟:变更路径复杂:写入 ZK → Controller 读取 → 推送给 Broker。多跳路径产生不一致窗口。

  5. 羊群效应与性能衰减:ZooKeeper 的 watch 机制在大规模 Broker/分区场景下存在严重性能问题。

3. KRaft:Kafka 的原生元数据管理

3.1 KRaft 是什么?

KRaft(Kafka Raft)是 Kafka 基于 Raft 共识算法自研的原生元数据管理方案。它将元数据存储与共识能力内置到 Kafka 进程中,彻底取消对外部 ZooKeeper 的依赖。

3.2 核心架构

Broker Nodes

Controller Quorum (Raft集群)

Raft日志复制

Raft日志复制

拉取元数据日志

拉取元数据日志

拉取元数据日志

Controller Leader
Active Controller

Controller Follower
Standby

Controller Follower
Standby

Broker
Observer + 业务流量

Broker
Observer + 业务流量

Broker
Observer + 业务流量

3.3 节点角色

KRaft 模式下,Kafka 节点分为三类角色,通过 process.roles 配置指定:

角色 职责 配置 适用场景
Controller 组成 Raft 共识集群,负责元数据写入与 Leader 选举 process.roles=controller 生产推荐:独立部署
Broker 处理业务流量,从 Controller 拉取元数据 process.roles=broker 生产推荐:独立部署
Combined 同时承担 Controller 和 Broker 职责 process.roles=controller,broker 开发/测试环境

3.4 核心组件

KRaft 用以下五大组件完全替代了 ZooKeeper 的能力:

替代的ZK能力

KRaft 核心组件

元数据事件日志
__cluster_metadata

Raft 共识引擎

Controller 状态机

Broker 状态机

元数据快照管理器

znode树形存储

ZAB共识协议

watch机制

快照清理

4. KRaft 核心原理深度解析

4.1 元数据即事件日志

KRaft 最核心的设计理念是 “元数据即事件日志”(Metadata as an Event Log)。

所有元数据变更(创建 Topic、修改配置、分区重分配等)都被封装为事件,顺序追加写入一个名为 __cluster_metadata 的内部主题:

消费者

元数据事件日志 (__cluster_metadata)

Event 0
Topic创建

Event 1
Broker注册

Event 2
分区分配

Event 3
配置变更

Controller Follower
replay构建内存状态

Broker
replay构建元数据缓存

这与 ZooKeeper 的树形结构(znode)有本质区别:

  • ZooKeeper:存储的是状态(当前是什么)
  • KRaft:存储的是事件日志(发生了什么变化)

4.2 Controller 的一致性保障

Controller 通过 Raft 协议保证多节点间元数据一致性。其核心处理流程如下:

Raft Log

Controller Follower

Controller Leader

Broker客户端

Raft Log

Controller Follower

Controller Leader

Broker客户端

par

[异步提交]

请求 CAS(1,2)

放入事件队列

Manager单线程处理

判断内存值=1

生成 Record{value=2}

立即 replay 更新内存

异步提交 Record

复制 Record

replay 更新内存

多数派确认

返回响应

关键优化:为提升吞吐量,Leader 在生成 Record 后立即 replay 更新内存(而非等待 Raft 确认),然后异步提交。这引入了脏数据风险,Kafka 通过 MVCC 风格的 Timeline 数据结构 解决——当 Leader 切换时,旧 Leader 回滚到上一个已确认的状态。

4.3 Broker 的声明式状态同步

在 ZK 模式下,Controller 需要主动调用 Broker 的 RPC 来执行变更(如分区移动)。这带来了顺序和幂等性问题。

在 KRaft 模式下,Controller 转变为声明式管理者:它将“期望状态”写入元数据日志,Broker 各自监听日志并自行达成该状态:

声明式管理

用户请求

Controller

写入 __cluster_metadata
期望状态: P1应在B2

Broker 1

Broker 2

读取: P1应在B2
关闭P1

读取: P1应在B2
打开P1

这种设计大幅简化了 Controller 的逻辑,也避免了 RPC 调用失败带来的重试复杂性。

5. ZooKeeper vs. KRaft:全维度对比

对比维度 ZooKeeper 模式 KRaft 模式
运维复杂度 需同时维护两套系统 仅需维护 Kafka
最小生产集群 3 ZK + N Broker 3 Controller + N Broker(或 3 Combined)
分区上限 ~20万 数百万
Controller 故障恢复 秒级~数十秒(全量加载) 毫秒级(本地已有元数据)
元数据传播 ZK watch 推送(羊群效应) Broker 主动拉取日志
一致性模型 ZAB 协议 + 两套系统的脆弱一致 Raft 协议 + 统一日志
创建1000分区耗时 10-15秒 1-2秒

6. 版本演进与迁移路线图

6.1 KRaft 版本里程碑

版本 里程碑
2.8.0 KRaft 首次预览版,不支持生产
3.3.1 正式标记为生产可用
3.5.0 迁移脚本生产可用,ZK 模式标记弃用
4.0.0 完全移除 ZooKeeper,KRaft 成唯一模式

6.2 从 ZK 模式迁移的路径

升级路径

Kafka 2.x
ZK模式

Kafka 3.4/3.5
Bridge模式

运行迁移脚本
metadata-migration.sh

Kafka 3.5+
KRaft模式

Kafka 4.0
纯KRaft

关键注意:不能从旧版 ZK 模式直接升级到 4.0,必须先通过 3.5 版本完成迁移。

迁移建议:

  1. 先在测试环境完整演练
  2. 确保客户端工具支持 KRaft
  3. 迁移期间密切监控元数据一致性

7. 总结:KRaft 的价值与展望

KRaft 取代 ZooKeeper,标志着 Kafka 成为真正自包含的分布式系统。这一变革的核心价值可以概括为:

KRaft 核心价值

简化运维
一套系统,一个安全模型

突破规模
百万级分区支持

加速恢复
毫秒级故障切换

声明式管理
降低协调复杂度

对于新部署的 Kafka 集群,KRaft 已是默认且唯一的选择。对于仍在运行 ZK 模式的存量集群,迁移规划已迫在眉睫——Kafka 4.0 之后,ZooKeeper 支持已彻底结束。


原创不易,如果觉得有帮助,欢迎点赞收藏 💡
评论区聊聊:你的 Kafka 集群完成 KRaft 迁移了吗?

标签Kafka KRaft ZooKeeper 架构演进 消息队列

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺
© 版权声明

相关文章