故障演练与稳定性建设

线上故障无法完全避免,能控制的是“发现多快、止血多快、同一个坑重复踩过几次”。稳定性建设就是这三件事的工程化:可观测的监控告警、可执行的预案,以及把预案在接近真实的环境里演练一遍。本章讲故障分级与响应流程、常见演练项目与复盘要点。

稳定性体系三根支柱

监控告警  → 知道出事了、知道哪里出事(指标、日志、链路追踪)
预案与演练 → 知道该怎么办,而且演练过(限流、降级、切流、回滚)
复盘改进  → 同类问题不再发生(根因分析 + 改进项闭环)

三者缺一不可:只有监控没有预案,故障时只能现场想对策;只有预案没有演练,真出事时脚本可能早已失效。

监控告警要点

层次关键指标作用
业务下单成功率、支付成功率、GMV 曲线最先发现“程序正常但业务异常”
应用QPS、错误率、P99、线程池与连接池水位定位自身瓶颈
中间件缓存命中率与延迟、消息堆积、数据库慢查询定位下游瓶颈
主机CPU、内存、磁盘、网络、文件句柄数定位资源问题
链路TraceID 串联各跳耗时跨服务定位慢在哪一跳

告警设计的原则是告警必须可行动:同一现象只保留一条主告警,其余作为关联信息;阈值告警与同比、环比突变告警结合,避免大促期间出现告警风暴。

故障分级与响应

级别判定标准响应要求参与角色
P0核心链路不可用、有资损风险、大面积影响立即拉起,全员响应值班 + 负责人 + 相关方
P1核心功能受损但有绕行方案15 分钟内响应值班 + 模块负责人
P2非核心功能异常、少量用户受影响工作时间处理模块负责人
P3体验问题、潜在隐患排期修复需求方

响应流程固定为四步:发现 → 止血 → 定位 → 修复。其中止血优先于定位:能回滚就先回滚、能降级就先降级,不要在故障进行中做根因分析,那是复盘阶段的事。

发现:告警或用户反馈
 ↓  3 分钟内确认影响面:哪个功能、多少用户、是否在扩大
止血:回滚版本 / 关闭开关 / 限流降级 / 切流,先恢复核心链路
 ↓  记录每个动作的时间点,复盘时要用
定位:对比监控曲线、查 Trace 与日志、核对最近的变更记录
 ↓
修复:小流量验证后逐步放量,同步更新故障记录

常见演练项目

演练项做法验证目标
杀进程随机 kill 应用实例或关键 worker负载均衡摘除、重启自愈、发布无损
网络延迟与丢包用 tc 注入延迟和丢包超时设置是否合理、重试是否放大流量
依赖超时让下游接口延迟返回熔断降级是否生效、线程池是否被占满
数据库主从切换主动切换主库或模拟主库不可写切换耗时、应用重连、数据一致性
缓存宕机停掉缓存实例或清空缓存缓存击穿保护、本地缓存与限流是否兜住
磁盘写满模拟日志目录写满服务是否仍能服务核心读写链路
消息堆积停止消费者一段时间后恢复堆积告警、消费速率、重复消费是否出错

演练脚本要固化下来,可重复执行:

# 示例:注入 200ms 网络延迟,验证下游超时与熔断配置(需 root 权限)
tc qdisc add dev eth0 root netem delay 200ms
# 演练结束后务必移除,否则会变成持续故障
tc qdisc del dev eth0 root netem

混沌工程工具做的事就是把这类“注入 → 观察 → 恢复”流程自动化、可控化并限定爆炸半径;工具本身不产生稳定性,没有监控与预案的演练只是制造故障

演练纪律

  • 先在生产之外的类生产环境演练;核心链路演练必须在低峰期并提前报备。
  • 每次演练设定明确的成功判据(例如“实例被摘除时间小于 30 秒”),否则无法判断是否通过。
  • 演练必须有一键终止手段和观察人,避免演练本身变成事故。
  • 演练发现的问题要和故障一样走复盘与改进闭环。

复盘要点

要素内容常见错误
时间线精确到分钟:何时开始、何时发现、何时止血、何时恢复只写大概时间,无法衡量改进效果
影响面受影响用户数、订单数、资损金额用“部分用户”含糊带过
根因直接原因与根本原因:为什么会发生、为什么没更早发现停留在“某人操作失误”
改进项每条都有人、有截止时间、有验证方式写成“加强监控”这类空话

复盘的目的是修正系统而不是追责个人,但改进项必须闭环:没有验收的改进项等于没做,下一轮演练或复盘时要逐条核对。

小结:稳定性靠监控告警、预案演练、复盘闭环三者支撑;故障响应遵循“先止血后定位”,常见演练覆盖进程、网络、依赖、数据库、缓存与消息六类;每一次演练与故障都必须产出包含时间线、根因与可验收改进项的复盘记录。

笔记加载中…