Kafka 常见故障及解决方案
1. Broker 无法启动
- 原因:
- 端口被占用(默认 9092)或配置错误(如
server.properties
路径不可写)。 - ZooKeeper 连接失败(地址配置错误或 ZooKeeper 服务未启动)。
- 端口被占用(默认 9092)或配置错误(如
- 解决:
- 检查端口占用:使用
netstat -tuln | grep 9092
或lsof -i :9092
终止占用进程或修改监听端口。 - 验证配置文件
server.properties
,确保log.dirs
和listeners
路径有效。 - 检查 ZooKeeper 状态:确认
zookeeper.connect
地址正确且服务正常。
- 检查端口占用:使用
2. 客户端无法连接 Broker
- 原因:
- 网络隔离(跨网段未配置
advertised.listeners
)或防火墙限制。 - 客户端配置的 Broker IP 或端口错误。
- 网络隔离(跨网段未配置
- 解决:
- 配置
advertised.listeners
为客户端可访问的 IP 或域名(如外网 IP)。 - 开放防火墙端口(默认 9092)或检查网络链路。
- 配置
3. 消息延迟高或丢失
- 原因:
- 生产者未开启确认机制(如
acks=0
),导致消息未持久化。 - 消费者处理速度慢或未及时提交 Offset,触发重复消费。
- 生产者未开启确认机制(如
- 解决:
- 生产者设置
acks=all
确保消息写入所有副本。 - 优化消费者逻辑(如异步处理),调整
max.poll.interval.ms
避免超时。
- 生产者设置
4. 主题数据堆积(消息积压)
- 原因:
- 生产者写入速率远超消费者处理能力。
- 分区数不足导致单分区消费瓶颈。
- 解决:
- 增加分区数(
kafka-topics --alter
)或提升消费者并发度。 - 限流生产者或启用压缩(
compression.type=snappy
)减少数据体积。
- 增加分区数(
5. Leader 分区不可用
- 原因:
- Leader 分区所在 Broker 宕机或网络隔离。
- ISR(In-Sync Replicas)收缩导致副本不足。
- 解决:
- 检查 Broker 存活状态并重启故障节点。
- 调整
min.insync.replicas
确保副本数充足,避免 ISR 频繁收缩。
6. 频繁 Full GC 或高 CPU 占用
- 原因:
- JVM 堆内存不足或 GC 策略不合理。
- 大量消息堆积触发频繁压缩(Compaction)或索引重建。
- 解决:
- 调整 JVM 参数(如
-Xmx
和-XX:+UseG1GC
)优化垃圾回收。 - 监控堆外内存使用(如
kafka.log.LogCleaner
),避免内存泄漏。
- 调整 JVM 参数(如
7. 消费者组频繁重平衡(Rebalance)
- 原因:
- 消费者心跳超时(
session.timeout.ms
过短)或处理逻辑阻塞。 - 消费者实例异常退出(如 OOM 或崩溃)。
- 消费者心跳超时(
- 解决:
- 增大
session.timeout.ms
和max.poll.interval.ms
避免误判。 - 监控消费者健康状态,优化代码逻辑(如减少单次 Poll 数据量)。
- 增大
8. 跨机房同步问题
- 原因:
- 网络延迟高或带宽不足导致同步延迟。
- 未配置 MirrorMaker 或跨集群路由规则。
- 解决:
- 使用专线或优化网络带宽。
- 部署 MirrorMaker 2.0 并配置
replication.factor
提升可靠性。
运维建议
- 监控工具:
- 使用 Kafka Manager 或 Prometheus + Grafana 监控集群健康状态。
- 日志分析:
- 关注
kafkaController.log
和server.log
,定位 Leader 选举或副本同步问题。
- 关注
- 参数调优示例:
通过上述措施可快速定位并解决 Kafka 常见故障,保障系统稳定性。
本文来自博客园,作者:业余砖家,转载请注明原文链接:https://www.cnblogs.com/yeyuzhuanjia/p/18781175