aws-doc/课程/第五阶段-监控与运维/第36天-运维综合实战.md

284 lines
7.0 KiB
Markdown
Raw Permalink Normal View History

2026-05-08 10:24:39 +08:00
# 第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 故障排查指南](https://docs.aws.amazon.com/systems-manager/latest/userguide/troubleshooting.html)
- [AWS Incident Manager](https://docs.aws.amazon.com/incident-manager/latest/userguide/)
- [AWS Fault Injection Simulator](https://docs.aws.amazon.com/fis/latest/userguide/)
---
## 明天预告
进入第六阶段:进阶与认证。明天开始学习 AWS 认证考试的准备策略,以及如何系统化地复习前面学到的所有知识。