KafkaNotes

第 19 章:监控与告警

zjc 于 2026-01-19 发布

这是《Kafka 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 Kafka 集群的稳定性 = 指标 + 告警 + 定期演练。本章给出指标体系、部署方案与阈值建议,让问题在用户感知前被发现。

19.1 监控什么

五个层面:

层面 关注点
Broker 存活、请求延迟、线程池、磁盘、网络
分区/副本 ISR 健康、Leader 均衡、离线分区
Controller/KRaft 仲裁状态、元数据滞后
消费组 lag、rebalance 次数、处理耗时
主机 CPU、内存、页缓存、磁盘 IO、网络、时钟

19.2 Broker 关键指标

指标 含义 告警建议
ActiveControllerCount 活跃 Controller 数 !=1 立即告警
OfflinePartitionsCount 无 Leader 分区数 >0 严重告警
UnderReplicatedPartitions ISR 不足的分区数 >0 持续 5 分钟告警
UnderMinIsrPartitionCount 低于 min ISR 的分区 严重告警(影响写入)
RequestHandlerAvgIdlePercent IO 线程空闲率 <0.3 关注
NetworkProcessorAvgIdlePercent 网络线程空闲率 <0.3 关注
BytesInPerSec / BytesOutPerSec 流量 突增突降告警
MessagesInPerSec 消息速率 趋势监控
RequestLatencyAvg/Max 请求延迟 按 P99 阈值
LogDirSize / 磁盘使用率 容量 >80% 告警,>90% 严重
IsrShrinksPerSec / Expands ISR 变化频率 频繁收缩告警

JMX 名称示例(Broker 端):

kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions
kafka.server:type=KafkaRequestHandlerPool,name=RequestHandlerAvgIdlePercent
kafka.network:type=SocketServer,name=NetworkProcessorAvgIdlePercent
kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec

19.3 消费者与 Lag 监控

Lag 是业务最敏感的指标:

lag = log_end_offset - committed_offset

三种采集方式:

  1. 客户端指标:消费者进程暴露 records-lag-max(准确、实时,但消费者挂了就没有数据);
  2. Burrow / kafka-lag-exporter:外部独立采集,覆盖消费者已宕机的场景,推荐;
  3. 命令行巡检kafka-consumer-groups.sh --describe,适合兜底脚本。

告警不要只看绝对值。同样 100 万 lag:

推荐同时监控 lag 趋势(是否持续增长)追平时间估算(lag / 消费速率)

19.4 用 Prometheus + Grafana 搭建

启用 JMX

export JMX_PORT=9999
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote=true \
  -Dcom.sun.management.jmxremote.authenticate=false \
  -Dcom.sun.management.jmxremote.ssl=false"
bin/kafka-server-start.sh config/server.properties

JMX Exporter 配置(片段)

startDelaySeconds: 10
hostPort: 127.0.0.1:9999
rules:
  - pattern: "kafka.server<type=(.+), name=(.+)><>Value"
    name: kafka_server_$1_$2
    type: GAUGE
  - pattern: "kafka.network<type=(.+), name=(.+)><>Value"
    name: kafka_network_$1_$2
    type: GAUGE

采集与服务发现

scrape_configs:
  - job_name: kafka-jmx
    static_configs:
      - targets:
          - broker1:7071
          - broker2:7071
          - broker3:7071
  - job_name: kafka-lag
    static_configs:
      - targets: ['lag-exporter:8080']

Grafana 社区有现成 Kafka 面板(搜索 “Kafka Exporter” / “Kafka JMX”),建议至少包含四块:

  1. 集群健康:Controller、离线分区、ISR;
  2. 流量:BytesIn/Out、MessagesIn 按 Broker/Topic;
  3. 延迟与线程:RequestLatency、Idle Percent;
  4. 消费:lag 趋势、追平时间、rebalance 频率。

19.5 告警策略建议

级别 条件示例
P0 OfflinePartitionsCount > 0;ActiveControllerCount != 1;磁盘 > 90%;Broker down
P1 UnderReplicated 持续 > 5min;UnderMinIsr > 0;lag 追平时间 > 30min
P2 磁盘 > 80%;请求 P99 翻倍;ISR 频繁抖动;rebalance 频率异常
提醒 流量异常波动;topic 增长异常;配置变更事件

告警原则:

19.6 日志与事件

除了指标,还要保留:

19.7 巡检脚本示例

#!/usr/bin/env bash
BS=localhost:9092

echo "== 集群描述 =="
bin/kafka-metadata-quorum.sh --bootstrap-server $BS describe --status

echo "== 离线/落后分区 =="
bin/kafka-topics.sh --bootstrap-server $BS --describe --unavailable-partitions
bin/kafka-topics.sh --bootstrap-server $BS --describe --under-replicated-partitions

echo "== 消费组 lag =="
bin/kafka-consumer-groups.sh --bootstrap-server $BS --list | while read g; do
  bin/kafka-consumer-groups.sh --bootstrap-server $BS --describe --group "$g" |
    awk -v g="$g" 'NR>1 && $NF ~ /^[0-9]+$/ { if ($NF > 100000) print g, $1, $2, "lag="$NF }'
done

定时执行并输出到群机器人,就是最朴素的“可观测性兜底”。

本章小结

思考题

  1. 为什么消费者自带 lag 指标还不够,需要外部 lag 采集器?
  2. 磁盘使用率告警应该设几级?每级对应的动作是什么?
  3. 如果只能保留 5 个 Kafka 指标,你选哪 5 个?为什么?