给你的 Kafka 集群做个“体检”🩺:JMX + Prometheus 监控黄金指标

发布时间:2025-07-14 04:00  浏览量:29

如果说运维是集群的医生,那监控系统就是我们的听诊器、CT机。没有监控的集群,就像在裸奔,你对它的健康状况一无所知,直到它“轰然倒下”。

今天,我们就来干一件运维工程师最有价值感的事:为我们搭建的 Kafka 4.0 KRaft 集群,打造一套基于 JMX 和 Prometheus 的现代化监控体系!

这套组合拳是目前业界监控 JVM 应用(比如 Kafka)的绝对主流方案,稳定、强大、社区活跃。

我们的监控体系由三部分组成:

JMX Exporter:一个 Java Agent,像个翻译官,把 Kafka 通过 JMX 暴露出来的内部指标(MBeans),翻译成 Prometheus 能听懂的 HTTP 文本格式。Prometheus:一个时序数据库,负责定期从 JMX exporter 那里“拉取”指标数据,并存储起来。它还是我们的查询引擎和告警中心。Grafana:一个酷炫的仪表盘工具,负责将 Prometheus 里的原始数据,可视化成各种漂亮的图表,让我们对集群状态一目了然。

首先,我们需要下载 JMX Exporter 的 jar 包和一个为 Kafka 量身定制的配置文件。

下载 JMX Exporter所有三台 Kafka 服务器上 执行:# 创建一个目录存放监控组件mkdir /opt/kafka-monitorcd /opt/kafka-monitor# 下载 jmx_prometheus_javaagentwget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.20.0/jmx_prometheus_javaagent-0.20.0.jar# 下载为 Kafka 准备的配置文件wget https://raw.githubusercontent.com/prometheus/jmx_exporter/main/example_configs/kafka-2_0_0.yml修改 Kafka 启动脚本 我们需要告诉 Kafka 在启动时加载 JMX Exporter 这个 Java Agent。修改 bin/kafka-server-start.sh 脚本,在文件顶部(#!/bin/bash 下方)加入以下内容:# JMX Exporter Agent for Prometheusexport KAFKA_OPTS="-javaagent:/opt/kafka-monitor/jmx_prometheus_javaagent-0.20.0.jar=7071:/opt/kafka-monitor/kafka-2_0_0.yml"-javaagent:...:指定 agent 的 jar 包路径。7071:这是 JMX Exporter 暴露 HTTP 服务的端口,Prometheus 将从这个端口拉取数据。kafka-2_0_0.yml:这是我们下载的配置文件,它告诉 Exporter 需要采集哪些 Kafka 指标。重启 Kafka 集群 修改完脚本后,需要 依次重启所有三台 Kafka 服务器,让配置生效。# 先关闭bin/kafka-server-stop.sh# 再启动bin/kafka-server-start.sh -daemon config/kraft/server-*.properties

现在,我们需要让 Prometheus 去抓取这些暴露出来的指标。找一台独立的服务器安装 Prometheus。

修改 Prometheus 的配置文件 prometheus.yml,在 scrape_configs 部分加入以下内容:

scrape_configs:- job_name: 'kafka'static_configs:- targets: ['192.168.1.11:7071', '192.168.1.12:7071', '192.168.1.13:7071']

重启 Prometheus,稍等片刻,在 Prometheus UI 的查询框中输入 kafka_,如果能看到自动补全的指标列表,说明数据已经成功采集!

指标千千万,我们应该关注哪些?以下是运维老司机们总结出的“黄金指标”,必须配置告警!

kafka_controller_active_controller_count含义:当前活跃的 Controller 数量。在 KRaft 模式下,这个值 必须永远等于 1。如果不是 1,说明集群“脑裂”或 Controller 选举出了问题,天大的事! PromQL 告警:kafka_controller_active_controller_count != 1kafka_server_broker_state含义:Broker 的状态。我们希望所有 Broker 的值都是 3 (RUNNING)。 PromQL 查询:kafka_server_broker_statekafka_cluster_partition_underreplicated含义【核心中的核心】 未同步的副本分区数。这个值 必须永远等于 0。任何大于 0 的情况都意味着你的高可用承诺打了折扣,有数据丢失的风险! PromQL 告警:sum(kafka_cluster_partition_underreplicated) > 0jvm 内存使用率含义:Kafka 是 JVM 应用,必须监控其堆内存使用情况。 PromQL 查询:jvm_memory_bytes_used{area="heap"} / jvm_memory_bytes_max{area="heap"}CPU 使用率含义:Broker 的 CPU 负载。 PromQL 查询 (需安装 node_exporter):100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)网络流量含义:进出 Broker 的流量,能帮你判断业务高峰和异常流量。 PromQL 查��:sum(irate(kafka_server_brokertopicmetrics_bytesinpersec[5m])) by (instance) (入口流量)

将上面这些 PromQL 查询配置到 Grafana 中,你就能得到一个类似下面这样的酷炫监控大盘。把这个大盘投到大屏幕上,瞬间感觉自己就是数据中心的掌控者!