Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Kafka 运维

1. Kafka 集群规划

1.1 Broker 数量建议

  • 小规模:3 节点 -> 可用
  • 中规模:5–7 节点 -> 推荐
  • 大规模:9–15 节点 -> 视吞吐扩展

不要用偶数,避免选举多数派问题。

1.2 硬件规划

CPU

  • 8C 起步
  • 大集群建议 16C+

内存

  • 32G 起步
  • Kafka 主要依赖 PageCache,确保 OS 有足够内存缓存日志文件

磁盘

  • 优选 SSD
  • 单盘容量建议 1–2TB
  • 分区(Partition)尽量均匀分布在多盘(如果用 JBOD)

网络

  • 10Gbps 最低
  • 高并发环境用 25Gbps

1.3 Kafka 关键配置(生产必调)

num.network.threads=8
num.io.threads=16
log.retention.hours=168        # 1周
log.segment.bytes=1GB
log.retention.check.interval.ms=300000
default.replication.factor=3
min.insync.replicas=2
message.max.bytes=10MB
replica.fetch.max.bytes=50MB

解释:

  • min.insync.replicas=2:防止 ISR 只有 1 个时还写入
  • log.segment.bytes=1G:分片增大可减少段数
  • message.max.bytes=10MB:防止超大消息阻塞

2. Kafka 部署最佳实践(含 K8S)

2.1 Linux 部署要点

  • 使用 systemd 管理
  • 单独用户:useradd kafka
  • 存储路径:/data/kafka
  • 关闭 swap:swapoff -a
  • 调整文件句柄:ulimit -n 1000000
  • 设置 vm.max_map_count:vm.max_map_count=262144

2.2 K8S 部署要点(非常关键)

  • 每个 Broker 用 StatefulSet
  • 每个 Pod 要用固定 hostname:broker-0/broker-1/…
  • 使用 Local PVhostPath 提供本地存储
  • 设置 anti-affinity,将每个 Broker 调度到不同节点
  • readinessProbe 用来阻止流量在 Kafka 未就绪时进来
  • 使用 NodePort or LoadBalancer 来提供外部访问

3. Kafka 日志(存储)管理

日志保留规则:

Kafka 会根据时间或大小删除老数据:

log.retention.hours     # 保存时间
log.retention.bytes     # 保存总大小

存储清理策略:

  • “delete” -> 常见方式,过期后直接删除
  • “compact” -> 保存最新 key-value,用于配置型 Topic,如 offsets

4. Kafka 监控(必做)

4.1 监控系统建议

  • Prometheus + Grafana
  • JMX Exporter(Exporter 给 Prometheus 抓 Metrics)
  • Kafka Exporter(监控消费组 Lag)

4.2 必监控指标(最关键 10 个)

① 集群健康

  • Under Replicated Partitions
  • Offline Partitions Count
  • Active Controller Count
  • ISR Shrink / Expand 次数

② 写入延迟

  • RequestHandlerAvgIdlePercent
  • ProduceRequestRate / ProduceRequestLatency

③ 消费 Lag

  • Consumer Group Lag(最重要!)

④ 磁盘

  • Partition 大小
  • Disk Utilization > 85%(危险)

⑤ 网络

  • Network Processor Idle
  • Bytes In / Bytes Out

⑥ JVM

  • GC 次数
  • Heap Usage
  • Metaspace Usage

5. Kafka 扩容(Broker、Topic、Partition)

5.1 扩容 Broker(平滑操作)

步骤:

  1. 新建 Broker 配置文件(broker.id 不同)
  2. 启动新 Broker 加入集群
  3. 使用 kafka-reassign-partitions.sh 进行分区迁移

不要一次迁移太多,避免网络和磁盘压力。

5.2 扩容 Partition(副作用!)

kafka-topics.sh --alter --partitions

⚠️ 危险点:

  • 旧消息顺序会被破坏(跨分区无序)
  • Rebalance 触发

最佳时机:Topic 还未正式上线的时候规划 Partition 数。

6. Kafka 高可用运维策略

