3. 故障注入分类:基础设施、应用层与数据层

在生产环境中进行故障注入时,必须根据故障发生的层次进行系统化分类。不同层次的故障对系统的影响范围、检测手段和恢复策略截然不同。本章将故障注入分为三大类:基础设施故障、应用层故障和数据层故障,并分别阐述其注入方法、预期影响与验证要点。

核心原则:故障注入应遵循“由外向内、由下至上”的渐进策略。先验证基础设施的韧性,再验证应用层的容错,最后验证数据层的完整性。切勿跨层同时注入,以免无法定位根因。

3.1 基础设施故障(CPU / 内存 / 磁盘 / 网络)

基础设施故障是混沌工程中最基础、最常用的注入类型。它们直接作用于物理或虚拟化资源,模拟硬件故障、资源耗尽或网络分区等真实场景。

3.1.1 故障类型与注入方法

故障类型 典型注入工具 注入参数示例 预期系统行为
CPU 压力 stress-ng, chaosblade --cpu 4 --timeout 60s CPU 使用率飙升,服务响应延迟增加,触发 HPA 或限流
内存耗尽 stress-ng, memhog --vm 2 --vm-bytes 2G OOM Killer 触发,Pod 重启,内存溢出导致进程崩溃
磁盘 I/O 阻塞 blktrace, dd, chaosblade --delay-read 100ms 日志写入阻塞,数据库 checkpoint 延迟,应用线程 hang
磁盘空间满 dd, fallocate dd if=/dev/zero of=/tmp/fill bs=1M count=10240 写入失败,服务降级,监控告警触发
网络延迟 tc, chaosblade --delay 200ms --offset 50ms RPC 超时,重试风暴,连接池耗尽
网络丢包 tc, iptables --loss 30% 请求失败率上升,客户端熔断,服务降级
网络分区 iptables, chaosblade --drop-port 8080 服务不可用,集群脑裂,选举超时
生产环境建议:基础设施故障注入应优先在非核心业务实例上进行,并设置自动熔断机制(如注入时长超过阈值自动恢复)。建议配合可观测性平台实时观察 CPU / 内存 / 网络指标曲线。

3.1.2 基础设施故障注入流程(SVG)

下图展示了基础设施故障注入的标准流程,从故障定义到恢复验证的完整闭环:

基础设施故障注入流程 1. 定义故障场景 2. 选择注入目标 3. 执行故障注入 4. 观测系统行为 5. 自动/手动恢复 6. 验证恢复效果 未通过 → 调整参数重新注入 说明: 每个步骤必须记录注入时间、参数、观测指标和恢复时长。步骤 4 和 5 之间应设置自动熔断阈值,避免故障扩散。

3.2 应用层故障(延迟 / 异常 / 超时)

应用层故障模拟的是服务内部或服务间调用过程中的异常行为。这类故障通常比基础设施故障更难排查,因为它们可能表现为间歇性、非对称性或仅在特定请求路径上触发。

3.2.1 故障类型与注入方法

故障类型 注入方式 典型工具 影响范围
接口延迟 在服务 A 调用服务 B 时注入固定/随机延迟 chaosblade, Envoy fault injection 调用链下游超时,上游线程池阻塞
业务异常 模拟特定接口返回 500 / 403 / 自定义错误码 chaosblade, Hystrix fallback 客户端触发重试或降级,错误率上升
调用超时 设置 RPC 调用超时时间缩短或服务端响应超时 chaosblade, gRPC deadline 连接池快速耗尽,熔断器打开
请求限流 模拟服务端主动拒绝请求(429 Too Many Requests) chaosblade, Sentinel 客户端退避重试,流量倾斜到其他实例
依赖降级 强制让某个下游依赖返回默认值或空结果 chaosblade, 自定义 Mock 业务逻辑走降级分支,数据一致性可能受影响
风险提示:应用层故障注入时,务必确保熔断器、重试策略和超时配置已经过单元测试验证。否则,一次简单的延迟注入可能引发“重试风暴”,导致整个集群雪崩。

3.2.2 应用层故障传播路径(SVG)

