RajarsiGit/hunter-simulations

GitHub: RajarsiGit/hunter-simulations

一个自包含的 PostgreSQL/RDS 故障模拟演练平台,可在非生产实例上按需重现连接耗尽、锁死锁、慢查询和 autovacuum 膨胀等故障模式,供 DBA 和运维团队练习真实场景下的检测与恢复。

Stars: 0 | Forks: 0

# DBA 演练模拟 — Claude-Code / Agent 版 这是一个用于练习 PostgreSQL/RDS 故障响应的独立实验室:将其指向一个 **非生产环境**实例,选择一个主题,它就会按需重现该故障模式 (连接耗尽、锁/死锁、慢查询,或 autovacuum/膨胀/复制/临时 文件),这样你就可以针对真实的实时症状,而不是 日志记录,来演练检测和恢复。专为人类(交互式演练,每次运行一个脚本)和 agent (非交互式 `--yes` 运行,通过 `run_all.sh` 实现全套自动化)构建。 这是 `gpt-docs/` 中涵盖的四种 PostgreSQL/RDS 故障 类别的模拟和重现脚本,它们根据那些 ChatGPT 对话记录生成,并且(在某个主题已有脚本集的情况下)从顶层的 `connection-exhaustion/` 和 `locks-deadlocks-blocking-queries/` 文件夹移植到了 一个共享的、对 agent 友好的规范上: - **通过 `.env` 提供凭据** — 无需记住导出的环境变量,也没有 硬编码的密钥。无论你从哪个目录运行脚本,只需将 `.env.example` 复制到该目录下的 `.env` 并填写内容即可。 - **非交互式安全** — 每个破坏性/变更性演练仍然会提示 `Type 'yes' to proceed`(输入 yes 继续),但 agent(或 CI)可以传入 `--yes` / 设置 `DRILL_YES=1` 来跳过提示,而不会冒任何 *意外* 自动运行的风险(这是可选启用的,而不是“因为 stdin 不是 TTY 就跳过”)。 - **Claude Code 技能就绪** — 每个主题文件夹都有一个包含 正确 frontmatter(`name`、`description`)的 `SKILL.md`,因此可以将其放入 技能目录中(或由 agent 通过 `Skill`/`Agent` 工具引用), 并在相关的触发短语上被激活。 ``` simulations/ ├── .env.example Credential template — copy to .env ├── _lib/env.sh Shared: loads .env, confirm_drill(), strip_flags() ├── _lib/runner.sh Shared: step()/run_step() manifest runner for run_all.sh scripts ├── run_all.sh Runs all 4 topics' run_all.sh in sequence ├── 01-connection-exhaustion/ 11 scripts + run_all.sh + SKILL.md + README.md ├── 02-locks-deadlocks-blocking-queries/ 20 scripts + run_all.sh + SKILL.md + README.md ├── 03-slow-queries/ 9 scripts + run_all.sh + SKILL.md + README.md ├── 04-autovacuum-bloat-replication-temp-files/ 11 scripts + run_all.sh + SKILL.md + README.md └── README.md This file ``` 每个子文件夹都是独立的:它有自己的 `README.md`,记录了每个脚本 (它重现的内容、参数、关键观察点),并且它有自己的 `SKILL.md` 作为 面向 Claude-Code 的摘要 — 如果你是一个决定 运行哪个脚本的 agent,请先阅读它。 ## 快速开始 ``` cd simulations cp .env.example .env $EDITOR .env # PGHOST/PGPORT/PGUSER/PGPASSWORD/PGDATABASE (+ PGBOUNCER_*/DRILL_ROLE* as needed) # 人工、交互式: ./01-connection-exhaustion/06_simulate_idle_in_transaction.sh 5 300 my_test_table # Agent / 非交互式: DRILL_YES=1 ./02-locks-deadlocks-blocking-queries/03_simulate_deadlock.sh # 或者:./03-slow-queries/02_simulate_missing_index_scan.sh simulate --yes ``` 所有脚本都假定 `.env` 在调用时位于 **当前工作目录** 中 (根据 `_lib/env.sh`)— 从 `simulations/` 本身运行它们,或者 在你调用它们的任何位置旁边 `cp .env`。 ## 自动化运行 每个主题文件夹都有一个 `run_all.sh`,它通过一个命令按顺序排列该主题的完整 清单 — 设置 → 每个演练 → 检测 → 清理 — 并在最后给出一个通过/失败摘要。还有一个顶层的 `run_all.sh` 按顺序运行所有四个主题(绝不并行 — 它们共享 同一个实例,并且交错的演练会使产生的 `pg_stat_activity`/日志信号变得难以阅读)。 ``` cd simulations cp .env.example .env && $EDITOR .env # 预览整个测试套件,不接触 DB ./run_all.sh --list # 运行整个测试套件,快速扩展,非交互式 DRILL_YES=1 ./run_all.sh # 仅一个主题,doc-example 规模 ./03-slow-queries/run_all.sh --full --yes # 仅顶层中的两个主题 ./run_all.sh --topics 1,4 --yes ``` 每个 `run_all.sh` 都支持 `--list`(预览解析后的清单,不运行 任何内容)、`--fast`/`--full`(调整规模)、`--only`/`--skip`(缩小范围至特定 脚本 ID)、`--no-cleanup` 和 `--yes`/`DRILL_YES=1`。请参阅每个脚本的 头部注释(或其主题的 `README.md`/`SKILL.md`)以获取完整的标志 参考和特定于主题的选项。完整运行的输出会按步骤记录在 你调用它的任何层级下的 `run_all_logs//` 中。 ## 主题索引 | 文件夹 | 涵盖范围 | 源文档 | |---|---|---| | [`01-connection-exhaustion`](01-connection-exhaustion/README.md) | Idle-in-transaction 洪水,PgBouncer 连接池饱和(事务和会话模式),role/DB 连接数限制突破,普通 idle-connection 风暴/泄漏 | `ChatGPT-ChatGPT - Senthil.md` (+ (1)), `ChatGPT-PgBouncer Connection Exhaustion.md`, `ChatGPT-RDS Postgres Issue Guide.md` §8 | | [`02-locks-deadlocks-blocking-queries`](02-locks-deadlocks-blocking-queries/README.md) | 行/表锁,死锁,DDL 阻塞 DML,advisory locks,FK 争用,VACUUM FULL 阻塞,锁队列放大,卡住的 worker 工作流阻塞,自动化故障 RCA | `ChatGPT-RDS PostgreSQL Lock Investigation.md`, `ChatGPT-RDS PostgreSQL Lock Troubleshooting.md` | | [`03-slow-queries`](03-slow-queries/README.md) | 缺失索引扫描,函数包装的谓词,offset 与 keyset 分页,JSONB CPU 飙升,过时的 planner 统计信息,重试风暴 | `ChatGPT-RDS PostgreSQL Performance Optimization.md`, `ChatGPT-RDS Postgres Issue Guide.md` §7 | | [`04-autovacuum-bloat-replication-temp-files`](04-autovacuum-bloat-replication-temp-files/README.md) | 表/索引膨胀,autovacuum 滞后,过时统计信息导致的错误执行计划,temp-file 磁盘溢出,replication-slot WAL 保留,replica 延迟 | `ChatGPT-RDS PostgreSQL Investigation Guide.md`, `ChatGPT-RDS Postgres Issue Guide.md` §5–§6, `ChatGPT-RDS PostgreSQL Infra Monitoring.md` | `ChatGPT-AWS RDS Cost Anomalies.md` 已经过审查,但它是一个成本/计费主题, 而不是一种操作性故障模式 — 超出了这四个类别的范围,因此没有 为其生成脚本。 ## 与原始 `connection-exhaustion/` 和 `locks-deadlocks-blocking-queries/` 文件夹的关系 这两个文件夹未受影响且仍然有效 — 它们是最初的 映射到 runbook 的演练集(仅限环境变量,仅限交互式确认)。此 `simulations/` 树在 agent 驱动的使用场景中取代了它们:这里的主题 1 和 2 是直接的行为移植(相同的场景,相同的参数)到 `.env` + `--yes` 规范上,并且在 `gpt-docs` 对话记录中发现了 尚未编写脚本的场景时,每个主题增加了少量新脚本。 主题 3 和 4 完全是全新的。 ## 安全性 每个演练脚本都是 **仅限非生产环境**:它使用 独特的 `application_name`(`drill_*`)标记其会话,以便于识别和清理, 并将任何改变状态的操作限制在 `confirm_drill()` 之后(输入 `yes`, 或显式传入 `--yes`/`DRILL_YES=1`)。从该树运行脚本时,切勿将 `.env` 指向生产环境的 endpoint。每个主题文件夹都有自己的 清理脚本,可在你完成操作后移除演练会话/表。
标签:Cutter, PostgreSQL, 事故响应, 故障演练, 数据库运维, 测试用例