易君召
发布于 2026-09-17 / 作者:易君召 / 4 阅读
0

Kafka 集群部署方案

一、方案概述

1.1 目标

搭建一套高可用、可扩展、支持业务消息生产消费的 Apache Kafka 集群,用于实时数据采集、消息队列、流计算(对接 Flink/Spark)、日志上报等场景;配套 ZooKeeper(Kafka 2.8+ 支持 KRaft 无 ZK 模式,方案同时提供两种选型)。

说明:Kraft 模式推荐新版本(3.3+),消除 ZK 单点瓶颈,运维更简单;传统 ZK 模式适合存量业务迁移。

1.2 核心能力指标

  • 可用性:集群可用性 ≥99.95%,单 Broker 宕机不影响读写

  • 消息可靠性:支持至少一次、精确一次语义,副本自动同步

  • 扩容:支持横向新增 Broker 节点,分区自动迁移

  • 运维:监控、告警、日志收集、权限控制、备份恢复

1.3 环境选型建议

表格

项目

推荐配置

备注

操作系统

CentOS Stream / openEuler / Debian 11

信创场景优先 openEuler

Kafka 版本

3.7.x

稳定,KRaft 完善,修复大量 bug

JDK

JDK17

Kafka3.x 推荐,性能优于 JDK8

服务器

物理机 / 虚拟机 / 容器

容器化推荐 Docker,生产不建议 K8s LocalPV 做消息盘,优先本地 SSD

磁盘

SSD,独立数据盘

日志消息 IO 密集,禁止系统盘存 kafka 数据

网络

千兆 / 万兆内网,同机房

跨机房延迟高,不建议跨机房部署

硬件参考(单 Broker):

  • 8 核 16G,SSD 1TB;中小业务(日消息量≤10 亿)

  • 16 核 32G,SSD 2TB;中大型业务(日消息 10~50 亿)

二、集群拓扑设计

方案 A:KRaft 模式(推荐新集群,无 ZooKeeper)

KRaft 分为 Controller 节点Broker 节点,Controller 负责元数据管理。

  • Controller:3 台(奇数,保证选主,Controller 不承载业务消息)

  • Broker:3 台起步,生产环境建议 ≥3,根据业务扩容

最小集群:3 节点,每节点同时充当 Controller+Broker(小规模);大规模集群 Controller 独立 3 台,Broker 单独多台。

方案 B:传统 ZooKeeper 模式(存量兼容)

  • ZK 集群:3 节点(奇数,ZK 不建议 5 节点以上)

  • Kafka Broker:≥3 节点

ZK 只保存元数据,不存储消息,ZK 压力小,但 ZK 本身是运维负担。

下面方案默认采用 KRaft 3 节点混合部署(Controller+Broker),最小生产集群。

三、网络与端口规划

组件

端口

说明

Kafka Broker

9092

客户端访问端口

Kafka Controller

9093

控制器内部通信端口

JMX 监控

9999

指标采集,内网开放

网络规划要点

  1. 内网通信优先,生产环境不要公网暴露 9092;如需外部访问配置advertised.listeners

  2. 防火墙放行节点之间 9092、9093 端口;

  3. 主机名配置:所有节点 /etc/hosts 配置互相解析,避免 DNS 抖动;

  4. 关闭防火墙 / SELinux,或做白名单。

四、系统层优化(非常关键,Kafka 对系统参数敏感)

4.1 文件句柄 & 进程数

# /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
* soft nproc  204800
* hard nproc  204800

4.2 sysctl 内核参数

# /etc/sysctl.conf
# 网络调优
net.core.rmem_max=26214400
net.core.wmem_max=26214400
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1

# 内存调优
vm.swappiness=1                # 关闭swap,Kafka禁用swap
vm.dirty_background_ratio=5
vm.dirty_ratio=10
vm.max_map_count=262144

执行生效:sysctl -p

4.3 磁盘挂载优化

数据盘挂载选项:noatime,关闭访问时间记录

# /etc/fstab
/dev/sdb /data/kafka ext4 defaults,noatime 0 0

禁止使用atime,会大量损耗 SSD 寿命;磁盘单独分区,日志和数据分开。

五、Kafka 安装与配置(KRaft 3 节点示例)

节点主机名:kf-01、kf-02、kf-03 节点 IP:192.168.1.101、192.168.1.102、192.168.1.103 数据目录:/data/kafka

5.1 解压安装

# 下载 kafka_2.13-3.7.0.tgz
tar -zxvf kafka_2.13-3.7.0.tgz -C /opt/
cd /opt/kafka_2.13-3.7.0
mkdir -p /data/kafka

5.2 生成集群唯一 ID(只执行一次)

bin/kafka-storage.sh random-uuid
# 输出示例:abcdefghijklmnopqrstuvwxyz

5.3 节点配置文件 config/kraft/server.properties

kf-01

# 节点ID,每个节点唯一
node.id=1
# 控制器节点列表,全部3个controller
controller.quorum.voters=1@192.168.1.101:9093,2@192.168.1.102:9093,3@192.168.1.103:9093
# 监听地址
listeners=PLAINTEXT://192.168.1.101:9092,CONTROLLER://192.168.1.101:9093
advertised.listeners=PLAINTEXT://192.168.1.101:9092
# 集群uuid,上面生成的
cluster.id=abcdefghijklmnopqrstuvwxyz
# 角色:混合部署,controller+broker
process.roles=broker,controller
# 数据目录
log.dirs=/data/kafka
# 分区副本默认配置
default.replication.factor=3
min.insync.replicas=2
# 消息保留时长
log.retention.hours=72
# 单日志段大小
log.segment.bytes=1073741824
# 开启自动创建topic(生产建议关闭 auto.create.topics.enable=false)
auto.create.topics.enable=false
# JVM参数在kafka-server-start.sh配置

