3. Kafka集群部署:单节点与多节点部署、Zookeeper/KRaft模式对比、关键配置参数
Kafka 集群部署是生产环境高吞吐与高可用的基础。本章从单节点快速验证到多节点生产集群,对比 Zookeeper 与 KRaft 两种元数据管理模式,并梳理核心配置参数,帮助你在 Go 项目基础设施层做出正确选型。
3.1 单节点部署:快速验证与开发环境
单节点部署适用于本地开发、功能验证与单元测试。所有组件(Broker、Zookeeper/KRaft Controller)运行在同一进程或同一主机上。
适用场景: 本地调试、CI/CD 集成测试、学习环境。
限制: 无数据冗余、单点故障、不可用于生产。
限制: 无数据冗余、单点故障、不可用于生产。
3.1.1 单节点配置示例(Zookeeper 模式)
# config/server.properties
broker.id=0
listeners=PLAINTEXT://localhost:9092
log.dirs=/tmp/kafka-logs
num.partitions=3
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
zookeeper.connect=localhost:2181
3.1.2 单节点配置示例(KRaft 模式)
# config/kraft/server.properties
process.roles=broker,controller
node.id=1
controller.quorum.voters=1@localhost:9093
listeners=PLAINTEXT://localhost:9092,CONTROLLER://localhost:9093
advertised.listeners=PLAINTEXT://localhost:9092
log.dirs=/tmp/kraft-combined-logs
开发建议: 单节点 KRaft 模式无需额外启动 Zookeeper,启动命令更简洁:
./bin/kafka-server-start.sh config/kraft/server.properties。
3.2 多节点部署:生产集群架构
生产环境至少部署 3 个 Broker 节点,配合 3 或 5 个 Controller 节点(KRaft)或 Zookeeper 集群,实现数据冗余、故障转移与负载均衡。
3.2.1 多节点部署拓扑
下图展示了一个 3 Broker + 3 Controller(KRaft)的生产集群架构,Controller 负责元数据管理,Broker 负责数据读写。
3.3 Zookeeper 模式 vs KRaft 模式对比
Kafka 从 2.8 版本开始引入 KRaft 模式,逐步替代 Zookeeper 的元数据管理职责。下表从架构、部署、性能与运维四个维度进行对比。
| 对比维度 | Zookeeper 模式 | KRaft 模式 |
|---|---|---|
| 元数据存储 | Zookeeper 集群独立存储 | Kafka Controller 内置 Raft 日志 |
| 组件数量 | Kafka Broker + ZK 集群(至少 3 节点) | Kafka Broker + Controller(可合并部署) |
| 部署复杂度 | 高,需独立运维 ZK 集群 | 低,统一运维 Kafka 进程 |
| Controller 选举 | 依赖 ZK 临时节点与 Watcher | 基于 Raft 协议,自选举 |
| 元数据变更延迟 | 较高(ZK 写入 + 通知) | 较低(Raft 日志复制) |
| 集群规模扩展 | ZK 写入压力随 Broker 数增长 | Controller 可水平扩展 |
| 生产就绪度 | 成熟,广泛使用 | 3.3+ 版本生产推荐 |
迁移注意: 从 ZK 模式迁移到 KRaft 模式需要重新格式化日志目录,不支持原地升级。建议在新集群直接使用 KRaft 模式,或通过 MirrorMaker 跨集群迁移。
3.4 关键配置参数
以下参数直接影响集群性能、可用性与数据安全,生产环境必须根据业务场景调优。
3.4.1 Broker 核心参数
| 参数名 | 默认值 | 说明 | 生产建议 |
|---|---|---|---|
broker.id |
-1 | Broker 唯一标识 | 手动指定,集群内唯一 |
listeners |
PLAINTEXT://:9092 | 监听地址与协议 | 生产使用 SASL_SSL |
log.dirs |
/tmp/kafka-logs | 数据日志存储目录 | 多磁盘用逗号分隔,提升吞吐 |
num.partitions |
1 | Topic 默认分区数 | 根据吞吐量设为 3~12 |
default.replication.factor |
1 | Topic 默认副本数 | 生产设为 3 |
min.insync.replicas |
1 | 最小 ISR 副本数 | 生产设为 2,配合 acks=all |
log.retention.hours |
168 | 日志保留时间(小时) | 根据业务需求调整 |
log.segment.bytes |
1073741824 | 单个日志段大小(1GB) | 可调至 512MB 减少滚动频率 |
3.4.2 KRaft 模式特有参数
| 参数名 | 默认值 | 说明 | 生产建议 |
|---|---|---|---|
process.roles |
broker | 进程角色:broker/controller/两者 | 生产分离部署,controller 专用节点 |
controller.quorum.voters |
— | Controller 投票节点列表 | 格式:id@host:port,逗号分隔 |
controller.listener.names |
CONTROLLER | Controller 间通信监听器名 | 与 listeners 中的名称对应 |
node.id |
— | KRaft 节点唯一 ID | 集群内唯一,与 broker.id 可不同 |
3.4.3 性能与网络参数
| 参数名 | 默认值 | 说明 | 调优方向 |
|---|---|---|---|
num.network.threads |
3 | 网络处理线程数 | CPU 核数 × 2 |
num.io.threads |
8 | 磁盘 I/O 处理线程数 | CPU 核数 × 4 |
socket.send.buffer.bytes |
102400 | Socket 发送缓冲区(100KB) | 大消息场景调至 1MB |
socket.receive.buffer.bytes |
102400 | Socket 接收缓冲区(100KB) | 大消息场景调至 1MB |
queued.max.requests |
500 | 请求队列最大长度 | 高并发场景可调至 1000 |
3.5 部署模式选择决策流程
根据团队经验与集群规模,参考以下决策树选择部署模式。
3.6 部署验证与常用命令
部署完成后,通过以下命令验证集群状态。
3.6.1 验证集群节点
# 查看所有 Broker 节点
./bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092
# 查看 Controller 信息(KRaft 模式)
./bin/kafka-metadata-quorum.sh --bootstrap-server localhost:9092 describe --status
# 查看 Topic 列表
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --list
3.6.2 生产与消费测试
# 创建测试 Topic
./bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test-cluster --partitions 3 --replication-factor 3
# 生产消息
./bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-cluster
# 消费消息
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-cluster --from-beginning
快速检查: 使用
kafka-dump-log.sh 查看日志段文件内容,验证数据写入是否正确:./bin/kafka-dump-log.sh --files /tmp/kafka-logs/test-cluster-0/00000000000000000000.log。