Chaos Engineering-System Resiliency in Practice
混沌工程的诞生
Neflix积极倡导的一种独特的文件理念。Netflix为解决可用性下滑问题所采取的几种做法,如:
- 只聘用有过岗位相关经验的高级工程师;
- 给所有工程师充分的自由去做任何必要的事情来完成工作,以及承担相应后果的责任;
- 到头重要的信任一线工程师,并由他们来决定工作的完成方式;
- 管理层不会告诉工程师应该怎么做,而是确保工程师了解需要解决的问题。然后,工程师告诉管理层他们计划如何解决这些问题,并着手解决;
- 高绩效团队之间认同一致,松散耦合。这意味着,如果 不同团队都拥有相同的目标,则在过程、沟通或管理上就无需花费太多精力。
尽管可以写下几种常用的模式来将服务编写得足够健壮,以解决实例无故消失的问题,但Netflix仍无法向整个工程组织发出命令,要求每个人都遵循这些模式。
混沌工程其实是将系统所固有的混沌进行可视化。
进行混沌工程的意义首先是建立信心。
混沌工程5项高级实践原则,为混沌工程实践设定了黄金标准:
- 建立关于稳态行为的假说
- 多样化引入现实世界的事件
- 在生产环境中进行实验
- 持续运行自动化实验
- 最小化爆炸半径
搭建舞台
混沌工程是专门为主动理解并应对复杂系统而创建的学科。
遵循经验丰富的工程师和架构师学习管理复杂性时的自然顺序:思考、遇到、面对、接纳和应对。
1. 遇到复杂系统
思考复杂性
架构师的角色之所以能得到发展,是因为他可以从思维上对整个系统进行建模,并且知道所有部分是如何组合在一起的。
遇到复杂性
组件之间的交互作用超出了人类将复杂系统的所有部件都掌握在自己脑海中的能力。
团队中每个人对产品假设都存在差异。
面对复杂性
一种流行的想法是减少或消除复杂性。
偶然复杂性
在编写代码时,总是会产生偶然复杂性。
本质复杂性
软件的本质复杂性体现在所编写的代码中。
试图将复杂系统转变为简单系统的前景并不乐观。
只要进行工作,就会附带产生偶然复杂性;
只要开发新功能,就会驱动本质复杂性的产生。
接纳复杂性
- 接纳复杂性
- 学习如何应对得要性。
作为一名工程师,混沌工程可能是开始应对系统复杂性的最可行和最有效的方法。
2. 应对复杂系统
动态安全模型
- 经济性
- 工作量
- 安全性
混沌工程可以帮助工程师培养本来就一直缺乏的有关安全性的直觉。向工程师传授安全性方面的各种机制是如何在整个系统的复杂性中相互作用的。
复杂性的经济支柱模型
- 状态
- 关系
- 环境
- 可逆性
混沌实验可以使脆弱的地方浮出水面,然后可以优化其"可逆性"。
3. 原则概述
混沌工程实践
为了具体地解决分布式系统在规模上的不确定性,可以把混沌工程看作是为了揭示系统弱点而进行的实验。这些实验遵循四个步骤:
- 首先,用系统在正常行为下的一些可测量的输出来定义“稳定状态”。
- 其次,假设控制组和实验组都能保持这种稳定状态。
- 然后,在实验组中引入反映真实世界事件的变量,如服务器崩溃、硬盘故障、网络连接断开等。
- 最后,通过控制组和实验组之间的状态差异来反驳稳定状态的假说。
破坏稳态的难度越大,我们对系统行为的信心就越强。如果发现了一个弱点,那么我们就有了一个改进目标。避免在系统规模化之后被放大。
混沌工程实践的重点是主动提高复杂系统的可用性和安全性。