3.1 KiB
故障注入矩阵
执行规则
- 先在隔离环境建立 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。