# 可靠性 —— 系统如何保持健壮

xiangqin 每天在背后跑**6 个自动化演练** + **1 套指标观测**，保证服务不会悄悄失效。这一页说清楚我们做了什么、为什么，以及你可以怎么验证。

## 两类风险，两套策略

| 风险 | 场景 | 策略 |
|---|---|---|
| **防腐烂** | 备份恢复、机器迁移这类"半年才用一次"的流程，真要用时才发现已经坏了 | 定期自动演练 → 早发现 |
| **防降级** | 响应变慢、错误率悄悄抬升，用户反馈才知道已经晚了 | 每日聚合指标 + 徽章可视化 |

行业叫法：**Chaos Engineering**（Netflix 首创）+ **Observability**（Google SRE）。大厂标配。

## 6 个自动化演练 + 1 套指标

每个都在 GitHub Actions 上**定时自动跑**。你可以打开 repo 的 Actions 页面看历史成功率。

### 防腐烂（4 个备份恢复演练）

| 代号 | 一句话 | 频率 |
|---|---|---|
| **M1 备份新鲜度** | 每小时问一次云存储："最新备份是多久以前的？" 超过 26 小时就报警 | 每小时 |
| **M2 备份完整性** | 每天把最新备份下载到本地，用 sqlite 工具打开，确认文件没损坏、核心表都在 | 每天 |
| **M3 异地恢复演练** | 每周在一台**全新干净的机器**上从云备份恢复数据库，模拟"服务器整机丢失还能救吗" | 每周日 |
| **M4 装机流程演练** | 每月**真开一台新机器**，跑装环境脚本、部署服务、smoke 测试，再销毁；证明"换机流程没生锈" | 每月 1 号 |
| **M6 完整迁移演练** | 每月跑一次**真数据迁移**：开新机 → 拉最新备份 → 恢复到新机 → 用真数据验证服务能响应；证明"到期换机"整套流程能跑通 | 每月 15 号 |

### 防降级（1 套指标）

| 代号 | 一句话 | 频率 |
|---|---|---|
| **M5 性能指标聚合** | 每天算过去 24 小时 API 响应时间（p50/p95/p99）+ 错误率，展示为徽章（绿/黄/红） | 每天 |

## 怎么验证我们真做了

打开主仓 README 顶部的徽章墙 —— **每个演练对应一个徽章**：

- 绿色 `passing` = 最近一次跑成功，系统健康
- 红色 `failing` = 失败了，代码仓里有人正在修（或等修）
- 点击徽章直接跳到 GitHub Actions 历史

任何人都能看到：
- 哪个演练多久跑一次
- 最近 N 次跑的历史
- 失败的具体错误原因（log 公开）

**透明 = 可信**。我们没有隐藏任何故障。

## 当你最担心什么

### "你们的备份真的有用吗 / 数据丢了能救回来吗？"

M1/M2/M3 覆盖。每小时确认备份在、每天确认备份能读、每周真从备份恢复一遍。如果这三个徽章全绿 —— **意味着昨晚的数据现在立刻能恢复到任意全新机器**。

### "服务器挂了怎么办 / 换机要多久？"

M4/M6 覆盖。每月演练"从零开机到服务起来"的完整流程。目前实测大约 **10 分钟**完成（装机 + 部署 + 验证），一次演练成本几分钱。

真换机（业务切换）采用**维护窗口模式**：用户看到 1-5 分钟的"系统升级中" → 然后完全恢复。**对 SQLite 架构这是合理上限**（真 zero-downtime 需要 Postgres 主从，待 v0.5+ 业务规模需要时实现）。

### "性能会不会悄悄变慢？"

M5 覆盖。每天徽章显示 p95 响应时间：

- 绿：< 100ms（体感即时）
- 黄：100-1000ms（有点慢但可用）
- 红：> 1000ms（明显感知）

连续多天黄或红 → 我们已经在看问题。

## 我们从失败里学到什么

演练的价值不只是"预防"，还是**"暴露"隐藏问题**。举个实例：

> 2026-04-23 第一次跑 M4 迁移演练，在新机器上部署时挂了 —— 原因是 SSH 空闲超时（小机器装依赖较慢）。如果不是 chaos drill 先暴露，这个 bug 会在真换机时才被发现（那时候是灾难场景）。

**每次失败都是一次免费的真实事故演练**。这才是 chaos engineering 的核心价值。

## 未来改进方向

- **性能退化告警**：当 M5 指标连续多天恶化 → 主动 notify
- **告警链路本身演练**（演练演练本身）
- **依赖包安全扫描定期**：防供应链攻击

---

如果你对实现细节感兴趣，所有演练都是 GitHub Actions workflow，yaml 配置公开在 [`.github/workflows/chaos-*`](https://github.com/yarnovo/xiangqin/tree/main/.github/workflows)。
