7.0 KiB
7.0 KiB
第36天:运维综合实战——故障排查与应急响应
今天你将学到什么
今天是第五阶段的收尾。我们通过模拟真实的生产故障场景,把监控、日志、告警、恢复等知识串联起来,学习如何系统化地排查和解决问题。
故障排查的基本方法论
OODA 循环
军事领域的决策模型,同样适用于故障排查:
Observe(观察)→ Orient(定位)→ Decide(决策)→ Act(行动)
↑ ↓
└──────────────── 循环 ←───────────────────────┘
- 观察:收集信息。看监控、看日志、看告警
- 定位:分析问题在哪里。是网络?应用?数据库?
- 决策:确定修复方案。重启?回滚?扩容?
- 行动:执行修复。验证是否恢复
故障场景一:网站突然变慢
用户反馈
"网站加载要 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.8xlarge(GPU 实例,$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 到备用区域 |
运维最佳实践总结
事前准备
- 完善的监控:关键指标都有监控和告警
- 自动化恢复:能自动恢复的不要等人工
- 定期演练:模拟故障,验证恢复流程
- 文档化:常见问题的排查步骤写成 Runbook
- 备份验证:定期验证备份能否成功恢复
事中响应
- 先恢复,后排查:用户体验优先
- 沟通透明:及时通知相关方进展
- 记录时间线:为复盘留下证据
- 避免二次故障:修复操作要谨慎
事后改进
- 无责复盘:关注系统改进,不追究个人
- 改进措施落地:每次复盘的改进项要有人跟进
- 分享经验:让整个团队从故障中学习
今天的小测验
- 网站变慢时,排查的第一步应该看什么?
- 为什么说"先恢复,后排查"?
- 如果发现 AWS 账号被盗,应该立刻做什么?
- 故障复盘的目的是什么?为什么强调"无责"?
延伸阅读
明天预告
进入第六阶段:进阶与认证。明天开始学习 AWS 认证考试的准备策略,以及如何系统化地复习前面学到的所有知识。