Kafka 3.9.1的KRaft模式部署_kafka kraft部署
一、核心架构与角色
- KRaft 模式特点
- 节点类型
- 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
{id}@{host}:{port}
。1@controller1:9093,2@controller2:9093,3@controller3:9093
listeners
PLAINTEXT
(Broker)和 CONTROLLER
(内部通信)。PLAINTEXT://:9092,CONTROLLER://:9093
advertised.listeners
PLAINTEXT://192.168.1.100:9092
controller.listener.names
CONTROLLER
)。CONTROLLER
log.dirs
/data/kafka/logs
inter.broker.listener.name
listeners
一致)。PLAINTEXT
单机本地KRaft模式完整示例
broker.id=0listeners=PLAINTEXT://localhost:9092,CONTROLLER://0.0.0.0:9093listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXTprocess.roles=broker,controllercontroller.quorum.voters=0@localhost:9093# controller.quorum.voting.mode=round-robincontroller.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 -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 :9092
- 查看 Controller 状态:
bin/kafka-metadata-quorum.sh describe --bootstrap-server :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 状态。