混沌工程

在可控范围内主动注入故障(延迟、宕机、网络分区),验证系统韧性假设;以稳态假设、有限爆炸半径与随时可中止为原则,可从只读实验起步。

混沌工程是什么

混沌工程是在可控范围内主动注入故障(实例宕机、网络延迟与丢包、依赖超时、磁盘写满),用真实实验验证“系统在故障下仍然可用”这一假设。它和被动等故障的区别在于:实验有明确假设、有稳态指标、有受限的爆炸半径,并且随时可以中止。实践通常从只读或旁路链路的实验起步,再逐步扩大到核心链路。

基本信息

前提已有可观测性:稳态指标、监控与告警链路可用
范围明确爆炸半径,从单实例、单依赖到小比例流量逐级扩大
中止指标越界自动终止,且保留人工一键停止能力
产出暴露的薄弱点进入缺陷跟踪,修复后排期复验

典型使用场景

  • 容灾演练:验证主备切换、跨可用区与跨区域切换是否达到预期
  • 依赖降级验证:模拟下游超时或返回错误,确认降级与熔断按设计生效
  • 容量验证:在部分实例不可用时确认剩余容量能否承接全量流量
  • 发布流程验证:模拟滚动发布期间的实例退出,确认不中断在途请求
  • 数据一致性验证:模拟网络分区,检查两侧写入与恢复后的对账行为

流程

流程
1. 定义稳态指标(成功率、P99)
2. 提出假设:注入 X 故障,稳态不破
3. 从小范围注入(单实例、单依赖)
4. 观察并支持自动中止
5. 修复暴露的问题,纳入回归演练

实验设计检查

项要点
稳态假设用可观测指标定义“系统正常”(成功率、P99)
爆炸半径单实例 → 单依赖 → 小比例流量,逐步扩大
中止条件指标越界自动终止,人工一键停止可用
复盘闭环暴露问题进缺陷跟踪,修复后排期复验

使用要点

  • 先验证演练平台本身:确认它能真正注入故障,也能真正停下
  • 选低风险时段与旁路链路起步,成功后再逐步向核心链路推进
  • 实验前通知相关方并准备好回滚,涉及业务方时要提前对齐窗口
  • 关注“未破稳态但很勉强”的现象:余量被吃掉本身就是需要处理的发现
  • 把已修复的故障场景固化成回归演练,防止后续改动重新引入
混沌实验必须有终止条件与影响开关;先验证演练平台本身,再逐步扩大范围。
在没有可观测性与中止能力之前做混沌实验,等于在核心链路上直接做故障演练;实验中止按钮与指标看板要能在实验前确认可用。

易错点

  • 实验范围失控波及核心链路,把演练变成真实事故
  • 只注入故障不修复问题,演练流于形式,下次故障依旧
  • 缺少稳态指标定义:无法判断系统是否真的“没坏”,结论靠感觉
  • 在没有流量或非代表性时段演练,故障未暴露,得到虚假的安全感
  • 演练未通知相关方,SRE 与业务把演练故障当真实事故处置,造成不必要的应急响应

数据来源与参考

  • Principles of Chaos Engineering(principlesofchaos.org)
  • Netflix Chaos Monkey 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