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 命令行诊断流程

  1. 执行 --describe 获取各分区 LAG 值。
  2. 标记 LAG > 1000 的分区为“高堆积分区”。
  3. 检查 CONSUMER-ID 和 HOST,确认消费者是否存活。
  4. 若某分区 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 指标采集 程序化 / 自定义告警 Grafana 监控面板 持续监控 / 趋势分析 堆积数据汇聚与关联 诊断输出 高堆积分区列表 | 消费速率瓶颈 | 成员状态异常 Rebalance 频率 | 历史趋势对比 建议:日常巡检使用 Grafana 面板,异常排查先用命令行快速定位,再通过 JMX 深入分析
最佳实践:
  • 将 kafka-consumer-groups.sh 封装为定时脚本,输出到日志文件用于事后审计。
  • JMX 指标建议通过 Prometheus JMX Exporter 暴露,避免直接暴露 JMX 端口。
  • Grafana 面板至少保留 7 天历史数据,便于分析堆积趋势和根因。