19.5.6 应急响应与故障演练流程
目标与原则#
应急响应聚焦“快速定位、稳定止损、恢复服务、复盘改进”,以业务影响为核心度量。遵循分级响应、最小化变更、证据留存、沟通透明、演练驱动改进的原则。
组织角色与职责#
- 值班/On-Call:首响应与初步研判,执行标准操作。
- 应急指挥(Incident Commander):统一决策、协调资源、确定优先级。
- 技术专家:负责定位与修复方案评估。
- 沟通联络:面向业务与客户沟通状态与预期。
- 记录员:时间线记录、关键证据归档。
示例:战情室角色分配记录模板
# /opt/incident/room-20240115.txt
INCIDENT_ID=INC-20240115-001
SEVERITY=P1
IC=张三
ONCALL=李四
SRE=王五
COMMS=赵六
SCRIBER=钱七
事件分级与响应SLA#
- P0:全站不可用/重大数据风险,TTR目标分钟级,启动全员响应。
- P1:核心功能不可用或大面积性能劣化,TTR目标小时级。
- P2:局部功能异常或影响可控,TTR目标天级。
- P3:一般告警/潜在风险,纳入计划修复。
示例:告警到工单自动分级(伪配置)
# /etc/alert-router/rules.yaml
routes:
- match:
service: checkout
severity: critical
to: pagerduty
set:
incident_level: P0
- match:
service: api
severity: high
to: oncall
set:
incident_level: P1
标准应急流程#
- 触发与确认:告警触发→值班确认→事件分级。
- 组建战情室:拉通IM/会议、指定指挥与记录员。
- 影响评估:业务影响面、用户量、SLA损失评估。
- 快速止损:限流/降级/隔离/回滚/切流。
- 根因定位:指标、日志、链路、变更、容量、依赖关系逐一排查。
- 恢复与验证:服务恢复、关键指标回归、回归测试与观察窗口。
- 关闭与复盘:总结原因、行动项、监控补齐、流程优化。
示例:应急流程时间线记录(含关键命令)
# /opt/incident/timeline-INC-20240115-001.log
10:01 告警触发:API 5xx > 10%
10:03 值班确认:curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/health
10:05 分级:P1
10:06 组建战情室
10:08 止损:切流至备用集群(见切流命令)
10:12 依赖排查:mysql qps暴涨
常用止损与恢复手段#
- 降级与限流:熔断关键依赖,保障核心路径。
- 灰度与回滚:快速回退至稳定版本。
- 流量切换:主备切换、跨机房/多集群切流。
- 资源扩容:弹性扩容、临时加节点。
- 隔离与旁路:隔离异常实例、旁路问题组件。
示例1:Nginx 临时限流止损
# /etc/nginx/conf.d/limit.conf
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=50r/s;
server {
listen 80;
location /api/ {
limit_req zone=api_limit burst=100 nodelay;
proxy_pass http://api_upstream;
}
}
nginx -t && systemctl reload nginx
# 预期:请求超限返回 503,核心接口维持可用
示例2:Kubernetes 快速回滚
kubectl -n prod rollout history deploy/api
kubectl -n prod rollout undo deploy/api --to-revision=12
kubectl -n prod rollout status deploy/api
# 预期:回滚完成,错误率下降
示例3:Keepalived 主备切换
# 通过停止主节点 keepalived 触发 VIP 漂移
systemctl stop keepalived
ip a | grep 10.0.0.100
# 预期:VIP 在备节点出现
证据与时间线管理#
- 保留关键指标快照、日志片段、链路追踪ID、配置与变更记录。
- 以时间线形式记录:检测时间、响应时间、关键决策点、恢复时间。
示例:证据打包脚本
#!/usr/bin/env bash
# /opt/incident/collect-evidence.sh
INC=$1
TS=$(date +%F_%H%M%S)
DIR=/opt/incident/$INC/$TS
mkdir -p "$DIR"
# 1) 系统信息
uname -a > "$DIR/uname.txt"
uptime > "$DIR/uptime.txt"
# 2) 资源与进程
top -b -n1 > "$DIR/top.txt"
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -50 > "$DIR/ps.txt"
# 3) 网络与连接
ss -antp > "$DIR/ss.txt"
# 4) 关键日志(最近200行)
journalctl -u nginx -n 200 > "$DIR/nginx.log"
tar -czf "/opt/incident/${INC}_${TS}.tar.gz" -C "$DIR" .
echo "Evidence packed: /opt/incident/${INC}_${TS}.tar.gz"
演练类型与计划#
- 例行演练:按季度覆盖核心业务链路。
- 压力与容量演练:验证高峰与突发负载。
- 故障注入:网络抖动、节点宕机、依赖异常、磁盘满、配置错误。
- 变更演练:演练回滚与跨版本兼容。
示例:年度演练计划表
| 季度 | 目标场景 | 负责人 | 验收指标 |
|---|---|---|---|
| Q1 | 网络抖动+服务降级 | SRE | 5xx<1%,MTTR<30m |
| Q2 | 数据库只读切换 | DBA | 业务可写切换<5m |
| Q3 | 机房单点故障 | 平台 | 切流<10m |
| Q4 | 全链路压力 | 架构 | 峰值QPS通过 |
演练流程#
- 设计场景与预期指标。
- 评审风险与回滚方案。
- 执行故障注入与观察。
- 验证告警触达与响应链路。
- 复盘优化与知识沉淀。
示例:网络抖动故障注入(Linux)
# 对 eth0 注入 200ms 延迟、10% 丢包
tc qdisc add dev eth0 root netem delay 200ms loss 10%
# 验证
ping -c 5 8.8.8.8
# 恢复
tc qdisc del dev eth0 root
示例:磁盘占满演练
# 生成大文件模拟磁盘占满
fallocate -l 5G /var/log/bigfile.test
df -h /var/log
# 观察告警触发
# 清理恢复
rm -f /var/log/bigfile.test
复盘与改进机制#
- 五个为什么分析根因,区分技术原因与流程原因。
- 建立行动项清单:负责人、期限、验收标准。
- 监控补齐:新增指标、告警规则、自动化修复脚本。
- 变更治理:灰度策略、审批与回滚标准化。
示例:复盘行动项模板
| Action | Owner | Due | 验收标准 |
|---|---|---|---|
| 增加数据库连接池耗尽告警 | DBA | 2024-01-31 | 连接数>80%告警 |
| 增加回滚脚本 | SRE | 2024-02-05 | 10分钟内可回滚 |
关键指标与度量#
- MTTD(发现时间)、MTTR(恢复时间)、误报率、漏报率。
- 演练覆盖率、行动项关闭率、复发率。
示例:Prometheus 查询与目标
# 近1小时平均恢复时间(示意)
avg_over_time(incident_mttr_minutes[1h])
# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
知识库与标准化#
- 建立故障案例库、标准操作手册(SOP)、值班手册。
- 常见问题快速定位指南与一键应急工具沉淀。
示例:SOP 片段(Nginx 502 排查)
# 1) 检查上游是否存活
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/health
# 2) 查看上游连接
ss -antp | grep 8080 | head
# 3) 查看错误日志
tail -n 100 /var/log/nginx/error.log
典型风险点检查清单#
- 监控空白与告警静默失效。
- 依赖不可用与超时策略。
- 容量与资源阈值设置不合理。
- 变更未审计、回滚路径缺失。
示例:检查脚本
#!/usr/bin/env bash
# /opt/incident/risk-check.sh
echo "== Alerts =="
grep -R "silence" /etc/alertmanager/ | head
echo "== Capacity =="
df -h | awk '$5+0 > 80 {print $0}'
echo "== Recent Changes =="
grep -R "changed" /var/log/ansible.log | tail -20
排错与实战示例#
场景:API 5xx 激增
# 1) 快速确认
curl -s -o /dev/null -w "%{http_code}\n" https://api.example.com/health
# 2) 查看负载与进程
top -b -n1 | head -20
ps -eo pid,cmd,%cpu,%mem --sort=-%cpu | head
# 3) 连接与端口
ss -antp | grep 8080 | head
# 4) 应用日志
journalctl -u api-service -n 200 --no-pager
解释:
curl验证服务状态;top/ps定位高CPU/内存进程;ss确认连接数是否异常;journalctl查看服务报错与堆栈。
练习#
- 使用
tc netem在测试机注入 100ms 延迟,观察告警触达时间并记录 MTTD。 - 通过
kubectl rollout undo回滚一次部署,验证回滚耗时与恢复指标。 - 编写一个证据收集脚本,包含
top/ss/journalctl输出并打包归档。