4. 堆积诊断基础:查看堆积的命令行工具、JMX 指标与监控面板关键指标
Kafka 消费者堆积(Consumer Lag)是衡量消息消费健康度的核心指标。堆积过高意味着消费者处理速度跟不上生产速度,可能导致端到端延迟增加、数据丢失风险上升。本章系统讲解三种最常用的堆积诊断手段:命令行工具、JMX 指标和Grafana 监控面板。
4.1 命令行工具:kafka-consumer-groups.sh
kafka-consumer-groups.sh 是 Kafka 官方提供的消费者组管理脚本,支持查看、重置和删除消费者组。诊断堆积时最常用的是 --describe 子命令。
4.1.1 基本用法
# 查看指定消费者组的详细信息(包含堆积)
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group my-consumer-group \
--describe
输出示例:
| TOPIC | PARTITION | CURRENT-OFFSET | LOG-END-OFFSET | LAG | CONSUMER-ID | HOST | CLIENT-ID |
|---|---|---|---|---|---|---|---|
| orders | 0 | 15000 | 15200 | 200 | consumer-1-xxx | /10.0.0.1 | consumer-1 |
| orders | 1 | 12000 | 12500 | 500 | consumer-1-xxx | /10.0.0.1 | consumer-1 |
| orders | 2 | 8000 | 8100 | 100 | consumer-2-yyy | /10.0.0.2 | consumer-2 |
关键字段说明:
- CURRENT-OFFSET:消费者当前已提交的偏移量。
- LOG-END-OFFSET:分区最新消息的偏移量。
- LAG = LOG-END-OFFSET - CURRENT-OFFSET,即堆积量。
4.1.2 常用参数组合
--members --describe:查看消费者组成员及分配的分区。--state:查看消费者组状态(Stable / Empty / Dead / PreparingRebalance)。--all-groups --describe:列出所有消费者组的堆积情况(集群级巡检)。
4.1.3 命令行诊断流程
- 执行
--describe获取各分区 LAG 值。 - 标记 LAG > 1000 的分区为“高堆积分区”。
- 检查
CONSUMER-ID和HOST,确认消费者是否存活。 - 若某分区 LAG 持续增长,说明消费者处理能力不足或分区分配不均。
4.2 JMX 指标:程序化采集堆积数据
Kafka 通过 JMX(Java Management Extensions)暴露丰富的运行时指标。对于堆积诊断,主要关注消费者端和 Broker 端的 JMX MBean。
4.2.1 消费者端 JMX 指标
| MBean 名称 | 属性 | 说明 |
|---|---|---|
kafka.consumer:type=consumer-fetch-manager-metrics,client-id=* |
records-lag-max |
所有分区中最大堆积量 |
kafka.consumer:type=consumer-fetch-manager-metrics,client-id=* |
records-lag-avg |
所有分区平均堆积量 |
kafka.consumer:type=consumer-fetch-manager-metrics,client-id=* |
records-consumed-rate |
每秒消费速率(条/秒) |
kafka.consumer:type=consumer-fetch-manager-metrics,client-id=* |
bytes-consumed-rate |
每秒消费字节数 |
4.2.2 Broker 端 JMX 指标
| MBean 名称 | 属性 | 说明 |
|---|---|---|
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec |
Count |
Broker 每秒写入消息数 |
kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec |
Count |
Broker 每秒写入字节数 |
kafka.log:type=Log,partition=* |
LogEndOffset |
分区最新偏移量(用于计算 LAG) |
注意:Broker 端不直接暴露消费者 LAG,需要结合消费者端
records-lag-max 或通过外部监控系统(如 Burrow、Kafka Lag Exporter)计算。
4.2.3 使用 jmxterm 采集示例
# 连接消费者 JMX 端口
open host:port
# 获取最大堆积
bean kafka.consumer:type=consumer-fetch-manager-metrics,client-id=consumer-1
get records-lag-max
# 获取消费速率
get records-consumed-rate
4.3 监控面板(Grafana)关键指标
生产环境中,Grafana 面板是可视化堆积趋势的首选工具。以下是与堆积诊断直接相关的关键图表和指标。
4.3.1 堆积趋势图(Lag Over Time)
- 指标来源:Prometheus 采集的
kafka_consumer_lag或kafka_consumergroup_lag。 - 图表类型:时间序列折线图,按消费者组和分区着色。
- 告警规则:LAG > 阈值(如 10000)且持续 5 分钟以上触发告警。
4.3.2 消费速率 vs 生产速率对比图
- 指标来源:
kafka_topic_partition_current_offset(生产端)和kafka_consumer_offset(消费端)。 - 图表类型:双轴折线图,左轴为偏移量,右轴为速率。
- 诊断价值:当生产速率持续高于消费速率时,堆积必然上升。
4.3.3 消费者组成员状态表
- 指标来源:
kafka_consumergroup_members。 - 图表类型:Stat 面板或表格。
- 诊断价值:成员数异常减少可能触发 Rebalance,导致堆积瞬时飙升。
4.3.4 关键 Grafana 面板配置示例
# PromQL 查询示例(Prometheus 数据源)
# 消费者组堆积总和
sum by (consumergroup) (kafka_consumergroup_lag{consumergroup="my-group"})
# 分区级堆积 TOP 10
topk(10, kafka_consumergroup_lag)
# 消费速率(条/秒)
rate(kafka_consumer_records_consumed_total[1m])
4.4 三种诊断方式对比
| 诊断方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| kafka-consumer-groups.sh | 临时排查、单次巡检 | 无需额外组件,即时输出 | 无法查看历史趋势,不适合大规模集群 |
| JMX 指标 | 程序化采集、自定义告警 | 细粒度、可集成到监控系统 | 需要开启 JMX 端口,有一定安全风险 |
| Grafana 面板 | 持续监控、趋势分析、团队协作 | 可视化强、支持历史回溯和告警 | 需要搭建 Prometheus + Grafana 基础设施 |
4.5 堆积诊断流程总览
最佳实践:
- 将
kafka-consumer-groups.sh封装为定时脚本,输出到日志文件用于事后审计。 - JMX 指标建议通过 Prometheus JMX Exporter 暴露,避免直接暴露 JMX 端口。
- Grafana 面板至少保留 7 天历史数据,便于分析堆积趋势和根因。