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 模块)
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# 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`
|
||||
故障注入驱动。
|
||||
Reference in New Issue
Block a user