概述

故障不可避免,但故障响应的质量决定了影响范围和持续时间。一个成熟的故障响应框架能够在混乱中建立秩序——让正确的人在做正确的事,让信息流向该去的地方,让恢复速度尽可能快。

很多团队在故障发生时面临的真实场景是:告警轰炸、群消息刷屏、不知道谁在负责、重复排查同一个问题、对外信息不一致、故障恢复后说不清楚做了什么。这些问题的根因不是技术能力不足,而是缺乏结构化的响应框架。

从故障分级、响应角色分工、escalation 路径设计、通信模板、时间线记录到恢复策略,详细梳理如何构建一个可执行的故障响应框架。

关于故障响应的系统方法论,可参考 Google SRE Book - Managing IncidentsAtlassian Incident Management Handbook

一、故障分级标准

为什么需要分级

没有分级的故障管理等于没有管理。如果所有故障都按最高优先级处理,结果就是没有真正的最高优先级。故障分级的本质是资源调度优先级——在有限的人力下,让最严重的故障优先获得资源。

SEV 分级标准

采用业界通行的 SEV1-SEV4 四级分类:

级别定义影响范围响应时效升级条件示例
SEV1生产服务完全不可用或核心功能失效全量或大量用户受影响,营收直接损失立即响应,<5min15min 无进展自动升级支付服务宕机、数据库不可用、核心 API 全部 5xx
SEV2核心功能严重降级部分用户受影响,业务功能受损<15min30min 无进展自动升级支付成功率下降 20%、P99 延迟劣化 5 倍
SEV3非核心功能降级或潜在风险少量用户受影响或无直接影响<30min(工作时间)无需自动升级某非核心服务异常、磁盘水位 80%
SEV4优化建议或已知问题无用户影响下一工作日无需升级告警阈值优化、文档补充

分级判定要素

故障分级需要考虑多个维度,不是单一指标决定的:

# 故障分级判定矩阵
severity_matrix:
  dimensions:
    - user_impact:        # 用户影响
        none: 0
        minimal: 1        # <1% 用户受影响
        moderate: 2       # 1-10% 用户受影响
        significant: 3    # 10-50% 用户受影响
        severe: 4         # >50% 用户受影响
    
    - business_impact:    # 业务影响
        none: 0
        low: 1            # 非核心功能,无营收影响
        medium: 2         # 核心功能降级,营收轻微影响
        high: 3           # 核心功能失效,营收明显损失
        critical: 4       # 全站不可用,营收严重损失
    
    - duration:           # 持续时间(已持续或预计)
        unknown: 3        # 未知持续时间按高风险处理
        brief: 1          # <5 分钟
        short: 2          # 5-30 分钟
        medium: 3         # 30 分钟 - 2 小时
        long: 4           # >2 小时

  # 最高维度决定 SEV 级别
  rule: "max(user_impact, business_impact) + duration_bonus"
  # duration_bonus: 如果持续时间 > 预期,SEV 上调一级

自动分级

理想状态下,故障级别应该能通过告警规则自动确定:

