Kafka 运维
- 小规模:3 节点 -> 可用
- 中规模:5–7 节点 -> 推荐
- 大规模:9–15 节点 -> 视吞吐扩展
不要用偶数,避免选举多数派问题。
CPU
- 8C 起步
- 大集群建议 16C+
内存
- 32G 起步
- Kafka 主要依赖 PageCache,确保 OS 有足够内存缓存日志文件
磁盘
- 优选 SSD
- 单盘容量建议 1–2TB
- 分区(Partition)尽量均匀分布在多盘(如果用 JBOD)
网络
- 10Gbps 最低
- 高并发环境用 25Gbps
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:防止超大消息阻塞
- 使用 systemd 管理
- 单独用户:useradd kafka
- 存储路径:/data/kafka
- 关闭 swap:swapoff -a
- 调整文件句柄:ulimit -n 1000000
- 设置 vm.max_map_count:vm.max_map_count=262144
- 每个 Broker 用 StatefulSet
- 每个 Pod 要用固定 hostname:broker-0/broker-1/…
- 使用 Local PV 或 hostPath 提供本地存储
- 设置 anti-affinity,将每个 Broker 调度到不同节点
- readinessProbe 用来阻止流量在 Kafka 未就绪时进来
- 使用 NodePort or LoadBalancer 来提供外部访问
日志保留规则:
Kafka 会根据时间或大小删除老数据:
log.retention.hours # 保存时间
log.retention.bytes # 保存总大小
存储清理策略:
- “delete” -> 常见方式,过期后直接删除
- “compact” -> 保存最新 key-value,用于配置型 Topic,如 offsets
- Prometheus + Grafana
- JMX Exporter(Exporter 给 Prometheus 抓 Metrics)
- Kafka Exporter(监控消费组 Lag)
- Under Replicated Partitions
- Offline Partitions Count
- Active Controller Count
- ISR Shrink / Expand 次数
- RequestHandlerAvgIdlePercent
- ProduceRequestRate / ProduceRequestLatency
- Consumer Group Lag(最重要!)
- Partition 大小
- Disk Utilization > 85%(危险)
- Network Processor Idle
- Bytes In / Bytes Out
- GC 次数
- Heap Usage
- Metaspace Usage
步骤:
- 新建 Broker 配置文件(broker.id 不同)
- 启动新 Broker 加入集群
- 使用 kafka-reassign-partitions.sh 进行分区迁移
不要一次迁移太多,避免网络和磁盘压力。
kafka-topics.sh --alter --partitions
⚠️ 危险点:
- 旧消息顺序会被破坏(跨分区无序)
- Rebalance 触发
最佳时机:Topic 还未正式上线的时候规划 Partition 数。
建议:
replication.factor = 3
min.insync.replicas = 2
acks = all
确保:
- 任意 1 台 Broker 挂掉不会丢数据
- Leader 崩溃可快速切换
两种模式:
- 机房 A 一套、机房 B 一套
- 数据用 MirrorMaker 同步
优点:故障隔离 缺点:消息延迟略高
风险:机房断网时 ISR 会大量 shrink -> 业务写失败
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)
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
max.poll.interval.ms=300000
session.timeout.ms=10000
enable.auto.commit=false
fetch.min.bytes=1MB
fetch.max.wait.ms=200
尽量关闭自动提交 offset。
可能原因:
- ISR 缩小 -> Leader 不满足 min.insync.replicas
- Broker 压力大 -> IO、网络、GC
- 消息太大 -> message.max.bytes 限制
排查:
- 是否发生 Rebalance
- Consumer 线程太少
- 消费处理逻辑太慢
- fetch.min.bytes / fetch.max.wait 设置不合理
- Broker Leader 压力太大(热点分区)
原因:
- Follower 同步太慢(磁盘 IO、网络)
- ISR Shrink
- 主机压力峰值
处理:
- 检查 follower 日志同步状况
- 查看网络是否有丢包
- 排查该 Broker 磁盘/CPU
原因:
- Broker 负载太高
- GC 过长
- 网络抖动导致选举
处理:
- 增加 Broker 资源
- 调整 JVM 参数
- 检查 broker 间网络
原因:
- 心跳配置不合理
- Consumer 实例频繁重启
- Topic Partition 扩容
处理:
session.timeout.ms=10000
heartbeat.interval.ms=3000
max.poll.interval.ms=300000
避免业务长时间不 poll。
ssl.keystore.location
ssl.truststore.location
ssl.keystore.password
ssl.enabled.protocols=TLSv1.2
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 ...
- Broker 用奇数台
- 磁盘用 SSD
- Partition 规划一定要提前
- offsets 存在 __consumer_offsets
- 监控:Lag、URP、Controller、磁盘
- 启用 KRaft 代替 ZooKeeper
- acks=all + min.insync.replicas=2
- 不要轻易扩容 partition
- Follower 落后严重会 SHRINK ISR
- Rebalance 会暂停消费
- 避免跨机房单集群
- Producer 批量+压缩提高吞吐
- Consumer 多线程提高并发
- 读写都走 Leader(默认)
- 零拷贝提升读性能
- PageCache 提升写性能
- 控制 GC,避免 Full GC
- 避免热点分区
- 避免超大单条消息(>5MB)
- K8S 中必须使用 StatefulSet + 本地存储