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

284 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第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 认证考试的准备策略,以及如何系统化地复习前面学到的所有知识。