# Prometheus 告警自动分级
groups:
  - name: incident-severity
    rules:
      # SEV1: 核心服务完全不可用
      - alert: SEV1CriticalServiceDown
        expr: |
          up{job="payment-service",env="production"} == 0          
        for: 1m
        labels:
          severity: SEV1
          page: true
          escalation: true
          auto_bridge: true       # 自动创建电话会议
        annotations:
          summary: "支付服务完全不可用"
          impact: "全量用户无法支付,营收直接损失"
          runbook: "https://wiki/runbooks/payment-service-down"
          ic_rotation: "primary-oncall"

      # SEV2: 错误率超标
      - alert: SEV2HighErrorRate
        expr: |
          sum(rate(http_requests_total{job="payment-service",status=~"5.."}[5m]))
          /
          sum(rate(http_requests_total{job="payment-service"}[5m])) > 0.05          
        for: 2m
        labels:
          severity: SEV2
          page: true
          escalation: false
        annotations:
          summary: "支付服务错误率超过 5%"
          impact: "部分用户支付失败"
          runbook: "https://wiki/runbooks/high-error-rate"

      # SEV3: 资源水位告警
      - alert: SEV3DiskUsageHigh
        expr: |
          (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 80          
        for: 5m
        labels:
          severity: SEV3
          page: false
          notify: "#alerts-warn"
        annotations:
          summary: "磁盘使用率超过 80%"
          runbook: "https://wiki/runbooks/disk-cleanup"

分级调整

故障级别不是一成不变的。随着事态发展,需要动态调整:

场景:SEV3 磁盘告警
  → 排查发现磁盘即将满 → 服务可能崩溃
  → 升级为 SEV2
  → 磁盘满了,服务开始报错
  → 升级为 SEV1

调整规则

  • 任何参与响应的人都可以建议调整级别
  • 最终决定权在 Incident Commander(IC)
  • 级别调整需要广播通知所有响应者
  • 升级比降级更安全——宁可过度响应也不要响应不足

二、响应角色分工

核心角色

故障响应中需要明确以下角色,每个角色有清晰的职责边界:

角色缩写职责人选要求
Incident CommanderIC统一指挥,做决策,协调资源有经验的高级 SRE/技术负责人
Operations LeadOps执行技术操作,排查和修复On-Call 工程师
Communications LeadComms对内对外沟通,发布状态更新技术背景的沟通人员/PM
Scribe记录员记录时间线、决策、操作任何可以打字快的人
Subject Matter ExpertSME提供特定领域的技术判断相关服务的负责人

角色之间的关系

                    ┌──────────────┐
                    │     IC       │  ← 统一指挥,不做具体操作
                    │  指挥官      │
                    └──────┬───────┘
              ┌────────────┼────────────┐
              │            │            │
       ┌──────▼──────┐ ┌──▼───┐ ┌──────▼──────┐
       │    Ops      │ │Scribe│ │   Comms     │
       │  操作执行    │ │记录员│ │  通信联络    │
       └──────┬──────┘ └──────┘ └─────────────┘
       ┌──────▼──────┐
       │    SME      │  ← 按需介入,提供专业判断
       │  领域专家    │
       └─────────────┘

关键原则:IC 不做具体操作。 IC 的注意力应该在全局——决策、协调、评估风险。如果 IC 在敲命令排查问题,就没有人在看全局。

各角色详细职责

Incident Commander(IC)

IC 是故障响应的灵魂角色。不一定是技术最强的人,但必须是最能做决策和协调的人。

IC 的核心职责

  1. 确认故障并定级:收到告警后,快速评估影响并确定 SEV 级别
  2. 组建响应团队:召集需要的角色——Ops、Comms、SME
  3. 制定恢复策略:决定先做什么后做什么,权衡风险
  4. 协调资源:调用其他团队、申请额外资源
  5. 控制节奏:避免混乱,确保每个操作有明确指令和确认
  6. 决定升级:判断是否需要升级故障级别或请求更多支援
  7. 宣布恢复:确认故障已恢复,结束响应

IC 的行为规范

ic_principles:
  do:
    - "保持全局视角,不陷入细节"
    - "明确指令:谁在什么时间做什么"
    - "定期同步进展:每 15 分钟更新一次状态"
    - "鼓励信息共享:'如果你发现了什么,告诉我'"
    - "做决策并承担后果:'我们先回滚,再看原因'"
    
  dont:
    - "不要亲自执行技术操作"
    - "不要让多个人同时操作同一个系统"
    - "不要在没有确认的情况下执行不可逆操作"
    - "不要忽略任何人的信息——哪怕看起来不重要"

Operations Lead(Ops)

Ops 是执行者,负责具体的技术操作。

Ops 的核心职责

  1. 执行排查:按照 IC 的指令或 Runbook 排查问题
  2. 执行修复:执行回滚、重启、扩容、限流等操作
  3. 反馈结果:每一步操作后立即向 IC 报告结果
  4. 建议方案:基于技术判断向 IC 建议恢复方案

Ops 的工作方式

IC: "先检查最近的变更记录"
Ops: "10:00 有一位开发者提交了配置变更,修改了数据库连接超时时间"
IC: "回滚这个变更"
Ops: "正在回滚...回滚完成,错误率开始下降"
Ops: "错误率已恢复正常,P99 延迟回落到 180ms"
IC: "好,观察 10 分钟确认稳定"

Communications Lead(Comms)

Comms 负责所有对内对外的沟通。在大规模故障中,沟通本身就是一个全职工作。

Comms 的核心职责

  1. 对内同步:定期向公司内部同步故障状态
  2. 对外公告:通过状态页、社交媒体向用户发布通知
  3. 管理层汇报:向技术管理层汇报故障进展
  4. 过滤信息:把技术细节翻译成业务语言

对内通信模板

## [SEV1] 支付服务不可用 - 状态更新 #3

**时间**:2026-07-10 15:00
**级别**:SEV1
**状态**:排查中

### 当前情况
支付服务于 14:30 开始出现大量 5xx 错误,目前已影响约 15% 的支付请求。
SRE 团队已介入排查,初步判断与 14:00 的一次数据库配置变更有关。

### 正在执行
- 正在回滚数据库配置变更
- 预计 15 分钟内恢复

### 影响评估
- 受影响用户:约 15% 的支付请求失败
- 预计营收影响:约 XX 万元/小时
- 数据影响:无数据丢失

### 下次更新
15:15

对外状态页公告

## 服务异常 - 支付功能

我们检测到部分用户在使用支付功能时遇到问题。我们的技术团队正在紧急处理中。

**影响范围**:部分用户的支付请求可能失败
**开始时间**:2026-07-10 14:30 UTC+8
**当前状态**:排查中

我们将每 15 分钟更新一次进展。感谢您的耐心等待。

---
2026-07-10 14:35 - 问题已确认,团队正在处理
2026-07-10 14:50 - 已定位问题,正在执行修复
2026-07-10 15:05 - 修复已执行,正在验证恢复
2026-07-10 15:15 - 服务已恢复正常

Scribe(记录员)

Scribe 的职责是记录故障期间的所有关键信息,为事后复盘提供原始素材。

Scribe 需要记录的内容

# 故障时间线记录

## 基本信息
- 故障 ID:INC-2026-0710-001
- 级别:SEV1
- 开始时间:14:30
- 恢复时间:15:15
- 持续时间:45 分钟
- IC:张三
- Ops:李四
- Comms:王五

## 时间线

| 时间 | 事件 | 操作人 | 来源 |
|------|------|--------|------|
| 14:30 | Prometheus 告警:支付服务错误率 >5% | 自动告警 | AlertManager |
| 14:32 | 张三响应告警,确认为 SEV1 | 张三 | IM 群 |
| 14:33 | 张三组建响应团队:IC=张三, Ops=李四, Comms=王五 | 张三 | 电话会议 |
| 14:35 | 李四开始排查,检查 Grafana 监控 | 李四 | 操作记录 |
| 14:37 | 李四发现数据库连接数异常 | 李四 | Grafana |
| 14:40 | 李四检查变更记录,发现 14:00 的数据库配置变更 | 李四 | Git log |
| 14:42 | IC 决定回滚配置变更 | 张三 | 电话会议 |
| 14:45 | 李四执行回滚 | 李四 | kubectl |
| 14:48 | 错误率开始下降 | 李四 | Grafana |
| 14:52 | 错误率恢复正常,P99 延迟仍偏高 | 李四 | Grafana |
| 15:00 | 延迟恢复正常 | 李四 | Grafana |
| 15:05 | 观察 5 分钟,确认稳定 | 张三 | - |
| 15:15 | IC 宣布故障恢复 | 张三 | IM 群 |

角色轮换

长时间故障(>2 小时)需要轮换响应人员,避免疲劳导致判断失误:

故障持续 >2 小时:
  → IC 交接给备班 IC
  → Ops 交接给备班 Ops
  → 交接时做 5 分钟简报:当前状态、正在做什么、下一步计划
  → 交出方休息至少 4 小时后再回来

故障持续 >6 小时:
  → 全员轮换
  → 考虑请求跨团队支援

三、Escalation 路径设计

Escalation 的触发条件

Escalation(升级)不是"我搞不定了才找人帮忙",而是在明确条件下自动触发的资源调度:

触发条件Escalation 目标延迟
SEV1 告警Primary On-Call立即
Primary 5 分钟未响应Secondary On-Call+5min
Secondary 5 分钟未响应SRE 负责人+10min
SEV1 15 分钟无进展服务负责人 + 技术总监+15min
SEV1 30 分钟未恢复CTO+30min
影响超过 50% 用户全管理层立即

Escalation 矩阵

# Escalation 矩阵
escalation_matrix:
  SEV1:
    step_1:
      delay: 0min
      targets:
        - role: "Primary On-Call"
          contact: "phone + pagerduty"
          timeout: 5min
    
    step_2:
      delay: 5min   # Primary 未响应
      targets:
        - role: "Secondary On-Call"
          contact: "phone + pagerduty"
          timeout: 5min
    
    step_3:
      delay: 10min  # Secondary 未响应
      targets:
        - role: "SRE Team Lead"
          contact: "phone"
          timeout: 5min
    
    step_4:
      delay: 15min  # 仍无进展
      targets:
        - role: "Service Owner"
          contact: "phone"
        - role: "Engineering Director"
          contact: "phone + im"
    
    step_5:
      delay: 30min  # 仍未恢复
      targets:
        - role: "CTO"
          contact: "phone"
    
    step_6:
      delay: 60min  # 长时间未恢复
      targets:
        - role: "All Hands"
          contact: "mass notification"
  
  SEV2:
    step_1:
      delay: 0min
      targets:
        - role: "Primary On-Call"
          contact: "pagerduty + im"
          timeout: 15min
    
    step_2:
      delay: 15min
      targets:
        - role: "Secondary On-Call"
          contact: "pagerduty + phone"
    
    step_3:
      delay: 30min   # 无进展
      targets:
        - role: "SRE Team Lead"
          contact: "im"
  
  SEV3:
    step_1:
      delay: 0min
      targets:
        - role: "On-Call"
          contact: "im only"
      # 工作时间内处理,不电话呼叫

Escalation 的执行原则

  1. 自动优先:使用 PagerDuty/Opsgenie 等工具实现自动 escalation,不依赖人工判断
  2. 宁早勿晚:不确定是否该升级时,升级。延迟升级的代价通常远大于过度升级
  3. 信息完整:每次 escalation 都要携带完整的上下文——故障摘要、当前状态、已尝试的方案
  4. 不中断响应:升级是增加资源,不是换人——被升级的人加入响应,原响应者继续工作

Escalation 通知模板

# Escalation 通知模板

## SEV1 Escalation: 支付服务不可用

**故障摘要**:支付服务自 14:30 起出现大量 5xx 错误,约 15% 用户受影响
**当前状态**:已排查 15 分钟,定位到数据库配置变更,回滚中
**已尝试方案**1. 检查服务日志 - 发现数据库连接超时
2. 检查变更记录 - 14:00 有数据库配置变更
3. 正在回滚配置

**需要帮助**:需要 DBA 团队确认回滚方案是否安全
**IC**:张三
**电话会议**:https://meet.example.com/incident-001
**时间线文档**:https://wiki/incidents/INC-2026-0710-001

四、通信模板与规范

通信渠道设计

故障期间的通信需要分渠道、分受众:

渠道受众内容频率
电话会议/War Room响应团队技术讨论、决策、操作指令持续在线
IM 群(#incident-xxx)响应团队 + 相关方技术细节、操作记录实时
IM 群(#company-status)全公司非技术性的状态更新每 15-30 分钟
状态页(status.example.com)外部用户用户友好的故障通知每 15-30 分钟
社交媒体外部用户简短故障通知重大故障时
邮件管理层 + 关键客户详细影响评估重大故障时

War Room 规范

War Room 是故障响应的指挥中心,可以是物理会议室或虚拟电话会议。

War Room 规则:
  1. 只有响应角色进入 War Room(IC, Ops, Comms, Scribe, SME)
  2. 其他人通过 IM 群获取信息,不进入 War Room
  3. War Room 内只讨论当前故障,不讨论其他话题
  4. 所有操作指令通过 IC 下达,不自行操作
  5. 所有关键决策和操作由 Scribe 记录

状态更新模板

# 故障状态更新模板

## [SEV级别] 故障标题 - 更新 #N

**时间**:YYYY-MM-DD HH:MM
**级别**:SEVX
**状态**:[排查中/处理中/恢复中/已恢复]
**持续时间**:XX 分钟

### 当前情况
[一段话描述当前状态]

### 影响范围
- 受影响用户:[百分比/数量]
- 受影响功能:[列出]
- 业务影响:[量化]

### 正在执行
1. [当前操作 1]
2. [当前操作 2]

### 下一步计划
1. [计划操作 1]
2. [计划操作 2]

### 预计恢复时间
[预计时间或"无法预估"]

### 下次更新
[时间]

通信纪律

communication_discipline:
  war_room:
    - "只说与故障相关的事"
    - "大声说出来——即使你认为不重要"
    - "如果有疑问,直接问 IC"
    - "操作前声明,操作后确认"
    
  im_channel:
    - "只有 Comms 角色发状态更新"
    - "技术讨论用线程回复"
    - "不要在群里刷屏——重要信息会被淹没"
    - "截图要带时间戳"
    
  examples:
    good:
      - "Ops: 我在 server-01 上执行了回滚,错误率从 15% 降到 2%"
      - "IC: 收到。李四,继续观察 5 分钟。王五,发一次状态更新。"
    bad:
      - "Ops: 我觉得可能是数据库的问题"  # ← 没有依据的猜测
      - "某人: 天啊又挂了!!!"          # ← 情绪化发言
      - "某人: 这个问题上次也出现过"      # ← 无助于当前恢复

五、时间线记录

为什么时间线很重要

时间线记录在故障响应中经常被忽视——因为大家都忙着解决问题,没人想停下来写记录。但时间线是事后复盘的基石,没有准确的时间线,复盘就变成了"各说各话"。

时间线的三个用途:

  1. 实时参考:帮助 IC 和响应者了解"我们做了什么、结果如何"
  2. 事后复盘:Postmortem 的核心素材
  3. 合规审计:某些行业要求保留故障记录用于审计

时间线记录工具

# 时间线记录工具选择
timeline_tools:
  real_time:
    - tool: "专用 Incident 管理工具(如 FireHydrant, Rootly)"
      pros: "结构化,自动关联告警和变更"
      cons: "需要预先部署和集成"
    
    - tool: "Google Doc / 协作文档"
      pros: "零部署成本,所有人可同时编辑"
      cons: "非结构化,需要人工整理"
    
    - tool: "IM 群消息 + Bot"
      pros: "响应者已在用 IM,无额外操作"
      cons: "信息分散,需要后期整理"

  recommended: "IM 群 + Bot 自动记录,同时用协作文档做结构化整理"

自动化时间线收集

# 从多个数据源自动收集时间线事件
class TimelineCollector:
    def __init__(self, incident_id):
        self.incident_id = incident_id
        self.events = []

    def collect_from_alertmanager(self, start_time, end_time):
        """从 AlertManager 收集告警事件"""
        alerts = query_alertmanager(start_time, end_time)
        for alert in alerts:
            self.events.append({
                "time": alert["starts_at"],
                "type": "alert",
                "description": alert["annotations"]["summary"],
                "source": "AlertManager"
            })

    def collect_from_git(self, start_time, end_time):
        """从 Git 收集变更事件"""
        commits = query_git_log(start_time, end_time)
        for commit in commits:
            self.events.append({
                "time": commit["timestamp"],
                "type": "change",
                "description": f"代码变更: {commit['message']} ({commit['author']})",
                "source": "Git"
            })

    def collect_from_ci_cd(self, start_time, end_time):
        """从 CI/CD 收集部署事件"""
        deploys = query_deployments(start_time, end_time)
        for deploy in deploys:
            self.events.append({
                "time": deploy["timestamp"],
                "type": "deploy",
                "description": f"部署: {deploy['service']} {deploy['version']}",
                "source": "CI/CD"
            })

    def collect_from_chat(self, incident_channel, start_time):
        """从 IM 群收集人工记录"""
        messages = query_chat_history(incident_channel, start_time)
        for msg in messages:
            if msg.get("type") in ["action", "decision", "finding"]:
                self.events.append({
                    "time": msg["timestamp"],
                    "type": msg["type"],
                    "description": msg["text"],
                    "source": msg["user"]
                })

    def generate_timeline(self):
        """生成排序后的时间线"""
        return sorted(self.events, key=lambda x: x["time"])

时间线记录规范

好的时间线记录:
  14:35  检查 Grafana 监控,发现数据库连接数从 50 飙升到 500  [李四]
  14:37  确认连接数飙升与 14:00 的配置变更时间吻合            [李四]
  14:42  IC 决定回滚配置变更                                  [张三]
  14:45  执行 kubectl rollout undo deployment/payment-svc     [李四]
  14:48  错误率从 15% 降至 2%                                [李四]

不好的时间线记录:
  14:35  看了一下监控                  ← 看了什么?发现了什么?
  14:42  决定回滚                      ← 谁决定的?为什么?
  14:45  操作了                        ← 操作了什么?在哪个系统?

六、恢复策略

恢复优先级:先恢复,后修复

故障响应的第一原则是尽快恢复服务,而不是找到根因后再修复。

错误做法:
  故障发生 → 找根因 → 找了 30 分钟 → 找到了 → 修复 → 恢复
  总时间:45 分钟

正确做法:
  故障发生 → 快速评估 → 回滚最近的变更 → 恢复 → 再找根因
  总时间:10 分钟

恢复策略决策树

故障发生
  ├─ 最近 30 分钟内有变更?
  │   ├─ 是 → 回滚变更 → 观察是否恢复
  │   │         ├─ 恢复 → 故障结束,事后分析根因
  │   │         └─ 未恢复 → 继续排查
  │   │
  │   └─ 否 → 检查监控指标
  │             │
  │             ├─ 资源耗尽(CPU/内存/磁盘/连接)?
  │             │   → 扩容/清理/重启 → 观察是否恢复
  │             │
  │             ├─ 依赖服务异常?
  │             │   → 切换备用依赖/降级功能 → 观察是否恢复
  │             │
  │             ├─ 流量异常(突发流量/攻击)?
  │             │   → 限流/WAF 拦截 → 观察是否恢复
  │             │
  │             └─ 无明显线索
  │                 → 重启服务(最后手段)→ 观察是否恢复
  │                 → 如果仍未恢复,按 escalation 升级

常见恢复策略

策略适用场景操作风险
回滚变更导致的故障kubectl rollout undo低(如果变更前正常)
扩容容量不足HPA 扩容或手动加节点
降级部分功能故障关闭非核心功能,保核心中(用户体验降低)
限流流量过大调低限流阈值中(部分用户被拒)
重启服务卡死kubectl delete pod中(短暂中断)
切流单机房故障切换到备用机房高(需要多活架构支持)
回滚数据数据损坏恢复数据库备份高(可能丢失数据)

恢复验证

故障"看起来恢复了"不等于"真的恢复了"。需要系统性地验证:

# 恢复验证检查清单
recovery_verification:
  technical_checks:
    - "错误率已降至正常水平(<0.1%)"
    - "延迟恢复到 SLO 以内(P99 < 200ms)"
    - "所有 Pod 处于 Running 状态"
    - "数据库连接数恢复正常"
    - "队列积压已消化"
  
  business_checks:
    - "用户投诉量下降到正常水平"
    - "核心业务指标恢复正常(如下单成功率 >99.9%)"
    - "客服团队确认用户反馈正常"
  
  monitoring_checks:
    - "告警已自动清除"
    - "监控仪表盘各项指标正常"
    - "黑盒监控探测通过"
  
  observation_period:
    duration: "10-15 分钟"
    purpose: "确认不是间歇性恢复"
    action: "IC 宣布故障恢复后,继续观察 30 分钟"

故障后的收尾

故障恢复后的收尾步骤:

1. IC 宣布故障恢复(IM 群 + 电话会议)
2. Comms 发布恢复公告(状态页 + IM 群)
3. Scribe 完成时间线定稿
4. IC 确认所有响应人员可以休息
5. 创建 Postmortem 工单,设定复盘日期(3-5 个工作日内)
6. 如果是 SEV1/SEV2,24 小时内提交初步 Postmortem
7. 如果有临时修复措施(如降级某功能),记录待后续彻底修复

七、故障响应演练

演练的必要性

故障响应框架不能等到真故障时才第一次使用。定期演练能发现流程中的问题,让团队在真实故障时更从容。

演练类型

类型方式频率目的
桌面推演讨论式,模拟故障场景,口头走流程每季度验证流程和角色分工
功能演练模拟单个环节(如 escalation 通知)每月验证工具链和通知链路
红蓝对抗红队注入故障,蓝队响应每半年验证端到端响应能力
混沌工程自动注入故障,验证自愈持续验证系统弹性和监控覆盖

桌面推演示例

# 故障响应桌面推演

## 场景
周五下午 17:00,支付服务突然开始返回大量 5xx 错误。同时收到客服反馈,大量用户投诉支付失败。

## 推演流程

### T+0 分钟:告警触发
- 主持人:"17:00,AlertManager 触发 SEV2 告警,支付服务错误率 8%。Primary On-Call 是谁?"
- 参与者(扮演 On-Call):"我是 Primary,我收到了告警。"

### T+2 分钟:响应启动
- 主持人:"你会做什么?"
- 参与者:"查看 Grafana 确认告警真实性,然后..."
- 主持人追问:"然后你会在多少分钟内响应?如果 5 分钟没响应怎么办?"

### T+5 分钟:定级与组建团队
- 主持人:"你确认错误率确实 8%,影响 8% 的用户。你怎么定级?"
- 参与者:"SEV2。我需要组建响应团队..."

### T+15 分钟:排查
- 主持人:"你查了监控,发现数据库连接数正常,但 Redis 延迟飙升。你会做什么?"
- 参与者:"检查 Redis 状态..."

### T+30 分钟:Escalation
- 主持人:"已经 30 分钟了,问题还没解决。此时应该做什么?"
- 参与者:"按照 escalation 矩阵,30 分钟无进展需要升级到 SRE 负责人。"

### 演练复盘
- 哪些步骤执行顺利?
- 哪些步骤卡住了?原因是什么?
- 流程/工具/沟通有什么需要改进的?

总结

故障响应框架的核心价值在于:在混乱中建立秩序。一个好的框架能让团队在压力下依然高效协作,而不是各自为战。

关键要点:

  1. 分级是基础:清晰的 SEV 分级让资源调度有据可依,自动分级减少人为延迟
  2. 角色分工是核心:IC 统一指挥不做操作,Ops 执行操作,Comms 负责沟通,Scribe 记录时间线——各司其职,不越位
  3. Escalation 要自动化:不依赖人工判断,用工具实现自动升级,宁可过度升级也不延迟升级
  4. 通信要分渠道:War Room 讨论技术,IM 群同步状态,状态页面向用户——信息流向清晰
  5. 先恢复后修复:回滚 > 降级 > 重启 > 找根因。恢复服务永远是第一优先级
  6. 时间线是基石:实时记录所有关键事件,为复盘提供事实依据
  7. 演练是保障:框架不能只在真故障时才用,定期演练才能在关键时刻运转顺畅

记住:故障响应的质量不是由技术最强的人决定的,而是由流程最清晰的人决定的。 当每个人都知道自己该做什么、该跟谁沟通、该在什么时候升级时,故障恢复就变成了一个可预期的工程过程,而不是一场混乱的救火行动。

参考资料与致谢

本文在撰写过程中参考了以下资料,感谢原作者的贡献:

  1. Google SRE Book - Managing Incidents — Google SRE 团队,参考了Google SRE Book - Managing Incidents相关内容
  2. Atlassian Incident Management Handbook — Atlassian,参考了Atlassian Incident Management Handbook相关内容