Kafka 3.9.1的KRaft模式部署
一、核心架构与角色
- KRaft 模式特点
- 去中心化:移除 ZooKeeper,元数据由 Kafka 集群内部管理。
- Raft 协议:通过 Raft 实现元数据一致性,控制器(Controller)节点组成仲裁(Quorum)处理元数据变更。
- 角色分离:Broker 负责消息存储,Controller 负责元数据管理,两者可独立部署或合并运行(Combined 模式)。
- 节点类型
- Broker:存储消息数据,处理生产/消费请求。
- Controller:管理元数据(如 Topic、分区、副本状态),参与 Raft 选举。
- Combined 模式:单节点同时运行 Broker 和 Controller(适用于开发环境,生产环境不推荐)。
二、关键配置参数
以下配置需在 server.properties
文件中设置:
参数 | 说明 | 示例值 |
---|---|---|
process.roles | 节点角色,可选 broker 、controller 或两者组合(如 broker,controller )。 | broker,controller (生产环境推荐分离部署) |
node.id | 节点唯一标识,需在集群内唯一。 | 1 (Controller 节点)、2 (Broker 节点) |
controller.quorum.voters | Controller 仲裁列表,格式为 {id}@{host}:{port} 。 | 1@controller1:9093,2@controller2:9093,3@controller3:9093 |
listeners | 监听地址,需包含 PLAINTEXT (Broker)和 CONTROLLER (内部通信)。 | PLAINTEXT://:9092,CONTROLLER://:9093 |
advertised.listeners | 对外暴露的 Broker 地址(客户端连接地址)。 | PLAINTEXT://192.168.1.100:9092 |
controller.listener.names | Controller 监听器名称(固定为 CONTROLLER )。 | CONTROLLER |
log.dirs | 数据存储目录(建议独立磁盘)。 | /data/kafka/logs |
inter.broker.listener.name | Broker 间通信使用的监听器名称(需与 listeners 一致)。 | PLAINTEXT |
单机本地KRaft模式完整示例
broker.id=0
listeners=PLAINTEXT://localhost:9092,CONTROLLER://0.0.0.0:9093
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXTprocess.roles=broker,controller
controller.quorum.voters=0@localhost:9093
# controller.quorum.voting.mode=round-robin
controller.listener.names=CONTROLLERadvertised.listeners=PLAINTEXT://localhost:9092
三、配置步骤
生成集群 ID
使用kafka-storage.sh
工具生成唯一集群 ID:bin/kafka-storage.sh random-uuid
输出示例:
4hU1sxPUQG-4qqqgZQxFZA
(需记录并用于后续格式化)。格式化存储目录
在所有节点上执行格式化,指定集群 ID 和配置文件:bin/kafka-storage.sh format -t <CLUSTER_ID> -c config/kraft/server.properties
启动服务
- 单节点(Combined 模式):
bin/kafka-server-start.sh config/kraft/server.properties
- 多节点集群:
按角色分别启动 Controller 和 Broker 服务(建议使用systemd
管理进程)。
- 单节点(Combined 模式):
验证集群状态
- 检查 Broker 列表:
bin/kafka-broker-api-versions.sh --bootstrap-server <BROKER_IP>:9092
- 查看 Controller 状态:
bin/kafka-metadata-quorum.sh describe --bootstrap-server <BROKER_IP>:9092
- 检查 Broker 列表:
四、生产环境最佳实践
- Controller 节点配置
- 数量:建议 3 或 5 个节点(奇数),容忍
(n-1)/2
个节点故障。 - 资源隔离:与 Broker 分离部署,避免资源竞争。
- 网络优化:使用低延迟、高带宽网络(如万兆网卡)。
- 数量:建议 3 或 5 个节点(奇数),容忍
- Broker 节点配置
- 副本数:
default.replication.factor=3
(兼顾可用性与存储成本)。 - 消息压缩:启用
compression.type=lz4
或zstd
减少网络开销。 - JVM 调优:设置
KAFKA_HEAP_OPTS="-Xmx8G -Xms8G"
,启用 G1 垃圾回收器。
- 副本数:
- 监控与运维
- 关键指标:Controller 选举耗时、元数据复制延迟、Broker 磁盘 I/O。
- 日志管理:定期清理旧日志(
log.retention.hours=168
)。
五、常见问题解决
No security protocol defined for listener CONTROLLER
- 原因:未配置
CONTROLLER
监听器的安全协议。 - 解决:在
server.properties
中添加:listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- 原因:未配置
- 客户端连接失败
- 检查项:
advertised.listeners
是否为客户端可访问的 IP 或域名。- 防火墙是否开放 9092(Broker)和 9093(Controller)端口。
- 检查项:
- 元数据不一致
- 场景:Controller 选举失败或网络分区。
- 处理:检查
kafka-metadata-quorum.sh
输出,确认 Leader 和 Voters 状态。