76 lines
3.1 KiB
Markdown
76 lines
3.1 KiB
Markdown
# 故障注入矩阵
|
||
|
||
## 执行规则
|
||
|
||
- 先在隔离环境建立 15 分钟稳定基线,再注入单一故障。
|
||
- 每次只改变一个变量,记录开始/恢复时间与所有指标。
|
||
- PostgreSQL 写故障后核对配置版本、Upstream/Routing 管理状态、Admin 审计和
|
||
outbox;Redis 写故障后核对活动池、独占提取和短期幂等键,不能只看 HTTP
|
||
状态码。
|
||
- 故障恢复后至少观察两个健康检查周期和一个 Snapshot 完整发布周期。
|
||
|
||
## 场景
|
||
|
||
### Provider
|
||
|
||
- DNS NXDOMAIN、连接超时、TLS 失败、401、429、500。
|
||
- 响应超过 `maxResponseBytes`、模板超过 `templateTimeout`、非法 Proxy。
|
||
- 合法空列表、全部重复、部分重复加部分新增。
|
||
|
||
预期:只有合法空列表增加 Empty;429 尊重 Retry-After;其余 Error 退避;
|
||
duplicate-only 不触发 Sequential 切换。
|
||
|
||
### PostgreSQL
|
||
|
||
- 断开 60 秒、连接池耗尽、锁等待、事务提交失败、只读切换。
|
||
|
||
预期:Gateway 继续使用最后 Snapshot;Redis 健康时 Fetch、活动池更新和 Extract
|
||
不被 PostgreSQL 故障阻断;依赖持久化的配置/Admin 写操作失败关闭。恢复后
|
||
outbox 补发且不重复应用,PostgreSQL 中没有 Proxy 明细或逐次提取记录需要恢复。
|
||
|
||
### Redis
|
||
|
||
- 断开、延迟 2 秒、Leader key 丢失、活动池与幂等键丢失、主从切换。
|
||
|
||
预期:Gateway 在 Snapshot 新鲜度窗口内无影响;Distribution 失败关闭并返回 503,
|
||
不得改写 PostgreSQL 兜底;Provider Fetch 不出现多个有效 Leader;全局限流明确
|
||
降级。恢复后 epoch 单调,由 Provider 重新拉取并构建 TTL 活动池;已经丢失的短期
|
||
幂等窗口和旧活动池排他状态不伪装成仍然有效,重建结果视为新的活动池代次。
|
||
|
||
### Controller
|
||
|
||
- 杀死 Leader、滚动重启全部副本、阻断 Worker 控制流。
|
||
|
||
预期:`maxStaleAge` 内 Gateway 继续,之后停止新流量;Leader 切换不重复计费
|
||
Fetch;Delta 缺口触发完整 Snapshot。
|
||
|
||
### Gateway
|
||
|
||
- 杀死一个 Pod、驱逐一个节点、丢失一个可用区、耗尽 FD。
|
||
|
||
预期:LoadBalancer 摘除 NotReady Pod;ownership 租约过期前不分给新 Worker;
|
||
剩余容量满足已验证故障域目标。
|
||
|
||
### Checker
|
||
|
||
- 慢目标、DNS 延迟、队列积压、杀死一半 Pod。
|
||
|
||
预期:优先新 Proxy 和 SUSPECT;稳定 Proxy 降频;队列有界;Observation 重投
|
||
不导致非法状态回退。
|
||
|
||
### Distribution
|
||
|
||
- 100 个并发请求争用相同 Proxy;Redis 在原子操作执行或主从切换时断开;Gateway
|
||
同时满载。
|
||
|
||
预期:同一 Redis 活动池代次内每个 Proxy 最多返回一次;该代次仍保留时,未确认
|
||
成功的客户端使用同一幂等键重试并得到已缓存结果或明确失败,不出现部分可见状态;
|
||
allOrNothing 整批不变;池中始终剩余 `reserveForGateway`;没有 Release 恢复路径。
|
||
|
||
### 配置与 Secret
|
||
|
||
- 未知字段、错误正则、缺失 Upstream、公开监听无保护、凭据轮换失败。
|
||
|
||
预期:新 Revision 整体拒绝,旧不可变 Snapshot 继续;认证错误计 Error 而不是
|
||
Empty;日志不出现 Secret。
|