MorenaLustosa/devops-incident-response-lab
GitHub: MorenaLustosa/devops-incident-response-lab
一个基于 Linux 环境的 DevOps 事故响应实战实验室,通过模拟生产环境数据损坏事故,训练值班工程师的系统排查和故障恢复能力。
Stars: 0 | Forks: 0
# 事故调查:billing-api 数据损坏
## 📌 背景
这是一个在 Linux 环境下进行的故障排除实践实验室,模拟了
一家虚构公司(MariaLazaraCloud,一家 B2B SaaS 计费公司)的
真实生产事故。目标是在没有任何前期文档的情况下,作为
值班 DevOps Engineer 调查、诊断并修复遗留系统中的故障。
## 🚨 状况
- **受影响的服务:** `billing-api`(支付 API)
- **症状:**
- 应用程序正在运行,但拒绝了所有交易
- 日志报告数据损坏错误
- Dashboard 显示状态为“degraded”
- **我的角色:** 值班 DevOps,对系统结构没有先前的了解,需要从零开始调查。
## 🔍 诊断 — 逐步进行
1. **环境侦察**
我使用 `uname -a` 检查了系统的版本和架构,以
确认我在正确的服务器上,并识别可能的兼容性限制。
2. **检查进程**
我使用 `ps aux` 和 `ps aux | grep billing` 确认
服务正在运行(活动进程,没有异常的 CPU/内存消耗),
这表明问题不在进程本身。
3. **分析日志**
我使用 `find / -type d -name "billing"` 定位了日志,并使用
`tail app.log` 阅读了最新的条目。日志显示了
重复的“Data corruption detected”错误。
4. **实时监控**
我使用 `tail -f app.log` 确认错误是连续的
(大约每 5 秒一次),而不是过去发生的孤立事件。
5. **调查近期变更 (GMUD)**
我使用 `find / -name "GMUD-*"` 定位了变更文档,并
使用 `cat` 阅读了内容。GMUD 记录了从
`/opt/seeds` 目录到 `/data/billing` 的数据迁移,并
已经制定了回滚计划。
6. **检查变更执行日志**
通过 `cat change-log.txt`,我确认了迁移期间执行的命令
(`mkdir`、`cp`、配置更改和服务重启)。
7. **验证当前配置**
我定位并阅读了 `billing-config.yml` 文件,确认
`data_directory` 指向了新目录(`/data/billing`)。
8. **检查数据目录**
通过 `ls -la`,我确认该目录存在,且具有
正确的权限——从而排除了权限问题。
9. **验证数据完整性**
在使用 `cat` 读取文件时,我发现了错误信息而不是
真实数据(`ERROR_MIGRATION_INCOMPLETE_DATA_CORRUPTED_2024`),
从而确认了损坏。
10. **验证原始数据**
我定位了 `/opt/seeds` 并通过 `cat` 确认,原始
数据完好无损,随时可用于回滚。
## 🎯 根本原因
在 GMUD 中执行的从 `/opt/seeds` 到 `/data/billing` 的数据迁移导致目标位置出现了损坏的文件。迁移后执行的基础验证并没有检查数据的真实完整性,而仅仅是检查复制过程是否完成——这使得服务能够带着损坏的数据投入生产环境。
## 🛠️ 解决方案
1. 我使用 `diff` 对比了当前配置与备份,确认
唯一的区别是 `data_directory` 字段。
2. 在进行任何更改之前,我创建了配置的额外备份
(`cp billing-config.yml billing-config.yml.pre-rollback`)。
3. 我使用 `chmod 644` 临时调整了文件权限
以允许编辑。
4. 我使用 `nano` 编辑了文件,将 `data_directory` 恢复为
`/opt/seeds`。
5. 我使用 `chmod 444` 恢复了原始的严格权限。
6. 我使用 `kill` 停止了旧进程并重启了服务。
7. 我通过使用 `tail -f` 监控日志验证了恢复情况,确认
交易已成功处理。
## 📊 指标验证
- 回滚前记录的损坏错误:**15**
(`grep "Data corruption detected" app.log | wc -l`)
- 回滚后成功验证的交易:**8**
(`grep "Transaction validation completed successfully" app.log | wc -l`)
## 💡 经验教训
- 迁移后的验证需要检查**数据的真实完整性**,
而不仅仅是进程是否在没有错误的情况下运行。
- 每一个 GMUD 都应该要求一个经过测试的回滚计划,而不仅仅是
写在文档里。
- 日志是任何事故调查中第一真相来源——永远要从它们开始。
- Linux 的基本命令(`find`、`grep`、`diff`、`tail -f`)
足以解决遗留系统中的大部分事故。
## 🧰 使用的命令
`uname -a`、`ps aux`、`grep`、`find`、`tail` / `tail -f`、`cat`、`diff`、
`chmod`、`cp`、`nano`、`kill`、`wc -l`
## 🙏 致谢
实验室基于
[Maria Lazara](https://github.com/marialazara/linux-essentials) 的 *《DevOps 基础 Linux》* 教材。
标签:BurpSuite集成, Cutter, SRE, 偏差过滤, 故障排查, 生产事故复盘, 运维