下图展示了应用层故障在微服务调用链中的传播路径,以及熔断器如何阻断故障扩散:

应用层故障传播与熔断隔离 客户端 服务 A 服务 B 服务 C 注入延迟 500ms 线程池阻塞 请求超时 熔断器打开 降级返回 熔断器在错误率达到阈值(如 50%)时打开,后续请求直接降级,避免故障向客户端传播。

3.3 数据层故障

数据层故障是最危险的故障类型之一,因为它直接影响数据的持久性、一致性和可用性。数据层故障注入的目标是验证系统在数据库不可用、主从切换、数据损坏或一致性冲突时的行为。

3.3.1 故障类型与注入方法

故障类型 注入方法 典型场景 验证要点
数据库连接中断 iptables 阻断端口 / 关闭数据库进程 应用无法获取数据库连接 连接池耗尽后是否快速失败,是否触发降级
主从切换 手动触发 MySQL / PostgreSQL 主从切换 主库故障,从库提升为主 切换时间、数据丢失量、应用重连机制
慢查询注入 执行长时间运行的 SQL(如 SELECT SLEEP(30)) 慢 SQL 占满数据库线程池 数据库连接池是否被打满,应用是否超时
数据损坏 直接修改数据库文件或写入脏数据 磁盘坏道、程序 bug 导致数据错乱 校验和机制是否生效,备份恢复流程
缓存穿透 / 击穿 清空 Redis 缓存或设置大量不存在的 key 大量请求直接打到数据库 数据库是否扛住,缓存重建策略是否有效
分布式事务冲突 在 TCC / Saga 事务中注入参与者失败 跨服务数据一致性场景 补偿事务是否正确执行,最终一致性是否达成
关键指标:数据层故障注入时,必须重点监控以下指标:
• RTO(恢复时间目标):从故障发生到服务恢复的时间。
• RPO(恢复点目标):故障发生时允许丢失的数据量。
• 数据一致性延迟:主从同步延迟或最终一致性窗口。

3.3.2 数据层故障隔离架构(SVG)

下图展示了一个典型的数据层故障隔离架构,包含多级缓存、读写分离和灾备切换:

数据层故障隔离架构 应用服务 Redis 缓存(主) Redis 缓存(从) MySQL 主库 MySQL 从库 灾备数据库 灾备缓存 注入:主库宕机 自动切换:从库升主 故障注入验证目标:主库宕机后,从库在 30 秒内完成切换,应用连接自动重连到新主库,缓存层继续提供读服务。

3.4 三类故障的对比与选择策略

在实际的混沌工程实验中,需要根据实验目标和系统架构选择合适的故障类型。下表从多个维度对比三类故障:

对比维度 基础设施故障 应用层故障 数据层故障
影响范围 全局性,影响所有上层服务 局部性,影响特定调用链 全局性,影响所有数据读写操作
恢复难度 低(资源释放即可恢复) 中(需重置状态或重启进程) 高(可能需要数据修复或回滚)
检测手段 系统指标(CPU/内存/网络) 应用指标(延迟/错误率/吞吐量) 数据指标(一致性/延迟/复制状态)
推荐实验顺序 第 1 阶段 第 2 阶段 第 3 阶段
风险等级 中 中高 高
实验策略建议:
• 首次进行故障注入时,优先选择基础设施故障中的 CPU 压力和网络延迟,因为它们影响可控、恢复简单。
• 应用层故障建议在基础设施韧性验证通过后再进行,且先从单实例、单接口开始。
• 数据层故障必须在有完整备份和回滚方案的前提下进行,且建议在预发环境先演练一次。

3.5 本章小结

故障注入分类是混沌工程实验设计的基石。本章详细介绍了三大类故障的注入方法、预期影响和验证要点:

  • 基础设施故障:模拟硬件和资源层面的异常,是验证系统弹性的第一道关卡。
  • 应用层故障:模拟服务间调用的异常行为,重点验证熔断、降级和重试策略。
  • 数据层故障:模拟数据存储和一致性相关的异常,是验证数据可靠性的最后防线。