Files
iAOP/tests/ha/README.md
T
bot_dev1 69d8178a83 feat(#89): 可用性/容灾演练套件(断点续传 + 故障隔离)
- 新增 tests/ha/ 容灾演练套件,4 个场景验证 PRD 第 9 章可用性/容灾 NFR:
  · 可用性基线:600 点位 30 轮健康采集,可用性 ≥ 99.8% / 丢失率 ≤ 0.02% / P99 ≤ 1.8s
  · 驱动故障隔离:30 轮中注入 5 轮设备掉线,引擎不崩溃,故障被隔离(_FlakyDriver 注入)
  · 上行抖动恢复:Kafka 中断 5 轮期间样本驻留 spool,恢复后断点续传零丢失
  · 进程重启容灾:销毁引擎模拟崩溃,重启后扫描 spool 全量重发(RPO=0)
- 演练结论:可用性 100%、丢失率 0%、P99=281ms(≤1.8s),SLA 全部达标
- 全部基于内核可注入接口(Driver/SpoolStore/HealthMetrics/BatchWriter)运行,零外部依赖
- 运行:python -m unittest discover -s tests/ha -v(_bootstrap.py 自动加载四个 core 模块)
2026-08-04 20:53:27 +08:00

44 lines
2.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.
# iAOP 可用性 / 容灾演练套件(tests/ha)
> 对应 Issue **#89 [M4] 可用性/容灾演练**,验证 PRD 第 9 章 NFR「可用性 ≥ 99.8%」
> 以及断点续传 / 故障隔离等容灾能力。
## 背景
PRD 第 9 章 SLA 对边缘采集网关提出可用性 ≥ 99.8%、丢失率 ≤ 0.02% 的硬指标。
这两项指标的工程保障来自三个机制:
1. **spool 断点续传**:样本先落本地磁盘,上行确认(ack)后才删除;
网关重启时扫描 spool 目录,未确认记录全部重发(RPO=0)。
2. **驱动故障隔离**:单驱动异常按「本轮整体失败」计入 HealthMetrics,
不抛出、不崩溃,正常轮次继续产出。
3. **上行通道背压**:Kafka 抖动期间样本驻留 spool,仅增加本地缓存占用,
恢复后断点续传,数据不丢不重。
本套件以**可重复的合成数据集 + 故障注入驱动**对上述机制做规模化演练,
全部基于内核可注入接口运行,零外部依赖,CI 可直接执行。
## 演练场景
| 场景 | 演练口径 | 验证目标 |
|------|----------|----------|
| 可用性基线 | 600 点位 30 轮健康采集 | 可用性 ≥ 99.8% / 丢失率 ≤ 0.02% / P99 ≤ 1.8s |
| 驱动故障隔离 | 30 轮中注入 5 轮设备掉线 | 引擎未崩溃;可用性受控下降(1−5/30);健康轮次仍产出样本 |
| 上行抖动恢复 | 上行连续中断 5 轮后恢复 | 中断期零丢失;恢复后断点续传落库 = 采集数(RPO=0) |
| 进程重启容灾 | 采集 8 轮后销毁引擎模拟重启 | 重启后扫描同一 spool,未确认样本全部重发落库(RPO=0) |
## 运行
在**仓库根目录**执行(`_bootstrap.py` 会自动把四个 core 模块加载到 `sys.path`):
```bash
python -m unittest discover -s tests/ha -v
```
## 文件
- `_bootstrap.py` —— 内核模块加载引导(edge-gateway 裸导入;data-bus / rag-kb /
llm-gateway 注册为下划线包名)。
- `test_availability_dr.py` —— 四个演练场景的 unittest 用例,含 `_FlakyDriver`
故障注入驱动。