aws-doc/课程/第五阶段-监控与运维/第36天-运维综合实战.md
2026-05-08 10:24:39 +08:00

7.0 KiB
Raw Blame History

第36天运维综合实战——故障排查与应急响应

今天你将学到什么

今天是第五阶段的收尾。我们通过模拟真实的生产故障场景,把监控、日志、告警、恢复等知识串联起来,学习如何系统化地排查和解决问题。


故障排查的基本方法论

OODA 循环

军事领域的决策模型,同样适用于故障排查:

Observe观察→ Orient定位→ Decide决策→ Act行动
     ↑                                              ↓
     └──────────────── 循环 ←───────────────────────┘
  1. 观察:收集信息。看监控、看日志、看告警
  2. 定位:分析问题在哪里。是网络?应用?数据库?
  3. 决策:确定修复方案。重启?回滚?扩容?
  4. 行动:执行修复。验证是否恢复

故障场景一:网站突然变慢

用户反馈

"网站加载要 10 秒以上,之前只要 1 秒。"

排查过程

第一步:看 CloudWatch 仪表板

发现:
- ALB 的 TargetResponseTime 从 200ms 飙升到 8000ms
- EC2 的 CPU 使用率正常30%
- 内存使用率正常50%

CPU 和内存都正常,但响应很慢。问题不在计算资源。

第二步:看数据库指标

发现:
- RDS 的 DatabaseConnections 达到上限100/100
- RDS 的 ReadLatency 从 5ms 飙升到 2000ms
- 活跃查询数异常高

数据库连接数满了!新请求拿不到连接,只能等待。

第三步:看 CloudWatch Logs

在应用日志中搜索 "timeout" 或 "connection"

[ERROR] Could not get database connection from pool: timeout after 5000ms
[WARN] Slow query detected: SELECT * FROM orders WHERE status='pending' - 3500ms

找到了一个慢查询!

第四步:定位根因

查看最近的部署记录CloudTrail

发现2 小时前有一次部署,新代码中有一个查询没有加索引,
导致全表扫描。随着数据量增长,查询越来越慢,最终拖垮了连接池。

修复方案

紧急修复5 分钟内恢复):
1. 回滚到上一个版本CodeDeploy 一键回滚)
2. 验证响应时间恢复正常

根本修复(之后处理):
1. 给 orders 表的 status 字段加索引
2. 修复代码中的查询
3. 加入慢查询监控告警
4. 重新部署

故障场景二:服务完全不可用

告警触发

CloudWatch 告警ALB 的 HealthyHostCount = 0没有健康的后端实例

排查过程

第一步:检查 EC2 实例状态

发现:
- Auto Scaling Group 中有 3 台实例
- 所有实例状态都是 "running"
- 但 ALB 健康检查全部失败

实例在运行,但应用不健康。

第二步SSH 登录实例查看

发现:
- 应用进程在运行
- 但磁盘空间 100% 满了
- 应用无法写入日志文件,导致崩溃

第三步:确认原因

发现:
- 昨天开启了 DEBUG 级别日志(为了排查另一个问题)
- 忘记关闭了
- DEBUG 日志量巨大,一晚上写满了 50GB 磁盘

修复方案

紧急修复:
1. 清理旧日志文件,释放磁盘空间
2. 将日志级别改回 INFO
3. 重启应用
4. 验证健康检查通过

预防措施:
1. 设置磁盘使用率告警(> 80% 就通知)
2. 配置日志轮转logrotate自动清理旧日志
3. 将日志发送到 CloudWatch Logs不依赖本地磁盘
4. 制定规范DEBUG 日志只在开发环境开启

故障场景三:费用异常暴涨

告警触发

Budget 告警:本月费用已达预算的 300%

排查过程

第一步Cost Explorer 分析

发现:
- EC2 费用暴涨 10 倍
- 来自 us-east-1 区域
- 实例类型p3.8xlargeGPU 实例,$12/小时)

你的团队从来不用 GPU 实例,也不在 us-east-1 工作。

第二步CloudTrail 查看谁创建的

发现:
- 用户 "dev-intern" 的 Access Key 在凌晨 2 点从境外 IP 创建了 20 台 GPU 实例
- 这些实例在挖矿

账号被盗了!

修复方案

紧急修复:
1. 立刻禁用 dev-intern 的 Access Key
2. 终止所有异常的 EC2 实例
3. 检查是否有其他异常资源

安全加固:
1. 所有用户强制启用 MFA
2. 设置 IAM 策略限制可创建的实例类型
3. 设置 Service Control Policy 限制可使用的区域
4. 启用 GuardDuty 检测异常行为
5. 联系 AWS Support 申请费用减免

应急响应流程

标准化的应急流程

1. 发现Detection
   - 监控告警触发
   - 用户报告问题
   - 自动化检测发现异常

2. 响应Response
   - 确认问题严重程度
   - 通知相关人员
   - 组建应急小组

3. 缓解Mitigation
   - 执行紧急修复(回滚、扩容、切换)
   - 目标:尽快恢复服务,不一定要找到根因

4. 恢复Recovery
   - 确认服务完全恢复
   - 验证数据完整性
   - 监控是否有复发

5. 复盘Post-mortem
   - 时间线:什么时候发生了什么
   - 根因分析:为什么会发生
   - 改进措施:怎么防止再次发生
   - 不追责,重改进

应急工具箱

场景 工具 操作
应用出错 CodeDeploy 一键回滚到上一版本
流量暴涨 Auto Scaling 手动调高最大实例数
数据库过载 RDS 添加只读副本分担压力
安全事件 IAM 禁用被盗账号的凭证
区域故障 Route 53 切换 DNS 到备用区域

运维最佳实践总结

事前准备

  1. 完善的监控:关键指标都有监控和告警
  2. 自动化恢复:能自动恢复的不要等人工
  3. 定期演练:模拟故障,验证恢复流程
  4. 文档化:常见问题的排查步骤写成 Runbook
  5. 备份验证:定期验证备份能否成功恢复

事中响应

  1. 先恢复,后排查:用户体验优先
  2. 沟通透明:及时通知相关方进展
  3. 记录时间线:为复盘留下证据
  4. 避免二次故障:修复操作要谨慎

事后改进

  1. 无责复盘:关注系统改进,不追究个人
  2. 改进措施落地:每次复盘的改进项要有人跟进
  3. 分享经验:让整个团队从故障中学习

今天的小测验

  1. 网站变慢时,排查的第一步应该看什么?
  2. 为什么说"先恢复,后排查"
  3. 如果发现 AWS 账号被盗,应该立刻做什么?
  4. 故障复盘的目的是什么?为什么强调"无责"

延伸阅读


明天预告

进入第六阶段:进阶与认证。明天开始学习 AWS 认证考试的准备策略,以及如何系统化地复习前面学到的所有知识。