生产应急响应专家
何时使用此技能
- •🚨 生产环境故障告警
- •📉 服务性能突然下降
- •🔥 用户反馈大量错误
- •💥 部署后异常
- •🔄 需要紧急回滚
应急响应流程
第一阶段:快速响应(0-5分钟)
code
收到告警 ↓ 1. 确认故障 - 检查监控面板确认影响范围 - 验证是否误报 - 确定优先级(P0-P4) ↓ 2. 启动应急 - 拉应急群/频道 - 指定事件指挥官(IC) - 通知相关人员 ↓ 3. 止损优先 - 能回滚先回滚 - 限流/降级 - 切换备用系统
关键原则:先止损,后排查
第二阶段:故障定位(5-30分钟)
快速诊断检查表
bash
# 1. 服务状态 kubectl get pods -n production systemctl status myapp docker ps | grep myapp # 2. 错误日志(最近5分钟) tail -n 1000 /var/log/app/error.log journalctl -u myapp --since "5 minutes ago" kubectl logs -n production deployment/myapp --tail=100 # 3. 资源使用 top -b -n 1 | head -20 free -h df -h # 4. 网络连接 netstat -antp | grep ESTABLISHED | wc -l ss -s # 5. 数据库状态 # MySQL mysql -e "SHOW PROCESSLIST" | wc -l mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "LATEST DETECTED DEADLOCK" # PostgreSQL psql -c "SELECT count(*) FROM pg_stat_activity" psql -c "SELECT * FROM pg_stat_activity WHERE state = 'active'" # 6. 外部依赖 curl -I https://api.third-party.com/health dig api.third-party.com
常见问题模式识别
| 症状 | 可能原因 | 快速验证 |
|---|---|---|
| 所有请求 5xx | 服务挂了/OOM | ps aux | grep app |
| 部分请求超时 | 数据库慢查询/连接池耗尽 | SHOW PROCESSLIST |
| 突然流量暴增 | 营销活动/爬虫/DDoS | tail -f access.log |
| 特定接口报错 | 代码 bug/配置错误 | grep ERROR app.log |
| 间歇性失败 | 网络抖动/依赖服务不稳定 | ping/查看第三方状态页 |
| CPU/内存持续升高 | 内存泄漏/死循环 | jstack/pprof |
第三阶段:应急操作
1. 快速回滚
Kubernetes
bash
# 查看部署历史 kubectl rollout history deployment/myapp -n production # 回滚到上一版本 kubectl rollout undo deployment/myapp -n production # 回滚到指定版本 kubectl rollout undo deployment/myapp -n production --to-revision=3 # 监控回滚状态 kubectl rollout status deployment/myapp -n production
Docker Compose
bash
# 使用之前的镜像版本 docker-compose pull # 拉取上个稳定版 docker-compose up -d --no-deps --build myapp
Git + 自动部署
bash
# 回滚代码 git revert <commit-hash> git push origin main # 或强制回退(谨慎) git reset --hard <last-good-commit> git push --force origin main
使用回滚检查清单:参见 templates/rollback-checklist.md
2. 临时缓解措施
限流
bash
# Nginx 限流 # 编辑 nginx.conf limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s; limit_req zone=api burst=20; nginx -t && nginx -s reload
熔断/降级
python
# 代码层面(示例)
if is_under_high_load():
return {"status": "degraded", "message": "非核心功能暂时不可用"}
切流量
bash
# 修改 DNS/负载均衡器 # 将流量切到备用集群 aws elbv2 modify-listener --listener-arn <arn> --default-actions <backup-target>
扩容
bash
# Kubernetes 快速扩容 kubectl scale deployment/myapp --replicas=10 -n production # 自动扩容 kubectl autoscale deployment/myapp --min=3 --max=20 --cpu-percent=70
第四阶段:根因分析(故障恢复后)
使用 5 Whys 方法:
code
问题:用户登录失败率达到 80% Why 1: 为什么登录失败? → 数据库连接超时 Why 2: 为什么数据库连接超时? → 连接池耗尽(最大100,全部占用) Why 3: 为什么连接池耗尽? → 某个查询执行时间过长(30s+) Why 4: 为什么查询执行时间过长? → 缺少索引,全表扫描1000万条数据 Why 5: 为什么缺少索引? → 新功能上线时未进行性能测试,未review SQL 根因:缺少发布前性能测试流程
使用根因分析模板:参见 templates/incident-report.md
第五阶段:事后总结(24小时内)
Postmortem 会议:
- •时间轴回顾
- •影响评估(用户数、时长、损失)
- •做得好的地方
- •需要改进的地方
- •Action Items(具体责任人+截止日期)
使用事后总结模板:参见 templates/postmortem.md
故障分级
| 级别 | 定义 | 响应时间 | 示例 |
|---|---|---|---|
| P0 | 核心业务完全不可用 | 立即 | 支付系统宕机 |
| P1 | 核心功能严重受损 | 15分钟 | 50%用户无法登录 |
| P2 | 部分功能不可用 | 1小时 | 消息推送失败 |
| P3 | 体验下降,但可正常使用 | 4小时 | 页面加载慢 |
| P4 | 小范围影响或非功能性问题 | 1个工作日 | 某个边缘功能偶尔报错 |
沟通模板
初始通知(5分钟内)
code
🚨 故障通知 [P0] 时间:2026-01-23 14:32 影响:用户登录功能不可用 范围:全部用户 状态:正在处理 当前行动: - 已启动应急响应 - 正在执行回滚 预计恢复时间:15:00 负责人:@张三
进度更新(每15-30分钟)
code
📊 进度更新 #2 时间:2026-01-23 14:50 状态:部分恢复 最新进展: ✅ 已回滚到上一版本 ✅ 50%用户恢复正常 🔄 正在清理错误数据 下一步: - 15:00 完成剩余用户恢复 - 15:15 确认所有服务正常 负责人:@张三
恢复通知
code
✅ 故障已恢复 时间:2026-01-23 15:10 持续时长:38分钟 影响用户:约10万 解决方案: - 回滚到 v2.3.1 - 修复数据库连接配置 - 清理异常数据 后续行动: - 今日 18:00 Postmortem 会议 - 3日内完成根因分析报告 - 1周内完成预防措施 感谢大家的配合! 负责人:@张三
使用沟通模板:参见 templates/communication-template.md
应急工具箱
监控快速查看
bash
# Grafana 直达链接(准备好书签)
https://grafana.company.com/d/prod-overview
https://grafana.company.com/d/database-metrics
https://grafana.company.com/d/api-latency
# 日志查询
https://kibana.company.com/app/discover
https://sentry.io/organizations/company/issues/
# 服务状态
kubectl get pods -A -o wide | grep -v Running
docker ps --format "{{.Names}}\t{{.Status}}"
一键诊断脚本
bash
#!/bin/bash
# emergency-check.sh
echo "=== 时间 ==="
date
echo -e "\n=== 服务状态 ==="
systemctl status myapp || docker ps | grep myapp
echo -e "\n=== 最近错误 ==="
tail -50 /var/log/app/error.log | grep ERROR
echo -e "\n=== 资源使用 ==="
echo "CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}')"
echo "内存: $(free -h | awk '/Mem:/ {print $3 "/" $2}')"
echo "磁盘: $(df -h / | awk 'NR==2 {print $5}')"
echo -e "\n=== 活跃连接 ==="
netstat -an | grep ESTABLISHED | wc -l
echo -e "\n=== 数据库连接 ==="
mysql -e "SHOW PROCESSLIST" | wc -l
预防措施检查清单
部署前
- • 代码 Review 通过
- • 自动化测试通过(覆盖率 > 80%)
- • 性能测试完成
- • 数据库变更已 Review
- • 配置文件已检查
- • 回滚方案已准备
- • 监控告警已配置
- • 金丝雀/灰度发布
系统层面
- • 自动扩缩容配置
- • 熔断/限流机制
- • 多可用区部署
- • 数据库主从/读写分离
- • 定期备份验证
- • 混沌工程演练
团队准备
- • On-call 轮值表
- • 应急流程文档
- • 权限访问就绪
- • 沟通渠道建立
- • 定期应急演练
常见错误
❌ 不要做:
- •慌乱中直接修改生产数据库
- •未通知就执行高风险操作
- •应急时尝试新方案
- •跳过验证直接发布
- •忘记记录操作步骤
✅ 应该做:
- •先止损,后分析
- •保持冷静,按流程操作
- •持续沟通,透明进展
- •详细记录所有操作
- •事后总结,避免重复