【Note】《Kafka: The Definitive Guide》 第十章:Kafka 监控详解

发布于:2025-07-10 ⋅ 阅读:(23) ⋅ 点赞:(0)

《Kafka: The Definitive Guide》 第十章:Kafka 监控详解

Kafka 是一个分布式、高吞吐、可扩展的流处理平台。但要让它在生产环境中“稳定可靠”,监控(Monitoring)系统运行状态是核心保障手段之一

  • Kafka 各组件的关键指标;
  • 如何收集指标(JMX、Exporter、日志等);
  • 可视化与报警机制;
  • 如何根据指标发现问题并定位故障。

一、Kafka 为什么必须监控?

Kafka 的分布式特性带来了灵活性和可扩展性,但也意味着:

  • 一处 Broker 出现问题可能引发集群级别连锁故障;
  • 消息堆积、延迟、ISR 异常等往往不容易第一时间感知;
  • 没有监控系统,你不知道“发生了什么、什么时候发生、严重到什么程度”。

因此监控的核心目标是:早发现、快定位、准判断、能自愈。


二、Kafka 可观测数据来源

Kafka 主要通过以下三类方式暴露运行时指标:

1. JMX(Java Management Extensions)

Kafka 是 JVM 应用,核心组件都通过 JMX MBeans 暴露监控指标,例如:

kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
  • 默认端口:9999(可通过 KAFKA_JMX_PORT 设置);
  • 可通过 jconsolejmxterm 等工具手动查看;
  • 常配合 JMX Exporter(Prometheus 插件)自动采集。

2. 日志文件

Kafka 使用 log4j,包括:

  • server.log:Broker 主日志;
  • controller.log:副本、leader、分区控制相关;
  • state-change.log:副本状态变更;
  • cleaner.log:日志压缩详情。

日志适合排查问题,但不适合做时间序列监控。

3. 外部采集组件

  • Prometheus + Grafana:主流方案,Kafka → JMX Exporter → Prometheus → Grafana;
  • Confluent Control Center:Confluent 提供的商业化可视化平台;
  • Datadog、New Relic、InfluxDB:多平台支持 Kafka JMX 数据接入。

三、关键指标详解(按组件)

Kafka 监控指标繁多,但以下是生产环境中最常用、最关键的指标列表,按角色分类。


Broker 级别指标(BrokerTopicMetrics)

指标名称 说明 常见问题预警
MessagesInPerSec 每秒写入的消息数量 突然激增/骤减
BytesInPerSec 每秒写入字节数 压力判断
BytesOutPerSec 每秒出站流量 消费瓶颈
RequestHandlerAvgIdlePercent Handler 空闲比例 过低表示压力大
UnderReplicatedPartitions 副本不一致分区数 > 0 说明副本同步异常
OfflinePartitionsCount 不可用分区数 >= 1 说明服务降级
ActiveControllerCount 主控制器数量 != 1 表示问题

Topic / Partition 指标

指标名称 说明
LogEndOffset 分区当前最新的 offset
LogStartOffset 日志段起始 offset(受保留策略影响)
Size 分区占用磁盘大小
IsrShrinksPerSec / IsrExpandsPerSec ISR 缩减/恢复频率,表示副本健康状况

Producer 侧指标

指标名称 说明
record-send-rate 每秒发送消息数
record-error-rate 错误发送比例
request-latency-avg 请求延迟
bufferpool-wait-time 等待 buffer 时间,>0 说明生产受阻
batch-size-avg 批量大小,影响吞吐

Consumer 侧指标

指标名称 说明
records-lag 当前消费滞后数(最关键)
fetch-rate 每秒拉取消息数
commit-rate offset 提交速率
poll-latency-avg 消费延迟,>100ms 说明压力高或反应慢

四、监控方案搭建实战(Prometheus + Grafana)

1. 启用 JMX Exporter(以 Kafka Broker 为例)

# kafka-run-class.sh 中加入以下配置
KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote \
  -Dcom.sun.management.jmxremote.port=9999 \
  -Dcom.sun.management.jmxremote.rmi.port=9999 \
  -Dcom.sun.management.jmxremote.local.only=false \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false \
  -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent.jar=7071:/opt/jmx_exporter/kafka-2_0_0.yml"

其中:

  • 7071 是导出 Prometheus 指标的端口;
  • kafka-2_0_0.yml 是采集哪些 MBean 的配置文件。

2. Prometheus 配置示例

scrape_configs:
  - job_name: 'kafka'
    static_configs:
      - targets: ['kafka1:7071', 'kafka2:7071']

3. Grafana 模板

Grafana 社区或 Confluent 提供了丰富的 Kafka 监控仪表板模板,涵盖:

  • Kafka Broker 运行状况;
  • 消费者滞后;
  • Topic 增长趋势;
  • 错误率分析;
  • 网络与磁盘 I/O。

五、设置报警规则(Prometheus Alertmanager)

以下是一些典型告警规则示例:

- alert: KafkaOfflinePartitions
  expr: kafka_controller_kafkacontroller_offlinepartitionscount > 0
  for: 2m
  labels:
    severity: critical
  annotations:
    description: "Kafka 有分区不可用"

- alert: KafkaConsumerLagHigh
  expr: kafka_consumer_group_lag > 10000
  for: 5m
  labels:
    severity: warning
  annotations:
    description: "消费者滞后过高"

- alert: KafkaUnderReplicatedPartitions
  expr: kafka_cluster_partition_underreplicated > 0
  for: 1m
  labels:
    severity: warning

六、常见问题诊断策略

症状 常见原因 诊断指标
消费滞后严重 消费者太慢、Topic 写入过快 records-lag
副本同步失败 Broker 压力大或网络延迟高 UnderReplicatedPartitions
延迟高 生产/消费端阻塞、磁盘慢 request-latency, poll-latency
Controller 频繁变动 网络波动、ZooKeeper 异常 ActiveControllerCount

七、小结

Kafka 作为流平台的中枢,一旦出现异常将波及所有上下游系统,因此必须部署完备的 监控 + 报警体系

  • Prometheus + Grafana 是目前主流、免费、生态完善的监控方案;
  • Kafka 的 Broker / Topic / Producer / Consumer 都需要单独监控视角;
  • 建议配合 自动重启、动态扩缩容、日志告警、性能趋势分析 等工具使用;
  • 监控数据也是后续 调优、容量规划、故障定位 的关键数据支撑。

网站公告

今日签到

点亮在社区的每一天
去签到