3. 故障排查流程:从发现到复盘,一个都不能少

故障排查这件事,说白了就是一场与时间的赛跑。我在团队里带过不少新人,发现大家最容易犯的毛病是——一上来就急着定位问题,结果连故障到底影响多大都没搞清楚。

我个人习惯把整个流程拆成五个阶段:发现、响应、定位、恢复、复盘。这五个阶段环环相扣,少一个都不行。你想想看,如果跳过复盘,同样的故障下个月还会再来找你。

核心原则:故障处理不是个人英雄主义,而是标准化流程。每个阶段都有明确的目标和产出物。

故障排查五阶段流程 故障发现 监控告警触发 故障响应 SLA计时开始 故障定位 根因分析 故障恢复 止血+恢复 复盘 改进 反馈闭环:复盘结果反哺监控与流程 T0: 故障发生 T+5min: 响应 T+15min: 定位 T+30min: 恢复 T+7d: 复盘 SLA计时从故障发现开始,到故障恢复结束。复盘不计入SLA。

3.1 故障发现:别等用户来骂你

故障发现这件事,我踩过最大的坑就是——监控覆盖不全。有一次线上数据延迟了整整两个小时,监控没报,最后还是业务方打电话来问,我们才知道出了问题。嗯,那次复盘会开得很难看。

所以我现在对监控的要求很简单:能自动发现的,绝不等人报。常见的故障发现手段包括:

  • 指标监控:延迟、吞吐量、错误率、成功率。这些是基础,必须配阈值告警。
  • 日志监控:ERROR 级别日志的实时聚合。我建议把日志接入 ELK 或 Loki,配合关键字告警。
  • 端到端拨测:模拟用户行为,定时探测数据产品的核心链路是否可用。
  • 业务指标异动:比如日活突然下降 30%,这往往是数据质量出问题的信号。

我的习惯:每个数据产品至少配 3 层监控——基础设施层、应用层、业务层。缺一层,你就可能漏掉故障。

3.2 故障响应:黄金 5 分钟

故障一旦被发现,响应速度直接决定了 SLA 能不能保住。我个人习惯把响应阶段分成三步:

  1. 确认告警:先看一眼是不是误报。我曾经遇到过半夜被告警吵醒,结果是监控阈值设得太低。
  2. 评估影响面:影响多少用户?影响哪些业务?影响等级是 P0 还是 P1?这个判断决定了后续的响应力度。
  3. 拉起应急群:把相关方拉进群,同步故障等级、影响范围、当前状态。记住,信息透明是减少恐慌的最好方式。
故障等级 定义 响应时间要求 恢复时间要求
P0 核心功能完全不可用,影响全部用户 ≤ 5 分钟 ≤ 30 分钟
P1 核心功能部分不可用,影响大量用户 ≤ 15 分钟 ≤ 2 小时
P2 非核心功能异常,影响少量用户 ≤ 30 分钟 ≤ 8 小时
P3 体验问题,无功能影响 ≤ 4 小时 ≤ 24 小时

注意:响应阶段不要急着修问题。先搞清楚影响面,再动手。我曾经见过有人一上来就重启服务,结果把现场证据全丢了,定位花了更长时间。

3.3 故障定位:别靠猜,靠数据

定位阶段是最考验功力的。我的经验是——先看监控大盘,再看日志,最后看代码。这个顺序能帮你快速缩小范围。

具体来说,我会按这个思路走:

  • 看时间线:故障是什么时候开始的?那个时间点附近有没有变更?发布?配置修改?数据源切换?
  • 看依赖链路:数据产品通常依赖多个上游系统。是上游挂了,还是中间件出了问题,还是我们自己的代码有 bug?
  • 看关键指标:CPU、内存、IO、网络、GC 情况。很多故障其实就藏在这些基础指标里。
  • 看日志:重点看 ERROR 和 WARN 级别的日志,配合 traceId 把一次请求的全链路串起来。
# 快速定位脚本示例:检查最近5分钟的ERROR日志
grep "ERROR" /var/log/data-product/app.log \
  | grep "$(date -d '5 minutes ago' '+%Y-%m-%d %H:%M')" \
  | awk '{print $1, $2, $5, $NF}' \
  | sort | uniq -c | sort -rn | head -20

避坑指南:我曾经遇到过一个故障,定位了 2 小时才发现是上游 Kafka 集群的磁盘满了。从那以后,我要求所有依赖系统的健康状态必须实时展示在运维大盘上。

3.4 故障恢复:先止血,再根治

恢复阶段的核心原则就四个字:先止血,再根治。别想着一步到位把问题彻底修好,SLA 在倒计时呢。

常见的恢复手段包括:

  • 回滚:如果是发布导致的故障,第一时间回滚到上一个稳定版本。
  • 切流:有多机房部署的话,把流量切到备用机房。
  • 降级:关闭非核心功能,保证核心链路可用。
  • 重启:有些内存泄漏或连接池耗尽的问题,重启能临时解决。

注意:恢复操作一定要在应急群里同步。我曾经见过一个人偷偷重启了服务,结果其他人还在定位,现场全没了。恢复操作必须「先通报,再执行」。

3.5 故障复盘:别让同样的坑绊倒两次

复盘是很多人最容易忽略的阶段。但我跟你说,复盘才是最有价值的环节。没有复盘,故障就白出了。

我主持复盘会时,通常会问三个问题:

  1. 根因是什么? 不是表面原因,是真正的根因。比如「代码写错了」是表面原因,「代码 review 流程缺失」才是根因。
  2. 为什么监控没发现? 如果监控覆盖了,故障本可以更早被发现。
  3. 怎么防止再发生? 需要改代码?加监控?优化流程?

复盘结束后,一定要输出一份故障报告,包含:

项目 内容
故障编号 唯一标识,方便追溯
故障等级 P0/P1/P2/P3
时间线 从发现到恢复的完整时间轴
根因分析 5 Why 分析法得出的根因
影响范围 受影响用户数、业务损失
改进措施 具体可执行的 action item
责任人 每个 action item 的 owner 和 deadline

我的经验:复盘不是为了追责,是为了改进。如果复盘会开成了批斗会,下次出故障就没人敢说了。记住,没有 blame 的文化,才有真正的复盘。

好了,以上就是故障排查的五个阶段。每个阶段都有它的价值,缺了任何一个,你的故障处理能力都会打折扣。下次遇到故障,不妨按这个流程走一遍,你会发现——原来故障处理也可以有条不紊。