混沌工程原则定义了混沌工程学科,让大家了解何时进行、如何进行及如何做好混沌工程。混沌工程的通用定义是促进发现系统弱点的实验。
1、定义稳态steady state,以表示系统正常运行的某些可测量的输出。
2、建立如下假说: 对照组和实验组都将保持这种状态。
3、引入反应真实事件的变量,例如崩溃的服务器、发生故障的磁盘驱动器、断开的网络连接等。
4、试图通过在对照组和实验组之间寻找稳态差异来推翻这一假说。
该实验构成了混沌工程的基本原则,并为实验的实施提供了很大的自由度。
混沌工程是一种实验而不是测试。测试是关于系统已知属性的说明。实际上,不能从集成测试中发现理想结果。测试不会创造新知识。复杂系统对于测试分析是不透明的。对于复杂系统中各个部件所有的潜在相互作用所带来的的所有潜在副作用,人类根本无法理解。实验可以让我们学到系统的新属性。
混沌工程不是在生产环境搞破坏和反脆弱。
混沌工程是修复生产环境的漏洞。搞破坏很容易,但完成下述事情很难: 减少爆炸半径、对安全性进行批判性思考、确定漏洞是否值得修复、决定是否进行实验等等。混沌工程实践的重点是主动提高复杂系统的可用性和安全性。
混沌工程能教育系统维护人员,让他们认识到混沌为系统所固有,从而使他们成为一支更有韧性的团队。而反脆弱给系统加入混沌,并希望系统在响应混沌时变得更强大,而不是屈服于混沌。
混沌工程的高级原则描述了混沌工程的黄金标准:
1、建立关于稳态行为的假设
2、多样化地引入现实世界的事件
3、在生产环境进行实验
4、持续运行自动化测试
5、最小化爆炸半径
混沌工程对稳态的关注迫使工程师暂且抽身代码之外,关注系统的全局性输出。对于可用性实验,假说表述为: 即使在某某情况下,用户仍然拥有良好的使用体验。对于安全性实验,假说表述为: 一旦某某情况发生,安全团队将收到通知。
实验变量的选择可能发生的两种捷径,一是在引入变量时,选择标准通常是是否容易执行,而不是能否提供最大学习价值。二是倾向于选择反应工程师自己而不是用户体验的变量。
如果只在准生产环境进行试验,则无法建立对生产环境的信心。混沌工程的目的是发现复杂系统中固有的混沌,而不是带来混沌。如果明知实验会带啦不良结果,那么就不应该进行实验。初始阶段在准生产环境进行实验是有意义的,一旦发展成熟,再逐渐过渡到生产环境。
自动化有两个原因: 一是自动化能覆盖更多的实验。二是自动化能帮主持续的实验,以帮助发现系统中更多的未知。
设计更安全的实验方法可以大大降低实验对生产流量造成影响的风险。在某些系统中,这意味着要使用影子流量,或将对业务有重大影响的请求排除在实验之外。
上述提到的高级原则都是引导和启发,而不是命令。
面对承载真金白银的金融机构的线上系统,即便是最好的工程师团队也会遭遇停机事故。要么继续以某种无法预测的频率和严重程度对待停机事故,要么采取混沌工程这样的策略来了解系统,以预防更大范围和不受控制的事故。很多金融机构对此表示赞同,许多大型银行都启动了专门的混沌工程项目。
医疗保健业也是同样情况。