10.7.4 常见故障类型与诊断流程
常见故障类型包括:Broker不可用、Controller切换异常、分区离线/副本不足(ISR缩小)、消费者积压、生产者超时或消息丢失、磁盘满/IO异常、网络抖动引发频繁再平衡、ZK/KRaft元数据异常、SSL/SASL认证失败等。建议遵循“现象确认→范围界定→指标与日志联动→根因定位→临时止血→永久修复→复盘归档”的闭环流程。
原理草图(诊断路径与数据源):
常见故障快速诊断清单与命令示例:
1)Broker不可用(进程/端口/资源)
# 1. 进程与端口
ps -ef | grep -i kafka
ss -lntp | grep 9092
# 2. 系统资源
ulimit -n
df -h /data/kafka
iostat -x 1 3
# 3. 日志(按时间窗口)
tail -n 200 /data/kafka/logs/server.log
tail -n 200 /data/kafka/logs/controller.log
预期:能看到 Broker 监听端口、磁盘未满、日志无 OOM/磁盘只读报错。
2)ISR缩小/副本不足(复制滞后/IO瓶颈)
# 查看分区与ISR
/opt/kafka/bin/kafka-topics.sh --bootstrap-server 127.0.0.1:9092 \
--describe --topic user-events
# 查看Broker磁盘与日志目录
/opt/kafka/bin/kafka-log-dirs.sh --bootstrap-server 127.0.0.1:9092 --describe
排查点:replica.fetcher.lag 相关日志、磁盘 IO await 高、网络丢包。
3)消费者积压(消费慢/重平衡频繁)
# 查看消费组lag
/opt/kafka/bin/kafka-consumer-groups.sh --bootstrap-server 127.0.0.1:9092 \
--describe --group order-consumer
# 查看消费组重平衡次数(JMX/Prometheus)
# 关注 kafka.consumer:type=consumer-coordinator-metrics,rebalance-total
判定:如果 lag 持续增长且分区数 < 消费实例数,需扩分区或提升并发。
4)生产者超时/消息丢失(网络/配置)
# 客户端发送测试
/opt/kafka/bin/kafka-console-producer.sh --bootstrap-server 127.0.0.1:9092 \
--topic user-events <<EOF
test-1
test-2
EOF
# 查看客户端日志中的 timeout、NotEnoughReplicas
grep -iE "timeout|replica" /var/log/app/producer.log | tail -n 50
排查点:acks、retries、linger.ms、batch.size、max.request.size 与消息体大小。
5)磁盘满/IO异常
df -h /data/kafka
iostat -x 1 5
ls -l /data/kafka/logs | head -n 5
应急:扩容磁盘、迁移日志目录、清理旧主题或压缩策略。
6)元数据异常(ZK/KRaft)
# ZooKeeper模式:检查ZK健康
echo ruok | nc 127.0.0.1 2181
# KRaft模式:查看controller日志
tail -n 200 /data/kafka/logs/controller.log
异常表现:频繁Controller切换、会话超时、分区不可用。
典型止血策略(含示例命令):
- 降低影响面:限流生产、暂停异常消费组
# 临时提高生产端linger.ms以减压(客户端配置示例)
producer.properties:
acks=1
linger.ms=50
batch.size=65536
# 暂停消费组(应用层操作示例)
curl -X POST http://consumer-service/pause?group=order-consumer
- 快速恢复:重启故障Broker、触发分区重分配
# Broker重启(systemd)
systemctl restart kafka
# 生成重分配计划
/opt/kafka/bin/kafka-reassign-partitions.sh --bootstrap-server 127.0.0.1:9092 \
--generate --topics-to-move-json-file /tmp/topics.json \
--broker-list "1,2,3" > /tmp/reassign.json
# 执行重分配
/opt/kafka/bin/kafka-reassign-partitions.sh --bootstrap-server 127.0.0.1:9092 \
--execute --reassignment-json-file /tmp/reassign.json
- 永久修复:扩容、优化副本与分区、提升磁盘/网络、调优JVM
# JVM参数示例(/opt/kafka/config/kafka-server-start.sh or server.properties)
export KAFKA_HEAP_OPTS="-Xms4g -Xmx4g"
export KAFKA_JVM_PERFORMANCE_OPTS="-XX:+UseG1GC -XX:MaxGCPauseMillis=200"
安装与诊断工具准备(示例):
# 安装Kafka客户端工具(基于二进制包)
tar -xzf kafka_2.13-3.5.1.tgz -C /opt
ln -s /opt/kafka_2.13-3.5.1 /opt/kafka
# 确保工具可执行
/opt/kafka/bin/kafka-topics.sh --help | head -n 3
日志与指标关联示例(定位ISR缩小):
# 1) 指标:UnderReplicatedPartitions
# 2) 日志:
grep -i "Shrinking ISR" /data/kafka/logs/server.log | tail -n 20
练习(带预期结果):
1. 人为制造ISR缩小:限制某Broker网卡带宽(tc限速),观察 UnderReplicatedPartitions 上升;取消限速后应恢复为0。
2. 构造消费积压:创建主题8分区,启动2个消费者实例;验证 lag 上升;扩展到8个消费者后 lag 下降。
3. 演练重分配:将热点主题迁移到新Broker,验证 kafka-topics.sh --describe 的 Leader/ISR 更新。
故障复盘清单:
- 记录时间线、触发变更、关键指标曲线(CPU/IO/URP/lag)。
- 输出根因与改进项:容量阈值、告警策略、变更审批与演练频率。