1. Kafka 故障排查概述

各位好,我是老赵。做 Kafka 运维这些年,我踩过的坑比写过的代码还多。今天咱们聊聊故障排查这件事。

很多人觉得 Kafka 稳定得很,出不了大问题。嗯,这话对了一半。Kafka 确实皮实,但一旦出问题,往往就是集群级别的。我见过凌晨三点被叫起来扩容的兄弟,也见过因为一个配置项导致整个链路瘫痪的案例。

所以,咱们先把基础打牢。这一章我会带着大家回顾 Kafka 的核心架构,梳理常见的故障类型,然后给出一套我这些年沉淀下来的排查方法论和工具链。

1.1 Kafka 架构回顾

先看一张图,把 Kafka 的整体脉络理清楚。

Kafka 核心架构图 Kafka 核心架构图 Producer 消息生产者 Kafka Broker 集群 Broker 1 Broker 2 Broker 3 Topic / Partition 每个 Topic 分为多个 Partition Partition 有 Leader / Follower 角色 Consumer 消息消费者 ZooKeeper 元数据管理 / 控制器选举 核心组件说明 • Producer:发送消息 • Broker:存储 + 服务 • Consumer:拉取消费 数据流向 Producer → Broker → Consumer

这张图我画了很多次。每次给新人讲架构,我都会指着它说:Kafka 本质上就是一个分布式的消息队列系统。Producer 发消息,Broker 存消息,Consumer 拉消息。中间靠 ZooKeeper 管着元数据和选主。

我个人习惯把 Kafka 的架构拆成三层来看:

  • 存储层:Broker 节点 + 磁盘。消息以 Segment 文件形式落盘,顺序读写是性能的关键。
  • 协调层:ZooKeeper 或 KRaft(新版本)。管 Controller 选举、Topic 元数据、Consumer Group 位移。
  • 客户端层:Producer 和 Consumer。这层出问题最多,我后面会重点讲。
我的经验:很多故障其实不是 Kafka 本身的问题,而是客户端用错了。比如 Producer 没配 acks=all,丢消息了还怪集群不稳定。先检查客户端,再查服务端,这个顺序能省一半时间。

1.2 常见故障分类

这些年我整理了一份故障清单,大概分了四大类。你想想看,是不是都遇到过?

故障类别 典型场景 影响范围
连接与网络 客户端连不上 Broker、连接超时、频繁断开重连 单点 / 局部
存储与性能 磁盘写满、Page Cache 抖动、Segment 文件损坏 节点 / 集群
数据一致性与可靠性 消息丢失、重复消费、位移提交异常 全局
集群协调 Controller 频繁切换、分区 Leader 选举失败、Rebalance 风暴 集群

我举个例子。有一次线上集群突然大量报错 LEADER_NOT_AVAILABLE。当时我第一反应是 Controller 挂了。查了一圈发现,其实是磁盘 IO 被打满了,导致 Leader 心跳超时,触发了频繁的选举。你看,表面是协调层的问题,根子在存储层。

避坑指南:我曾经遇到过一个案例,运维同学发现磁盘使用率 95%,直接删了日志文件。结果 Kafka 进程崩溃,数据全丢了。记住:永远不要手动删除 Kafka 的日志文件。用 kafka-log-cleaner 或者调整 retention 策略才是正解。

1.3 故障排查方法论

排查故障,说白了就是「假设 - 验证 - 排除」的循环。我总结了一套五步法,分享给大家。

  1. 明确现象:用户报什么错?监控告警是什么?先搞清楚「发生了什么」。
  2. 收集信息:日志、监控指标、线程栈、网络抓包。信息越全,定位越快。
  3. 提出假设:根据现象和信息,列出可能的原因。比如「可能是磁盘满了」「可能是 GC 导致停顿」。
  4. 验证假设:用工具或命令去验证。比如 df -h 看磁盘,jstat 看 GC。
  5. 定位根因:排除掉错误的假设,找到真正的根因。然后修复、验证、复盘。

这套方法看起来简单,但很多人一着急就跳步骤。我记得有一次,一个同事看到 Consumer Lag 很高,直接去调 max.poll.records,结果越调越糟。其实根因是 Broker 端磁盘 IO 瓶颈,调客户端参数根本没用。

核心原则:先看服务端,再看客户端;先看硬件,再看软件;先看监控,再看日志。别上来就改配置,先搞清楚「为什么」。

1.4 工具链

工欲善其事,必先利其器。我平时排查故障,离不开下面这些工具。我把它们分成三类。

命令行工具

  • kafka-topics.sh:查看 Topic 详情、分区分布、ISR 状态。
  • kafka-consumer-groups.sh:查看 Consumer Group 位移和 Lag。
  • kafka-log-dirs.sh:查看各 Broker 磁盘使用情况和日志文件状态。
  • kafka-reassign-partitions.sh:分区迁移和重新平衡。

监控与诊断

  • JMX 指标:Kafka 暴露了大量 JMX 指标,比如 kafka.server:type=BrokerTopicMetrics。我习惯用 Prometheus + Grafana 采集和展示。
  • jstack / jmap:看线程栈和堆内存。遇到 CPU 飙高或 OOM,这两个命令是救命稻草。
  • tcpdump / netstat:网络问题排查利器。比如客户端连不上,抓包一看,哦,防火墙把端口封了。

日志分析

  • server.log:Broker 运行日志,记录了所有关键事件,比如 Leader 选举、异常关闭。
  • controller.log:Controller 的专属日志。如果集群出现频繁的 Leader 变更,这里一定有线索。
  • kafka-request.log:慢请求日志。打开这个,能抓到那些处理时间超过阈值的请求。
我的习惯:我会在每台 Broker 上写一个脚本,一键收集最近 30 分钟的日志、JMX 快照、线程栈和系统负载。出问题时,先跑一遍脚本,把现场「冻结」下来。这样即使后面重启了,也能复盘。

好了,这一章的内容就到这里。架构、故障分类、方法论、工具链,这四个东西是后面所有章节的基础。你把这些吃透了,后面的实战案例才能听得明白。