3、Kafka集群运维与监控:Broker状态、Topic分区、消费者Lag、磁盘与网络IO

Kafka 在实时数仓里是什么角色?说白了,它就是整个数据管道的大动脉。所有实时数据都得从它这儿过,一旦它出问题,下游的 Flink、ClickHouse 全得断粮。我这些年跟 Kafka 集群打交道,踩过的坑比吃过的盐还多。今天咱们就把 Broker 状态、Topic 分区、消费者 Lag、磁盘和网络 IO 这几个核心监控点,一个一个捋清楚。

核心观点:Kafka 运维不是等出事了再救火,而是通过监控指标提前预判风险。你盯住这四类指标,集群 90% 的问题都能在萌芽阶段发现。

Kafka 集群运维监控核心体系 Kafka 集群 Broker 状态 Topic 分区 消费者 Lag 磁盘 & 网络 IO 在线/离线 Controller 选举 JMX 指标 ISR 同步 Leader 均衡 分区数监控 消费延迟量 消费速率 Rebalance 次数 磁盘使用率 网络吞吐量 IO 等待时间 监控不是目的,预防才是。每个指标背后都对应一种故障模式。 建立基线 → 设置告警 → 自动修复,三步闭环。

3.1 Broker 状态监控:集群的「心跳」

Broker 是 Kafka 集群的节点,它的状态直接决定了集群的可用性。我习惯把 Broker 监控分成三层:存活检测、Controller 状态、以及 JMX 指标采集。

3.1.1 存活检测

最简单的办法就是看 Zookeeper 的 /brokers/ids 节点。每个 Broker 启动时会在这里注册一个临时节点,一旦宕机,节点自动消失。

# 查看当前所有在线 Broker
./zookeeper-shell.sh localhost:2181 ls /brokers/ids

# 查看某个 Broker 的详细信息
./zookeeper-shell.sh localhost:2181 get /brokers/ids/1

不过光靠 ZK 不够。我记得有一次,Broker 进程还在,但已经假死了——不处理请求,不响应心跳。ZK 那边显示在线,实际已经废了。所以,我建议额外做一层端口探测或 Kafka 原生 API 检测。

我的经验:用 kafka-broker-api-versions.sh --bootstrap-server localhost:9092 这个命令,能快速确认 Broker 是否真的在响应请求。比看 ZK 节点靠谱得多。

3.1.2 Controller 状态

Controller 是集群的「大脑」,负责分区 Leader 选举和元数据管理。Controller 挂了,整个集群的元数据操作都会卡住。

监控 Controller 的核心指标:

  • ActiveControllerCount:正常值为 1,大于 1 说明脑裂了,小于 1 说明没有 Controller。
  • ControllerElectionRate:选举频率。短时间内频繁选举,说明集群不稳定。

我曾经遇到过一个场景,网络抖动导致 Controller 频繁重选,每次重选都要重新分配 Leader,结果整个集群的写入延迟飙升了 10 倍。排查了半天,最后发现是交换机端口协商出了问题。

3.1.3 JMX 关键指标

Kafka 的 JMX 指标非常丰富,但别全采,挑几个关键的就行:

指标名称 MBean 路径 告警阈值
请求处理线程空闲率 kafka.network:type=RequestChannel,name=RequestQueueSize 队列大小持续 > 1000
消息入站速率 kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec 与基线偏差 > 50%
分区 Leader 数量 kafka.controller:type=KafkaController,name=LeaderCount 单 Broker 负载不均

注意:JMX 采集本身有性能开销。我见过有人每 5 秒拉一次全量指标,直接把 Broker 的 GC 给拉爆了。建议采集间隔至少 15 秒,非核心指标 30 秒以上。

3.2 Topic 分区监控:数据的「车道」

Topic 分区是 Kafka 并行处理的基本单位。分区出了问题,数据要么写不进去,要么读不出来。

3.2.1 分区状态与 ISR

每个分区有多个副本,其中一个是 Leader,其余是 Follower。ISR(In-Sync Replicas)是跟 Leader 保持同步的副本列表。

监控重点:

  • UnderReplicatedPartitions:副本数小于配置的复制因子。这是最危险的信号,说明数据有丢失风险。
  • OfflinePartitions:分区没有 Leader。这意味着该分区完全不可用。

我记得有一次,一个 Broker 磁盘满了,导致它上面的分区副本全部掉出 ISR。结果那个 Topic 的写入延迟从 5ms 飙到了 2 秒。清理磁盘后,ISR 自动恢复,但花了将近 10 分钟才追上数据。

3.2.2 分区 Leader 均衡

理想情况下,Leader 应该均匀分布在所有 Broker 上。但现实往往不是这样。我见过一个集群,80% 的 Leader 集中在两台 Broker 上,其他 Broker 几乎闲置。

怎么检查?

# 查看每个 Broker 上的 Leader 分布
kafka-topics.sh --bootstrap-server localhost:9092 --describe --under-replicated-partitions

# 手动触发 Leader 重均衡
kafka-leader-election.sh --bootstrap-server localhost:9092 --election-type preferred --all-topic-partitions

