Kafka 监控与排障
Kafka 排障要先判断问题发生在 Producer、Broker、Consumer 还是下游系统。不要只看 Consumer Lag,Lag 是结果,不是根因。
核心监控对象
| 层级 | 重点指标 |
|---|---|
| Producer | 发送延迟、错误率、重试次数、缓冲区等待时间 |
| Broker | 请求延迟、网络线程、IO 线程、磁盘、ISR、Controller |
| Topic / Partition | 写入速率、读取速率、分区倾斜、副本状态 |
| Consumer | Lag、消费速率、Poll 间隔、提交失败 |
| 系统 | CPU、内存、磁盘 IO、网络带宽、文件句柄 |
常用命令
查看 Topic 和 ISR
shell
kafka-topics.sh --bootstrap-server localhost:9092 \
--describe --topic orders重点看:
LeaderReplicasIsr- 是否存在 Under-Replicated Partition
查看 Consumer Group
shell
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group order-service重点看:
| 字段 | 说明 |
|---|---|
CURRENT-OFFSET | 当前已提交 Offset |
LOG-END-OFFSET | Partition 最新 Offset |
LAG | 两者差值 |
CONSUMER-ID | 当前消费实例 |
HOST | Consumer 所在主机 |
查看 KRaft 元数据
shell
kafka-metadata-quorum.sh --bootstrap-server localhost:9092 \
--describe --status重点看 Controller Quorum 是否稳定、Leader 是否频繁切换。
Consumer Lag 持续增长
LOG-END-OFFSET 增长速度 > CURRENT-OFFSET 增长速度排查顺序:
- 写入量是否突然升高
- Consumer 实例是否减少或频繁 Rebalance
- Partition 数是否限制了消费并行度
- 单条消息处理是否变慢
- 下游数据库、HTTP 服务、缓存是否变慢
- Offset 是否提交失败
处理方式:
| 原因 | 处理 |
|---|---|
| 写入峰值 | 临时扩容 Consumer,必要时增加 Partition |
| 处理慢 | 优化业务逻辑、批量写下游、异步化 |
| Partition 不足 | 扩分区后按 Key 分布评估顺序性影响 |
| Rebalance 频繁 | 调整 max.poll.interval.ms、使用 Static Membership |
| 下游慢 | 限流、降级、队列隔离 |
Under-Replicated Partition
Under-Replicated 表示副本没有全部跟上 Leader。
常见原因:
- Follower Broker 宕机
- Broker 网络抖动
- 磁盘 IO 慢
- 副本拉取线程不足
- 单 Broker 负载过高
排查:
shell
kafka-topics.sh --bootstrap-server localhost:9092 --describe \
| grep -i 'Isr'观察 Replicas 和 Isr 是否数量不一致。
处理:
- 恢复故障 Broker
- 检查磁盘空间和 IO Util
- 检查 Broker 间网络
- 适当增加
num.replica.fetchers - 重新分配热点 Partition
Producer 发送变慢
关注指标:
| 指标 | 含义 |
|---|---|
request-latency-avg | 请求平均延迟 |
record-error-rate | 发送错误率 |
record-retry-rate | 重试速率 |
bufferpool-wait-ratio | 等待 Producer 缓冲区的比例 |
batch-size-avg | 平均批次大小 |
可能原因:
- Broker 端请求处理慢
acks=all下 ISR 同步慢- Producer 缓冲区太小
batch.size/linger.ms不合理- 网络带宽不足
- 单 Partition 热点
处理:
properties
buffer.memory=67108864
batch.size=131072
linger.ms=5
compression.type=lz4如果是可靠性场景,不要为了降低延迟直接把 acks 从 all 改成 1,应先确认 ISR、磁盘、网络和批量配置。
Broker 请求延迟高
Broker 端通常看请求延迟拆分:
| 阶段 | 含义 |
|---|---|
| Request Queue | 请求等待网络线程处理 |
| Local Time | Broker 本地处理时间 |
| Remote Time | 等待副本同步时间 |
| Response Queue | 响应等待网络线程发送 |
| Response Send | 响应发送耗时 |
判断:
- Request Queue 高:网络线程不足或请求过多
- Local Time 高:磁盘、页缓存、日志追加慢
- Remote Time 高:Follower 同步慢,ISR 有问题
- Response Queue 高:网络线程或网络带宽瓶颈
磁盘问题
Kafka 对磁盘非常敏感,常见问题包括:
- 磁盘空间不足
- 单盘热点
- Page Cache 命中率下降
- 保留策略过大导致清理不及时
- 日志目录所在磁盘和系统盘混用
检查方向:
shell
df -h
iostat -x 1
lsof | wc -l处理建议:
log.dirs使用独立数据盘- 合理设置
log.retention.ms和log.retention.bytes - 避免把超大保留周期和高写入 Topic 放在同一小磁盘
- 对热点 Topic 做分区和副本再分配
Controller 异常
Controller 负责分区 Leader 选举和元数据管理。Controller 不稳定会导致:
- Leader 频繁切换
- Topic 创建/删除变慢
- Broker 上下线影响扩大
- KRaft Quorum 不稳定
排查:
shell
kafka-metadata-quorum.sh --bootstrap-server localhost:9092 \
--describe --status关注:
- 当前 Leader 是否频繁变化
- Controller 节点是否资源不足
- Broker 间网络是否稳定
- 元数据日志目录是否有磁盘问题
热点 Partition
现象:
- 某个 Broker 流量明显高于其他 Broker
- 某个 Partition 的写入量远高于其他 Partition
- Consumer Group 中某个 Consumer Lag 明显更高
常见原因:
- Key 分布不均
- 所有消息使用固定 Key
- Partition Leader 分布不均
- 某个大客户或大租户集中到同一 Key
处理:
- 优化 Key 设计,引入更均匀的分区键
- 增加 Partition 后评估顺序性影响
- 使用分区再分配工具迁移 Leader 和副本
- 对大租户拆 Topic 或拆业务流
排障路径
问题现象
│
├── Producer 报错/发送慢?
│ └── 看 ACK、重试、缓冲区、Broker 请求延迟
│
├── Consumer Lag 高?
│ └── 看消费速率、Rebalance、下游处理、Partition 并行度
│
├── ISR 不完整?
│ └── 看 Broker 存活、网络、磁盘、Follower 拉取
│
└── 集群元数据异常?
└── 看 Controller、KRaft Quorum、Broker 日志