KRaft 是什么
KRaft 是 Kafka 用内置的 controller quorum 取代 ZooKeeper 的元数据管理模式(KIP-500)。集群自己维护一份日志化的元数据,controller 之间用 Raft 协议达成一致,元数据变更提交成功后才对外可见。它省掉了一套独立组件,也把元数据的扩展性做得更好。Kafka 3.3 起 KRaft 可用于生产,4.0 起不再支持 ZooKeeper,新集群直接用 KRaft 部署即可。
基本信息
| 角色配置 | process.roles=broker / controller / broker,controller(单机合设) |
|---|---|
| 元数据 | 日志化的元数据 quorum,变更提交后生效 |
| 版本演进 | 3.3 起生产可用;4.0 起不再支持 ZooKeeper |
| 节点数量 | controller quorum 建议 3 或 5 个节点 |
| 存储格式 | 启动前用 kafka-storage.sh 格式化,需要集群 ID |
| 配置文件 | 发行包内 config/kraft/ 下的示例配置,版本间路径可能有调整 |
格式化存储并启动(KRaft 单节点示例)
格式化存储并启动(KRaft 单节点示例)
KAFKA_CLUSTER_ID=$(kafka-storage.sh random-uuid)
kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c config/kraft/server.properties
kafka-server-start.sh config/kraft/server.properties
# 确认元数据 quorum 状态
kafka-metadata-quorum.sh --bootstrap-server localhost:9092 describe --status关键配置项(server.properties)
关键配置项(server.properties)
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@10.0.0.1:9093,2@10.0.0.2:9093,3@10.0.0.3:9093
listeners=PLAINTEXT://:9092,CONTROLLER://:9093
log.dirs=/data/kafka-logs典型使用场景
- 新建集群:没有历史包袱时直接按 KRaft 部署,少维护一套组件
- 元数据规模大:分区与主题数量多时,KRaft 的元数据扩展性优于 ZooKeeper 方案
- 快速起环境:单节点合设角色即可跑起测试集群,适合本地验证
- 迁移规划:已有 ZooKeeper 集群按官方流程迁移,而不是直接改配置
- 版本升级评估:目标版本已不再支持 ZooKeeper 时,需要先完成迁移
- 运维观测:用元数据 quorum 的 status 命令确认谁是当前 leader 与各节点进度
两种模式对比
| 维度 | ZooKeeper 模式 | KRaft 模式 |
|---|---|---|
| 元数据组件 | 外部 ZooKeeper 集群 | 内置 controller quorum |
| 元数据存储 | ZooKeeper 节点数据 | 日志化元数据 + 快照 |
| 组件数量 | Kafka 与 ZooKeeper 两套 | 一套 |
| 元数据扩展性 | 受 ZooKeeper 限制 | 随分区规模更好扩展 |
| 版本支持 | 旧版本可用,4.0 起移除 | 3.3+ 生产可用 |
已有 ZooKeeper 集群迁移到 KRaft 需要按官方迁移流程操作,不能直接把配置改成 KRaft 启动。
controller 节点数量决定容错能力:3 个节点可容忍 1 个故障,5 个可容忍 2 个;单节点合设只适合开发测试环境。