避坑指南:我曾经在生产环境直接执行了 Leader 重均衡,结果导致大量分区同时切换 Leader,客户端全部触发 Rebalance,整个集群卡了 3 分钟。后来我学乖了,分批执行,每次只重均衡 100 个分区,间隔 30 秒。

3.2.3 分区数量监控

分区不是越多越好。每个分区对应一个日志目录和一组文件句柄。分区太多,Broker 的内存和文件句柄都会被耗尽。

我一般建议:

  • 单 Broker 分区数不超过 2000(机械盘)或 4000(SSD)
  • 单 Topic 分区数不超过 100(除非有特殊需求)
  • 监控 kafka.server:type=BrokerTopicMetrics,name=TotalPartitionCount

3.3 消费者 Lag 监控:数据管道的「堵点」

消费者 Lag 是实时数仓最核心的监控指标之一。它直接反映了数据从 Kafka 到下游系统的延迟。

3.3.1 Lag 的计算方式

Lag = 生产者的最新偏移量 - 消费者的当前偏移量。说白了,就是消费者落后了多少条消息。

# 查看消费者组 Lag
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group my-group --describe

输出示例:

GROUP           TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG
my-group        order_topic     0          1500            2000            500
my-group        order_topic     1          1200            2000            800

3.3.2 Lag 的告警策略

Lag 不是越小越好,也不是有 Lag 就要告警。关键看趋势:

  • 持续增长:消费者处理能力跟不上生产速度,需要扩容或优化。
  • 突然飙升:消费者挂了,或者下游系统(如 Flink、ClickHouse)出现瓶颈。
  • 波动正常:偶尔的 Lag 波动是正常的,比如 GC 暂停、网络抖动。

我的做法:设置两级告警。第一级:Lag 超过 10000 且持续增长超过 5 分钟,发钉钉通知。第二级:Lag 超过 50000,直接电话告警。阈值要根据业务容忍度来调,别一刀切。

3.3.3 消费者 Rebalance 监控

Rebalance 是消费者组的「重新洗牌」。每次 Rebalance 都会暂停消费,导致 Lag 瞬间上涨。

监控指标:

  • Rebalance 次数:短时间内频繁 Rebalance,说明消费者不稳定。
  • Rebalance 耗时:超过 30 秒的 Rebalance 需要关注。

我曾经遇到过一个坑:某个消费者因为处理逻辑太慢,导致心跳超时,被踢出消费者组。然后它又自动加入,触发 Rebalance。结果就是「加入 → 超时 → 踢出 → 再加入」的死循环,Lag 从 1000 涨到了 10 万。最后排查发现是下游数据库连接池满了,导致消费线程阻塞。

3.4 磁盘与网络 IO 监控:硬件的「红线」

Kafka 是 IO 密集型应用,磁盘和网络就是它的命门。这两个指标一旦出问题,整个集群的性能都会崩。

3.4.1 磁盘监控

Kafka 的数据是顺序写入磁盘的,但顺序写不代表磁盘不会出问题。

核心指标:

  • 磁盘使用率:超过 85% 就要告警。超过 90%,Kafka 可能会自动停止写入。
  • 磁盘 IO 等待时间(await):正常值 < 10ms,超过 50ms 说明磁盘有瓶颈。
  • 磁盘吞吐量(r/s, w/s):与硬件规格对比,看是否达到上限。
# 查看磁盘 IO 状态
iostat -x 1 5

# 查看 Kafka 日志目录大小
du -sh /data/kafka/logs/*

警告:千万别把 Kafka 的数据目录放在 NFS 或 CIFS 等网络文件系统上。我见过有人图省事挂载了 NFS,结果一次网络抖动导致整个集群写入卡死,数据丢失了整整 2 小时。

3.4.2 网络监控

网络是 Kafka 的另一个瓶颈。尤其是跨机房、跨可用区的部署,网络延迟和带宽限制会直接影响吞吐量。

监控重点:

  • 网络吞吐量(BytesInPerSec, BytesOutPerSec):与网卡带宽对比,看是否接近上限。
  • 网络重传率:重传率 > 1% 说明网络质量有问题。
  • TCP 连接数:每个消费者和生产者都会建立 TCP 连接,连接数太多会耗尽 Broker 的资源。

我记得有一次,业务方突然反馈数据延迟很大。我一看网络监控,发现 BytesOutPerSec 已经达到了 900 Mbps,而网卡是千兆的。说白了,网卡被打满了。后来加了万兆网卡,问题解决。

3.4.3 磁盘与网络的联动分析

很多时候,磁盘和网络的问题是相互影响的。比如:

  • 网络带宽不足 → 数据堆积在 Broker 内存 → 内存不够 → 刷盘频率增加 → 磁盘 IO 飙升
  • 磁盘 IO 慢 → 数据写入慢 → 生产者积压 → 网络吞吐量下降

所以,我建议把磁盘和网络指标放在同一个监控大盘上,方便联动分析。

总结一下:Kafka 运维监控不是看一堆数字,而是通过数字读懂集群的健康状况。Broker 状态是「有没有」,Topic 分区是「好不好」,消费者 Lag 是「快不快」,磁盘和网络是「够不够」。把这四个维度盯住了,你的 Kafka 集群就能稳定运行。