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 集群需要同时运维两套系统:
#mermaid-svg-joeYvBn7ihvI6kzC{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-joeYvBn7ihvI6kzC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-joeYvBn7ihvI6kzC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-joeYvBn7ihvI6kzC .error-icon{fill:#552222;}#mermaid-svg-joeYvBn7ihvI6kzC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-joeYvBn7ihvI6kzC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-joeYvBn7ihvI6kzC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-joeYvBn7ihvI6kzC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-joeYvBn7ihvI6kzC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-joeYvBn7ihvI6kzC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-joeYvBn7ihvI6kzC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-joeYvBn7ihvI6kzC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-joeYvBn7ihvI6kzC .marker.cross{stroke:#333333;}#mermaid-svg-joeYvBn7ihvI6kzC svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-joeYvBn7ihvI6kzC p{margin:0;}#mermaid-svg-joeYvBn7ihvI6kzC .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-joeYvBn7ihvI6kzC .cluster-label text{fill:#333;}#mermaid-svg-joeYvBn7ihvI6kzC .cluster-label span{color:#333;}#mermaid-svg-joeYvBn7ihvI6kzC .cluster-label span p{background-color:transparent;}#mermaid-svg-joeYvBn7ihvI6kzC .label text,#mermaid-svg-joeYvBn7ihvI6kzC span{fill:#333;color:#333;}#mermaid-svg-joeYvBn7ihvI6kzC .node rect,#mermaid-svg-joeYvBn7ihvI6kzC .node circle,#mermaid-svg-joeYvBn7ihvI6kzC .node ellipse,#mermaid-svg-joeYvBn7ihvI6kzC .node polygon,#mermaid-svg-joeYvBn7ihvI6kzC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-joeYvBn7ihvI6kzC .rough-node .label text,#mermaid-svg-joeYvBn7ihvI6kzC .node .label text,#mermaid-svg-joeYvBn7ihvI6kzC .image-shape .label,#mermaid-svg-joeYvBn7ihvI6kzC .icon-shape .label{text-anchor:middle;}#mermaid-svg-joeYvBn7ihvI6kzC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-joeYvBn7ihvI6kzC .rough-node .label,#mermaid-svg-joeYvBn7ihvI6kzC .node .label,#mermaid-svg-joeYvBn7ihvI6kzC .image-shape .label,#mermaid-svg-joeYvBn7ihvI6kzC .icon-shape .label{text-align:center;}#mermaid-svg-joeYvBn7ihvI6kzC .node.clickable{cursor:pointer;}#mermaid-svg-joeYvBn7ihvI6kzC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-joeYvBn7ihvI6kzC .arrowheadPath{fill:#333333;}#mermaid-svg-joeYvBn7ihvI6kzC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-joeYvBn7ihvI6kzC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-joeYvBn7ihvI6kzC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-joeYvBn7ihvI6kzC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-joeYvBn7ihvI6kzC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-joeYvBn7ihvI6kzC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-joeYvBn7ihvI6kzC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-joeYvBn7ihvI6kzC .cluster text{fill:#333;}#mermaid-svg-joeYvBn7ihvI6kzC .cluster span{color:#333;}#mermaid-svg-joeYvBn7ihvI6kzC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-joeYvBn7ihvI6kzC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-joeYvBn7ihvI6kzC rect.text{fill:none;stroke-width:0;}#mermaid-svg-joeYvBn7ihvI6kzC .icon-shape,#mermaid-svg-joeYvBn7ihvI6kzC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-joeYvBn7ihvI6kzC .icon-shape p,#mermaid-svg-joeYvBn7ihvI6kzC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-joeYvBn7ihvI6kzC .icon-shape .label rect,#mermaid-svg-joeYvBn7ihvI6kzC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-joeYvBn7ihvI6kzC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-joeYvBn7ihvI6kzC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-joeYvBn7ihvI6kzC :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Kafka Cluster
ZooKeeper Ensemble
ZK节点1
ZK节点2
ZK节点3
Controller选举与协调
Broker 1
Broker 2
Broker 3
2.2 ZooKeeper 模式的五大痛点
运维复杂度翻倍:需要独立维护 ZooKeeper 集群,两套系统的部署、监控、升级、容灾体系完全割裂。
集群规模受限:传统模式下,单集群 Broker 上限约 200-300 个,分区总数上限约几十万。ZooKeeper 无法支撑超大规模场景。
Controller 故障恢复慢:当 Controller 发生故障时,新 Controller 需要从 ZooKeeper 全量加载元数据,耗时可达秒级甚至数十秒。
元数据传播延迟:变更路径复杂:写入 ZK → Controller 读取 → 推送给 Broker。多跳路径产生不一致窗口。
羊群效应与性能衰减:ZooKeeper 的 watch 机制在大规模 Broker/分区场景下存在严重性能问题。
3. KRaft:Kafka 的原生元数据管理
3.1 KRaft 是什么?
KRaft(Kafka Raft)是 Kafka 基于 Raft 共识算法自研的原生元数据管理方案。它将元数据存储与共识能力内置到 Kafka 进程中,彻底取消对外部 ZooKeeper 的依赖。
3.2 核心架构
#mermaid-svg-9DgQ6vKQDSSILL4d{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9DgQ6vKQDSSILL4d .error-icon{fill:#552222;}#mermaid-svg-9DgQ6vKQDSSILL4d .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9DgQ6vKQDSSILL4d .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9DgQ6vKQDSSILL4d .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9DgQ6vKQDSSILL4d .marker.cross{stroke:#333333;}#mermaid-svg-9DgQ6vKQDSSILL4d svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9DgQ6vKQDSSILL4d p{margin:0;}#mermaid-svg-9DgQ6vKQDSSILL4d .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-9DgQ6vKQDSSILL4d .cluster-label text{fill:#333;}#mermaid-svg-9DgQ6vKQDSSILL4d .cluster-label span{color:#333;}#mermaid-svg-9DgQ6vKQDSSILL4d .cluster-label span p{background-color:transparent;}#mermaid-svg-9DgQ6vKQDSSILL4d .label text,#mermaid-svg-9DgQ6vKQDSSILL4d span{fill:#333;color:#333;}#mermaid-svg-9DgQ6vKQDSSILL4d .node rect,#mermaid-svg-9DgQ6vKQDSSILL4d .node circle,#mermaid-svg-9DgQ6vKQDSSILL4d .node ellipse,#mermaid-svg-9DgQ6vKQDSSILL4d .node polygon,#mermaid-svg-9DgQ6vKQDSSILL4d .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9DgQ6vKQDSSILL4d .rough-node .label text,#mermaid-svg-9DgQ6vKQDSSILL4d .node .label text,#mermaid-svg-9DgQ6vKQDSSILL4d .image-shape .label,#mermaid-svg-9DgQ6vKQDSSILL4d .icon-shape .label{text-anchor:middle;}#mermaid-svg-9DgQ6vKQDSSILL4d .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9DgQ6vKQDSSILL4d .rough-node .label,#mermaid-svg-9DgQ6vKQDSSILL4d .node .label,#mermaid-svg-9DgQ6vKQDSSILL4d .image-shape .label,#mermaid-svg-9DgQ6vKQDSSILL4d .icon-shape .label{text-align:center;}#mermaid-svg-9DgQ6vKQDSSILL4d .node.clickable{cursor:pointer;}#mermaid-svg-9DgQ6vKQDSSILL4d .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9DgQ6vKQDSSILL4d .arrowheadPath{fill:#333333;}#mermaid-svg-9DgQ6vKQDSSILL4d .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9DgQ6vKQDSSILL4d .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9DgQ6vKQDSSILL4d .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9DgQ6vKQDSSILL4d .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9DgQ6vKQDSSILL4d .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9DgQ6vKQDSSILL4d .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9DgQ6vKQDSSILL4d .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9DgQ6vKQDSSILL4d .cluster text{fill:#333;}#mermaid-svg-9DgQ6vKQDSSILL4d .cluster span{color:#333;}#mermaid-svg-9DgQ6vKQDSSILL4d div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9DgQ6vKQDSSILL4d .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9DgQ6vKQDSSILL4d rect.text{fill:none;stroke-width:0;}#mermaid-svg-9DgQ6vKQDSSILL4d .icon-shape,#mermaid-svg-9DgQ6vKQDSSILL4d .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9DgQ6vKQDSSILL4d .icon-shape p,#mermaid-svg-9DgQ6vKQDSSILL4d .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9DgQ6vKQDSSILL4d .icon-shape .label rect,#mermaid-svg-9DgQ6vKQDSSILL4d .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9DgQ6vKQDSSILL4d .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9DgQ6vKQDSSILL4d .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9DgQ6vKQDSSILL4d :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Broker Nodes
Controller Quorum (Raft集群)
Raft日志复制
Raft日志复制
拉取元数据日志
拉取元数据日志
拉取元数据日志
Controller LeaderActive Controller
Controller FollowerStandby
Controller FollowerStandby
BrokerObserver + 业务流量
BrokerObserver + 业务流量
BrokerObserver + 业务流量
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 的能力:
#mermaid-svg-jaA1Nt56pLshhtqT{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jaA1Nt56pLshhtqT .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jaA1Nt56pLshhtqT .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jaA1Nt56pLshhtqT .error-icon{fill:#552222;}#mermaid-svg-jaA1Nt56pLshhtqT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jaA1Nt56pLshhtqT .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jaA1Nt56pLshhtqT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jaA1Nt56pLshhtqT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jaA1Nt56pLshhtqT .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jaA1Nt56pLshhtqT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jaA1Nt56pLshhtqT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jaA1Nt56pLshhtqT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jaA1Nt56pLshhtqT .marker.cross{stroke:#333333;}#mermaid-svg-jaA1Nt56pLshhtqT svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jaA1Nt56pLshhtqT p{margin:0;}#mermaid-svg-jaA1Nt56pLshhtqT .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-jaA1Nt56pLshhtqT .cluster-label text{fill:#333;}#mermaid-svg-jaA1Nt56pLshhtqT .cluster-label span{color:#333;}#mermaid-svg-jaA1Nt56pLshhtqT .cluster-label span p{background-color:transparent;}#mermaid-svg-jaA1Nt56pLshhtqT .label text,#mermaid-svg-jaA1Nt56pLshhtqT span{fill:#333;color:#333;}#mermaid-svg-jaA1Nt56pLshhtqT .node rect,#mermaid-svg-jaA1Nt56pLshhtqT .node circle,#mermaid-svg-jaA1Nt56pLshhtqT .node ellipse,#mermaid-svg-jaA1Nt56pLshhtqT .node polygon,#mermaid-svg-jaA1Nt56pLshhtqT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jaA1Nt56pLshhtqT .rough-node .label text,#mermaid-svg-jaA1Nt56pLshhtqT .node .label text,#mermaid-svg-jaA1Nt56pLshhtqT .image-shape .label,#mermaid-svg-jaA1Nt56pLshhtqT .icon-shape .label{text-anchor:middle;}#mermaid-svg-jaA1Nt56pLshhtqT .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jaA1Nt56pLshhtqT .rough-node .label,#mermaid-svg-jaA1Nt56pLshhtqT .node .label,#mermaid-svg-jaA1Nt56pLshhtqT .image-shape .label,#mermaid-svg-jaA1Nt56pLshhtqT .icon-shape .label{text-align:center;}#mermaid-svg-jaA1Nt56pLshhtqT .node.clickable{cursor:pointer;}#mermaid-svg-jaA1Nt56pLshhtqT .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jaA1Nt56pLshhtqT .arrowheadPath{fill:#333333;}#mermaid-svg-jaA1Nt56pLshhtqT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jaA1Nt56pLshhtqT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jaA1Nt56pLshhtqT .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jaA1Nt56pLshhtqT .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jaA1Nt56pLshhtqT .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jaA1Nt56pLshhtqT .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jaA1Nt56pLshhtqT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jaA1Nt56pLshhtqT .cluster text{fill:#333;}#mermaid-svg-jaA1Nt56pLshhtqT .cluster span{color:#333;}#mermaid-svg-jaA1Nt56pLshhtqT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jaA1Nt56pLshhtqT .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jaA1Nt56pLshhtqT rect.text{fill:none;stroke-width:0;}#mermaid-svg-jaA1Nt56pLshhtqT .icon-shape,#mermaid-svg-jaA1Nt56pLshhtqT .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jaA1Nt56pLshhtqT .icon-shape p,#mermaid-svg-jaA1Nt56pLshhtqT .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jaA1Nt56pLshhtqT .icon-shape .label rect,#mermaid-svg-jaA1Nt56pLshhtqT .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jaA1Nt56pLshhtqT .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jaA1Nt56pLshhtqT .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jaA1Nt56pLshhtqT :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
替代的ZK能力
KRaft 核心组件
元数据事件日志__cluster_metadata
Raft 共识引擎
Controller 状态机
Broker 状态机
元数据快照管理器
znode树形存储
ZAB共识协议
watch机制
快照清理
4. KRaft 核心原理深度解析
4.1 元数据即事件日志
KRaft 最核心的设计理念是 “元数据即事件日志”(Metadata as an Event Log)。
所有元数据变更(创建 Topic、修改配置、分区重分配等)都被封装为事件,顺序追加写入一个名为 __cluster_metadata 的内部主题:
#mermaid-svg-08d0Xa9NYcNtgJdb{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-08d0Xa9NYcNtgJdb .error-icon{fill:#552222;}#mermaid-svg-08d0Xa9NYcNtgJdb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-08d0Xa9NYcNtgJdb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-08d0Xa9NYcNtgJdb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-08d0Xa9NYcNtgJdb .marker.cross{stroke:#333333;}#mermaid-svg-08d0Xa9NYcNtgJdb svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-08d0Xa9NYcNtgJdb p{margin:0;}#mermaid-svg-08d0Xa9NYcNtgJdb .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-08d0Xa9NYcNtgJdb .cluster-label text{fill:#333;}#mermaid-svg-08d0Xa9NYcNtgJdb .cluster-label span{color:#333;}#mermaid-svg-08d0Xa9NYcNtgJdb .cluster-label span p{background-color:transparent;}#mermaid-svg-08d0Xa9NYcNtgJdb .label text,#mermaid-svg-08d0Xa9NYcNtgJdb span{fill:#333;color:#333;}#mermaid-svg-08d0Xa9NYcNtgJdb .node rect,#mermaid-svg-08d0Xa9NYcNtgJdb .node circle,#mermaid-svg-08d0Xa9NYcNtgJdb .node ellipse,#mermaid-svg-08d0Xa9NYcNtgJdb .node polygon,#mermaid-svg-08d0Xa9NYcNtgJdb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-08d0Xa9NYcNtgJdb .rough-node .label text,#mermaid-svg-08d0Xa9NYcNtgJdb .node .label text,#mermaid-svg-08d0Xa9NYcNtgJdb .image-shape .label,#mermaid-svg-08d0Xa9NYcNtgJdb .icon-shape .label{text-anchor:middle;}#mermaid-svg-08d0Xa9NYcNtgJdb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-08d0Xa9NYcNtgJdb .rough-node .label,#mermaid-svg-08d0Xa9NYcNtgJdb .node .label,#mermaid-svg-08d0Xa9NYcNtgJdb .image-shape .label,#mermaid-svg-08d0Xa9NYcNtgJdb .icon-shape .label{text-align:center;}#mermaid-svg-08d0Xa9NYcNtgJdb .node.clickable{cursor:pointer;}#mermaid-svg-08d0Xa9NYcNtgJdb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-08d0Xa9NYcNtgJdb .arrowheadPath{fill:#333333;}#mermaid-svg-08d0Xa9NYcNtgJdb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-08d0Xa9NYcNtgJdb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-08d0Xa9NYcNtgJdb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-08d0Xa9NYcNtgJdb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-08d0Xa9NYcNtgJdb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-08d0Xa9NYcNtgJdb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-08d0Xa9NYcNtgJdb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-08d0Xa9NYcNtgJdb .cluster text{fill:#333;}#mermaid-svg-08d0Xa9NYcNtgJdb .cluster span{color:#333;}#mermaid-svg-08d0Xa9NYcNtgJdb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-08d0Xa9NYcNtgJdb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-08d0Xa9NYcNtgJdb rect.text{fill:none;stroke-width:0;}#mermaid-svg-08d0Xa9NYcNtgJdb .icon-shape,#mermaid-svg-08d0Xa9NYcNtgJdb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-08d0Xa9NYcNtgJdb .icon-shape p,#mermaid-svg-08d0Xa9NYcNtgJdb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-08d0Xa9NYcNtgJdb .icon-shape .label rect,#mermaid-svg-08d0Xa9NYcNtgJdb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-08d0Xa9NYcNtgJdb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-08d0Xa9NYcNtgJdb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-08d0Xa9NYcNtgJdb :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
消费者
元数据事件日志 (__cluster_metadata)
Event 0Topic创建
Event 1Broker注册
Event 2分区分配
Event 3配置变更
…
Controller Followerreplay构建内存状态
Brokerreplay构建元数据缓存
这与 ZooKeeper 的树形结构(znode)有本质区别:
- ZooKeeper:存储的是状态(当前是什么)
- KRaft:存储的是事件日志(发生了什么变化)
4.2 Controller 的一致性保障
Controller 通过 Raft 协议保证多节点间元数据一致性。其核心处理流程如下:
Raft Log
Controller Follower
Controller Leader
Broker客户端
Raft Log
Controller Follower
Controller Leader
Broker客户端
#mermaid-svg-ibO98smhKvNAZ4Ks{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ibO98smhKvNAZ4Ks .error-icon{fill:#552222;}#mermaid-svg-ibO98smhKvNAZ4Ks .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ibO98smhKvNAZ4Ks .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ibO98smhKvNAZ4Ks .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ibO98smhKvNAZ4Ks .marker.cross{stroke:#333333;}#mermaid-svg-ibO98smhKvNAZ4Ks svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ibO98smhKvNAZ4Ks p{margin:0;}#mermaid-svg-ibO98smhKvNAZ4Ks .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ibO98smhKvNAZ4Ks text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-ibO98smhKvNAZ4Ks .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ibO98smhKvNAZ4Ks .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-ibO98smhKvNAZ4Ks .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-ibO98smhKvNAZ4Ks .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-ibO98smhKvNAZ4Ks #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-ibO98smhKvNAZ4Ks .sequenceNumber{fill:white;}#mermaid-svg-ibO98smhKvNAZ4Ks #sequencenumber{fill:#333;}#mermaid-svg-ibO98smhKvNAZ4Ks #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-ibO98smhKvNAZ4Ks .messageText{fill:#333;stroke:none;}#mermaid-svg-ibO98smhKvNAZ4Ks .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ibO98smhKvNAZ4Ks .labelText,#mermaid-svg-ibO98smhKvNAZ4Ks .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-ibO98smhKvNAZ4Ks .loopText,#mermaid-svg-ibO98smhKvNAZ4Ks .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-ibO98smhKvNAZ4Ks .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ibO98smhKvNAZ4Ks .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ibO98smhKvNAZ4Ks .noteText,#mermaid-svg-ibO98smhKvNAZ4Ks .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-ibO98smhKvNAZ4Ks .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ibO98smhKvNAZ4Ks .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ibO98smhKvNAZ4Ks .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ibO98smhKvNAZ4Ks .actorPopupMenu{position:absolute;}#mermaid-svg-ibO98smhKvNAZ4Ks .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-ibO98smhKvNAZ4Ks .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ibO98smhKvNAZ4Ks .actor-man circle,#mermaid-svg-ibO98smhKvNAZ4Ks line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-ibO98smhKvNAZ4Ks :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
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 各自监听日志并自行达成该状态:
#mermaid-svg-J5mQhTWLArAT1v4I{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-J5mQhTWLArAT1v4I .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-J5mQhTWLArAT1v4I .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-J5mQhTWLArAT1v4I .error-icon{fill:#552222;}#mermaid-svg-J5mQhTWLArAT1v4I .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-J5mQhTWLArAT1v4I .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-J5mQhTWLArAT1v4I .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-J5mQhTWLArAT1v4I .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-J5mQhTWLArAT1v4I .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-J5mQhTWLArAT1v4I .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-J5mQhTWLArAT1v4I .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-J5mQhTWLArAT1v4I .marker{fill:#333333;stroke:#333333;}#mermaid-svg-J5mQhTWLArAT1v4I .marker.cross{stroke:#333333;}#mermaid-svg-J5mQhTWLArAT1v4I svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-J5mQhTWLArAT1v4I p{margin:0;}#mermaid-svg-J5mQhTWLArAT1v4I .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-J5mQhTWLArAT1v4I .cluster-label text{fill:#333;}#mermaid-svg-J5mQhTWLArAT1v4I .cluster-label span{color:#333;}#mermaid-svg-J5mQhTWLArAT1v4I .cluster-label span p{background-color:transparent;}#mermaid-svg-J5mQhTWLArAT1v4I .label text,#mermaid-svg-J5mQhTWLArAT1v4I span{fill:#333;color:#333;}#mermaid-svg-J5mQhTWLArAT1v4I .node rect,#mermaid-svg-J5mQhTWLArAT1v4I .node circle,#mermaid-svg-J5mQhTWLArAT1v4I .node ellipse,#mermaid-svg-J5mQhTWLArAT1v4I .node polygon,#mermaid-svg-J5mQhTWLArAT1v4I .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-J5mQhTWLArAT1v4I .rough-node .label text,#mermaid-svg-J5mQhTWLArAT1v4I .node .label text,#mermaid-svg-J5mQhTWLArAT1v4I .image-shape .label,#mermaid-svg-J5mQhTWLArAT1v4I .icon-shape .label{text-anchor:middle;}#mermaid-svg-J5mQhTWLArAT1v4I .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-J5mQhTWLArAT1v4I .rough-node .label,#mermaid-svg-J5mQhTWLArAT1v4I .node .label,#mermaid-svg-J5mQhTWLArAT1v4I .image-shape .label,#mermaid-svg-J5mQhTWLArAT1v4I .icon-shape .label{text-align:center;}#mermaid-svg-J5mQhTWLArAT1v4I .node.clickable{cursor:pointer;}#mermaid-svg-J5mQhTWLArAT1v4I .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-J5mQhTWLArAT1v4I .arrowheadPath{fill:#333333;}#mermaid-svg-J5mQhTWLArAT1v4I .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-J5mQhTWLArAT1v4I .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-J5mQhTWLArAT1v4I .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-J5mQhTWLArAT1v4I .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-J5mQhTWLArAT1v4I .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-J5mQhTWLArAT1v4I .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-J5mQhTWLArAT1v4I .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-J5mQhTWLArAT1v4I .cluster text{fill:#333;}#mermaid-svg-J5mQhTWLArAT1v4I .cluster span{color:#333;}#mermaid-svg-J5mQhTWLArAT1v4I div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-J5mQhTWLArAT1v4I .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-J5mQhTWLArAT1v4I rect.text{fill:none;stroke-width:0;}#mermaid-svg-J5mQhTWLArAT1v4I .icon-shape,#mermaid-svg-J5mQhTWLArAT1v4I .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-J5mQhTWLArAT1v4I .icon-shape p,#mermaid-svg-J5mQhTWLArAT1v4I .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-J5mQhTWLArAT1v4I .icon-shape .label rect,#mermaid-svg-J5mQhTWLArAT1v4I .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-J5mQhTWLArAT1v4I .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-J5mQhTWLArAT1v4I .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-J5mQhTWLArAT1v4I :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
声明式管理
用户请求
Controller
写入 __cluster_metadata期望状态: P1应在B2
Broker 1
Broker 2
读取: P1应在B2关闭P1
读取: P1应在B2打开P1
这种设计大幅简化了 Controller 的逻辑,也避免了 RPC 调用失败带来的重试复杂性。
5. ZooKeeper vs. 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 模式迁移的路径
#mermaid-svg-GAbAjyUSOFZhKMTS{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GAbAjyUSOFZhKMTS .error-icon{fill:#552222;}#mermaid-svg-GAbAjyUSOFZhKMTS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GAbAjyUSOFZhKMTS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GAbAjyUSOFZhKMTS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GAbAjyUSOFZhKMTS .marker.cross{stroke:#333333;}#mermaid-svg-GAbAjyUSOFZhKMTS svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GAbAjyUSOFZhKMTS p{margin:0;}#mermaid-svg-GAbAjyUSOFZhKMTS .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-GAbAjyUSOFZhKMTS .cluster-label text{fill:#333;}#mermaid-svg-GAbAjyUSOFZhKMTS .cluster-label span{color:#333;}#mermaid-svg-GAbAjyUSOFZhKMTS .cluster-label span p{background-color:transparent;}#mermaid-svg-GAbAjyUSOFZhKMTS .label text,#mermaid-svg-GAbAjyUSOFZhKMTS span{fill:#333;color:#333;}#mermaid-svg-GAbAjyUSOFZhKMTS .node rect,#mermaid-svg-GAbAjyUSOFZhKMTS .node circle,#mermaid-svg-GAbAjyUSOFZhKMTS .node ellipse,#mermaid-svg-GAbAjyUSOFZhKMTS .node polygon,#mermaid-svg-GAbAjyUSOFZhKMTS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GAbAjyUSOFZhKMTS .rough-node .label text,#mermaid-svg-GAbAjyUSOFZhKMTS .node .label text,#mermaid-svg-GAbAjyUSOFZhKMTS .image-shape .label,#mermaid-svg-GAbAjyUSOFZhKMTS .icon-shape .label{text-anchor:middle;}#mermaid-svg-GAbAjyUSOFZhKMTS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GAbAjyUSOFZhKMTS .rough-node .label,#mermaid-svg-GAbAjyUSOFZhKMTS .node .label,#mermaid-svg-GAbAjyUSOFZhKMTS .image-shape .label,#mermaid-svg-GAbAjyUSOFZhKMTS .icon-shape .label{text-align:center;}#mermaid-svg-GAbAjyUSOFZhKMTS .node.clickable{cursor:pointer;}#mermaid-svg-GAbAjyUSOFZhKMTS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GAbAjyUSOFZhKMTS .arrowheadPath{fill:#333333;}#mermaid-svg-GAbAjyUSOFZhKMTS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GAbAjyUSOFZhKMTS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GAbAjyUSOFZhKMTS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GAbAjyUSOFZhKMTS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GAbAjyUSOFZhKMTS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GAbAjyUSOFZhKMTS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GAbAjyUSOFZhKMTS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GAbAjyUSOFZhKMTS .cluster text{fill:#333;}#mermaid-svg-GAbAjyUSOFZhKMTS .cluster span{color:#333;}#mermaid-svg-GAbAjyUSOFZhKMTS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GAbAjyUSOFZhKMTS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GAbAjyUSOFZhKMTS rect.text{fill:none;stroke-width:0;}#mermaid-svg-GAbAjyUSOFZhKMTS .icon-shape,#mermaid-svg-GAbAjyUSOFZhKMTS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GAbAjyUSOFZhKMTS .icon-shape p,#mermaid-svg-GAbAjyUSOFZhKMTS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GAbAjyUSOFZhKMTS .icon-shape .label rect,#mermaid-svg-GAbAjyUSOFZhKMTS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GAbAjyUSOFZhKMTS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GAbAjyUSOFZhKMTS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GAbAjyUSOFZhKMTS :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
升级路径
Kafka 2.xZK模式
Kafka 3.4/3.5Bridge模式
运行迁移脚本metadata-migration.sh
Kafka 3.5+KRaft模式
Kafka 4.0纯KRaft
关键注意:不能从旧版 ZK 模式直接升级到 4.0,必须先通过 3.5 版本完成迁移。
迁移建议:
7. 总结:KRaft 的价值与展望
KRaft 取代 ZooKeeper,标志着 Kafka 成为真正自包含的分布式系统。这一变革的核心价值可以概括为:
#mermaid-svg-oQrgYP9jnrgjy1p7{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-oQrgYP9jnrgjy1p7 .error-icon{fill:#552222;}#mermaid-svg-oQrgYP9jnrgjy1p7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-oQrgYP9jnrgjy1p7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .marker.cross{stroke:#333333;}#mermaid-svg-oQrgYP9jnrgjy1p7 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-oQrgYP9jnrgjy1p7 p{margin:0;}#mermaid-svg-oQrgYP9jnrgjy1p7 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .cluster-label text{fill:#333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .cluster-label span{color:#333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .cluster-label span p{background-color:transparent;}#mermaid-svg-oQrgYP9jnrgjy1p7 .label text,#mermaid-svg-oQrgYP9jnrgjy1p7 span{fill:#333;color:#333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .node rect,#mermaid-svg-oQrgYP9jnrgjy1p7 .node circle,#mermaid-svg-oQrgYP9jnrgjy1p7 .node ellipse,#mermaid-svg-oQrgYP9jnrgjy1p7 .node polygon,#mermaid-svg-oQrgYP9jnrgjy1p7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-oQrgYP9jnrgjy1p7 .rough-node .label text,#mermaid-svg-oQrgYP9jnrgjy1p7 .node .label text,#mermaid-svg-oQrgYP9jnrgjy1p7 .image-shape .label,#mermaid-svg-oQrgYP9jnrgjy1p7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-oQrgYP9jnrgjy1p7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-oQrgYP9jnrgjy1p7 .rough-node .label,#mermaid-svg-oQrgYP9jnrgjy1p7 .node .label,#mermaid-svg-oQrgYP9jnrgjy1p7 .image-shape .label,#mermaid-svg-oQrgYP9jnrgjy1p7 .icon-shape .label{text-align:center;}#mermaid-svg-oQrgYP9jnrgjy1p7 .node.clickable{cursor:pointer;}#mermaid-svg-oQrgYP9jnrgjy1p7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .arrowheadPath{fill:#333333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-oQrgYP9jnrgjy1p7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oQrgYP9jnrgjy1p7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-oQrgYP9jnrgjy1p7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oQrgYP9jnrgjy1p7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-oQrgYP9jnrgjy1p7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-oQrgYP9jnrgjy1p7 .cluster text{fill:#333;}#mermaid-svg-oQrgYP9jnrgjy1p7 .cluster span{color:#333;}#mermaid-svg-oQrgYP9jnrgjy1p7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-oQrgYP9jnrgjy1p7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-oQrgYP9jnrgjy1p7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-oQrgYP9jnrgjy1p7 .icon-shape,#mermaid-svg-oQrgYP9jnrgjy1p7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-oQrgYP9jnrgjy1p7 .icon-shape p,#mermaid-svg-oQrgYP9jnrgjy1p7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-oQrgYP9jnrgjy1p7 .icon-shape .label rect,#mermaid-svg-oQrgYP9jnrgjy1p7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-oQrgYP9jnrgjy1p7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-oQrgYP9jnrgjy1p7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-oQrgYP9jnrgjy1p7 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
KRaft 核心价值
简化运维一套系统,一个安全模型
突破规模百万级分区支持
加速恢复毫秒级故障切换
声明式管理降低协调复杂度
对于新部署的 Kafka 集群,KRaft 已是默认且唯一的选择。对于仍在运行 ZK 模式的存量集群,迁移规划已迫在眉睫——Kafka 4.0 之后,ZooKeeper 支持已彻底结束。
原创不易,如果觉得有帮助,欢迎点赞收藏 💡 评论区聊聊:你的 Kafka 集群完成 KRaft 迁移了吗?
标签:Kafka KRaft ZooKeeper 架构演进 消息队列

|
🌺The End🌺点点关注,收藏不迷路🌺 |