6.1 副本规划

建议:

replication.factor = 3
min.insync.replicas = 2
acks = all

确保:

  • 任意 1 台 Broker 挂掉不会丢数据
  • Leader 崩溃可快速切换

6.2 跨机房部署

两种模式:

➀ 双集群(推荐)

  • 机房 A 一套、机房 B 一套
  • 数据用 MirrorMaker 同步

优点:故障隔离 缺点:消息延迟略高

➁ 同一集群跨机房

风险:机房断网时 ISR 会大量 shrink -> 业务写失败

7. Kafka 调优(生产必调)

7.1 Producer 调优

acks=all
retries=10
linger.ms=5~20
batch.size=32KB~128KB
compression.type=lz4
max.in.flight.requests.per.connection=1

高吞吐:

  • 批量发送(batch)
  • 压缩(lz4/zstd)

7.2 Broker 调优

num.io.threads=16
num.network.threads=8
log.flush.interval.messages=0
log.flush.interval.ms=0
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400

7.3 Consumer 调优

max.poll.interval.ms=300000
session.timeout.ms=10000
enable.auto.commit=false
fetch.min.bytes=1MB
fetch.max.wait.ms=200

尽量关闭自动提交 offset。

8. Kafka 故障排查指南(企业必用)

8.1 Producer 写阻塞(常见)

可能原因:

  • ISR 缩小 -> Leader 不满足 min.insync.replicas
  • Broker 压力大 -> IO、网络、GC
  • 消息太大 -> message.max.bytes 限制

8.2 Consumer Lag 持续上涨

排查:

  • 是否发生 Rebalance
  • Consumer 线程太少
  • 消费处理逻辑太慢
  • fetch.min.bytes / fetch.max.wait 设置不合理
  • Broker Leader 压力太大(热点分区)

8.3 Under Replicated Partitions(URP)

原因:

  • Follower 同步太慢(磁盘 IO、网络)
  • ISR Shrink
  • 主机压力峰值

处理:

  • 检查 follower 日志同步状况
  • 查看网络是否有丢包
  • 排查该 Broker 磁盘/CPU

8.4 Controller 不稳定

原因:

  • Broker 负载太高
  • GC 过长
  • 网络抖动导致选举

处理:

  • 增加 Broker 资源
  • 调整 JVM 参数
  • 检查 broker 间网络

8.5 频繁 Rebalance

原因:

  • 心跳配置不合理
  • Consumer 实例频繁重启
  • Topic Partition 扩容

处理:

session.timeout.ms=10000
heartbeat.interval.ms=3000
max.poll.interval.ms=300000

避免业务长时间不 poll。

9. Kafka 安全(ACL、证书)

9.1 启用 SSL/TLS

ssl.keystore.location
ssl.truststore.location
ssl.keystore.password
ssl.enabled.protocols=TLSv1.2

9.2 启用 SASL + SCRAM 登陆认证

sasl.enabled.mechanisms=SCRAM-SHA-256
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-256

客户端配置:

sasl.mechanism=SCRAM-SHA-256
security.protocol=SASL_SSL
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required ...

📌 最终总结:Kafka 运维最关键 20 条

  1. Broker 用奇数台
  2. 磁盘用 SSD
  3. Partition 规划一定要提前
  4. offsets 存在 __consumer_offsets
  5. 监控:Lag、URP、Controller、磁盘
  6. 启用 KRaft 代替 ZooKeeper
  7. acks=all + min.insync.replicas=2
  8. 不要轻易扩容 partition
  9. Follower 落后严重会 SHRINK ISR
  10. Rebalance 会暂停消费
  11. 避免跨机房单集群
  12. Producer 批量+压缩提高吞吐
  13. Consumer 多线程提高并发
  14. 读写都走 Leader(默认)
  15. 零拷贝提升读性能
  16. PageCache 提升写性能
  17. 控制 GC,避免 Full GC
  18. 避免热点分区
  19. 避免超大单条消息(>5MB)
  20. K8S 中必须使用 StatefulSet + 本地存储