Kafka 的 JMX(Java Management Extensions) 是 Kafka 监控、性能分析、容量规划、故障排查 的核心机制之一。几乎所有 Kafka 监控系统(Prometheus / Grafana / Datadog / Zabbix)底层都依赖 JMX 指标。
下面我从 架构 → 启用 → 指标体系 → 核心 MBean → 实战监控 → 优化指标 → 常见问题 全面系统讲解。
一、什么是 Kafka JMX
1️⃣ JMX 本质
JMX 是 Java 提供的:
运行时管理与监控接口标准
允许外部程序读取 JVM 内部对象的状态。
Kafka 是 Java 程序,因此:
Kafka Broker
↓
JVM
↓
JMX MBean
↓
监控系统读取
2️⃣ Kafka JMX 的作用
Kafka 所有关键指标都来自 JMX,例如:
| 类型 | 示例 |
|---|---|
| Broker性能 | TPS、延迟 |
| Topic吞吐 | BytesIn/Out |
| Producer状态 | 请求速率 |
| Consumer Lag | 延迟消费 |
| 副本同步 | ISR 状态 |
| JVM | GC、内存 |
二、Kafka JMX 架构
Kafka 指标结构
Kafka 使用:
Domain + Type + Name + Tags
格式:
kafka.<domain>:type=<Type>,name=<Metric>,<tag>=<value>
示例:
kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec
含义:
| 部分 | 说明 |
|---|---|
| kafka.server | 模块 |
| BrokerTopicMetrics | 指标分类 |
| BytesInPerSec | 指标名 |
三、如何开启 Kafka JMX(重点)
Kafka 默认支持 JMX,只需暴露端口。
方式1(推荐):环境变量启动
编辑:
bin/kafka-server-start.sh
添加:
export JMX_PORT=9999
export KAFKA_JMX_OPTS="
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
"
启动:
bin/kafka-server-start.sh config/server.properties
验证
netstat -lntp | grep 9999
看到:
LISTEN 0 0 :::9999
说明成功。
四、Kafka JMX 指标分类(核心)
Kafka JMX 可以分为 6 大类:
1️⃣ Broker 指标(最重要)
Domain
kafka.server
🔥 吞吐指标
kafka.server:type=BrokerTopicMetrics
| 指标 | 含义 |
|---|---|
| BytesInPerSec | 写入流量 |
| BytesOutPerSec | 读取流量 |
| MessagesInPerSec | 消息TPS |
👉 判断 Kafka 是否过载核心指标。
示例
kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec
属性:
Count
MeanRate
OneMinuteRate
FiveMinuteRate
2️⃣ Request 请求指标(极其重要)
kafka.network:type=RequestMetrics
请求延迟(关键)
TotalTimeMs
代表:
网络 + 队列 + 磁盘 + 处理
Kafka 延迟 = 这里。
核心请求类型:
| 请求 | 含义 |
|---|---|
| Produce | 写入 |
| FetchConsumer | 消费 |
| FetchFollower | 副本同步 |
示例:
kafka.network:type=RequestMetrics,name=TotalTimeMs,request=Produce
3️⃣ 副本同步指标(ISR健康度)
kafka.server:type=ReplicaManager
关键指标:
| 指标 | 含义 |
|---|---|
| UnderReplicatedPartitions | ISR异常数量 |
| OfflinePartitionsCount | 离线分区 |
🔥 生产环境必须监控:
UnderReplicatedPartitions > 0 = 故障
4️⃣ Controller 指标
kafka.controller
关键:
| 指标 | 含义 |
|---|---|
| ActiveControllerCount | 当前controller数量 |
必须:
= 1
否则集群异常。
5️⃣ Log & 磁盘指标
kafka.log
关注:
| 指标 | 含义 |
|---|---|
| LogFlushRateAndTimeMs | flush延迟 |
| LogFlushStats | IO压力 |
6️⃣ JVM 指标(很多人忽略)
java.lang
例如:
| 指标 | 含义 |
|---|---|
| HeapMemoryUsage | 堆使用 |
| GarbageCollector | GC时间 |
| ThreadCount | 线程数 |
Kafka 性能问题 80% 来自 JVM。
五、最关键的 Kafka JMX 指标(生产必看)
下面是实战中真正需要监控的:
| 分类 | 指标 | 作用 |
|---|---|---|
| 吞吐 | BytesInPerSec | 写压力 |
| 吞吐 | BytesOutPerSec | 读压力 |
| TPS | MessagesInPerSec | 消息速率 |
| 延迟 | TotalTimeMs | Kafka延迟 |
| ISR | UnderReplicatedPartitions | 副本健康 |
| Controller | ActiveControllerCount | 集群稳定 |
| Queue | RequestQueueSize | 是否堵塞 |
| IO | LogFlushTimeMs | 磁盘瓶颈 |
| JVM | GC Time | Stop-the-world |
六、如何读取 Kafka JMX
方法1:jconsole(官方)
jconsole <ip>:9999
可直接浏览 MBean。
方法2:jmxterm(推荐)
java -jar jmxterm.jar
连接:
open host:9999
查看:
beans
方法3(生产推荐):Prometheus
架构:
Kafka
↓ JMX
JMX Exporter
↓
Prometheus
↓
Grafana
启动 exporter:
java -javaagent:jmx_prometheus_javaagent.jar=7071:config.yml
Prometheus 采集:
http://broker:7071/metrics
七、Kafka JMX 与性能优化关系(重点)
JMX = Kafka 调优依据。
1️⃣ 判断 Broker 是否瓶颈
看:
BytesInPerSec ↑
TotalTimeMs ↑
说明:
磁盘 or 网络瓶颈
2️⃣ 判断线程不足
看:
RequestQueueSize
持续增长:
num.network.threads 太小
3️⃣ 判断磁盘问题
看:
LogFlushTimeMs ↑
说明:
IO wait 高
4️⃣ 判断 Consumer 慢
看:
BytesOutPerSec 低
Lag 高
八、JMX 指标命名规律(记住这个)
Kafka 指标基本遵循:
PerSec → 速率
Ms → 延迟
Count → 总次数
Rate → 平均速率
Queue → 队列长度
九、生产环境最佳实践(经验总结)
✅ 必须做:
-
禁止公网暴露 JMX
-
使用 exporter 转 HTTP
-
Grafana 建仪表盘
-
设置告警
推荐告警:
| 指标 | 阈值 |
|---|---|
| UnderReplicatedPartitions | >0 |
| ActiveControllerCount | ≠1 |
| Produce TotalTimeMs | >100ms |
| GC Time | 持续升高 |
十、很多人不知道的高级知识(⭐)
Kafka Metrics 实际基于:
Dropwizard Metrics
因此:
MeanRate
1mRate
5mRate
15mRate
类似 Linux load average。
十一、Kafka JMX 总体认知图
Kafka Broker
│
JVM Metrics
│
JMX MBeans
│
┌─────────────┼─────────────┐
Broker Network Replica
│
JMX Exporter
│
Prometheus
│
Grafana
✅ 一句话总结
Kafka JMX = Kafka 的"操作系统 /proc"
所有性能问题最终都能在 JMX 指标中找到证据。