kf-02 node.id=2,IP 改为 102;kf-03 node.id=3,IP 改为 103,其余一致。

5.4 JVM 参数 bin/kafka-server-start.sh

export KAFKA_HEAP_OPTS="-Xms16G -Xmx16G -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

内存建议:不超过机器物理内存 50%,留内存给操作系统 PageCache。Kafka 大量依赖 OS 页缓存。

5.5 格式化存储(KRaft 必须执行,只做一次)

bin/kafka-storage.sh format -t abcdefghijklmnopqrstuvwxyz -c config/kraft/server.properties

5.6 启动 & 自启(systemd)

# /etc/systemd/system/kafka.service
[Unit]
Description=Apache Kafka Server
After=network.target

[Service]
Type=simple
User=kafka
WorkingDirectory=/opt/kafka_2.13-3.7.0
ExecStart=/opt/kafka_2.13-3.7.0/bin/kafka-server-start.sh /opt/kafka_2.13-3.7.0/config/kraft/server.properties
ExecStop=/opt/kafka_2.13-3.7.0/bin/kafka-server-stop.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable kafka
systemctl start kafka

5.7 集群验证

# 创建topic,3副本,6分区
bin/kafka-topics.sh --create --topic demo_topic --bootstrap-server 192.168.1.101:9092,192.168.1.102:9092,192.168.1.103:9092 --partitions 6 --replication-factor 3

# 查看topic
bin/kafka-topics.sh --describe --topic demo_topic --bootstrap-server 192.168.1.101:9092

六、关键业务参数设计

6.1 Topic 分区与副本

  1. 副本数 replication.factor:生产固定 3,至少 2;副本不能大于 Broker 数量

  2. 最小同步副本 min.insync.replicas:副本 3 时设置为 2;生产者acks=all,保证写入至少 2 个副本成功才返回

  3. 分区数:分区决定并行度;分区数建议:Broker 数 × (2~4)。分区不要过大(上万分区会增加 Controller 元数据压力)

消费并行度 = 消费者组内消费者数量,最多等于分区数量。

6.2 消息可靠性参数

生产者:

acks=all
retries=10
enable.idempotence=true  # 幂等,防止重复消息

消费者:

enable.auto.commit=false # 关闭自动提交,业务处理完成手动提交offset
isolation.level=read_committed

6.3 消息保留策略

  • 按时间:log.retention.hours

  • 按大小:log.retention.bytes

满足任一条件就清理旧消息;重要业务可以开启消息压缩 compression.type=lz4,降低 IO。

七、监控体系

7.1 指标采集

Kafka 暴露 JMX 指标,接入 Prometheus + Grafana,使用 kafka_exporter。 重点监控项:

  1. Broker 状态、副本是否同步 UnderReplicatedPartitions(核心告警指标,出现代表副本异常)

  2. Topic 消息流入流出速率、分区 leader 分布

  3. 生产 / 消费延迟(consumer lag,最核心业务指标)

  4. 磁盘使用率、磁盘 IO、网络带宽

  5. JVM GC、内存、文件句柄数

7.2 告警规则

  • UnderReplicatedPartitions >0 紧急告警

  • Consumer Lag 持续上涨

  • 磁盘使用率 >85%

  • Broker 进程宕机

  • Controller 节点异常

八、权限与安全(生产必选)

  1. SASL 认证:PLAIN / SCRAM,客户端连接必须账号密码,禁止匿名访问

  2. ACL 权限:Topic 维度,控制用户读写权限

  3. 传输加密:SSL/TLS 加密通信

  4. 网络:内网隔离,只允许业务服务器访问 Kafka 端口

九、扩容方案

  1. 新增 Broker 节点:部署同版本 Kafka,加入 KRaft quorum(扩容 Broker 不需要新增 Controller)

  2. 分区迁移:使用kafka-reassign-partitions.sh,把分区均衡迁移到新节点,负载均衡

  3. 扩容注意:迁移分区会占用磁盘与网络带宽,业务低峰操作

十、备份与容灾

  1. Offset 备份:定期导出消费者组 offset,故障可恢复

  2. 消息备份:重要 Topic 可镜像到备用集群(MirrorMaker2 跨集群同步)

  3. 故障演练:单 Broker 停机,验证业务读写不受影响

十一、灾备方案

  • 同城双集群:主集群写入,MirrorMaker2 同步到备集群;故障时切换业务到备用集群

  • 不推荐跨机房单集群:网络延迟高,副本同步不稳定

十二、容器化部署(可选)

Docker 部署适合测试环境;生产容器部署注意:

  1. 使用宿主机本地 SSD 挂载,不要使用容器存储;

  2. KRaft 集群要固定 node.id,不要动态销毁重建;

  3. K8s 部署使用 StatefulSet,稳定网络标识。

十三、风险点与避坑清单

✅ 不要用机械盘,磁盘 IO 是 Kafka 最大瓶颈 ✅ 一定要关闭 swap ✅ 副本数不能大于 Broker 数量 ✅ 不要单节点部署生产集群 ✅ 分区不要一次性创建几万,压垮 Controller ✅ advertised.listeners 配置错误会导致客户端无法连接,高频踩坑点 ✅ 业务关闭自动创建 topic,统一运维创建 topic

十四、交付物清单

  1. 集群拓扑图(Mermaid)

  2. 主机资源清单

  3. 完整配置文件模板

  4. 系统优化脚本

  5. 部署步骤手册

  6. 监控面板 Grafana Json

  7. 运维手册(启停、扩容、故障排查)


本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。

原文链接 https://www.yijunzhao.cn/archives/kafka-cluster-deployment-guide

欢迎访问 小易撩挨踢

https://www.yijunzhao.cn/