混沌工程的原则
混沌工程是为了建立对于系统在混乱极端环境条件下的承受能力的信心,从而在系统中进行科学实验的学科。最早由Netflix提出并实践。
大规模分布式软件系统的实践和发展正在改变传统软件工程的行业规则。大规模分布式软件系统不同于以往的传统软件工程,其已经采取新的能增加和提高软件开发灵活性和系统部署速度的方法论和实践。但在采取这些方法论和实践之后,一个紧迫的问题随之而来:我们对投入生产的复杂系统有多大的信心?
即使分布式系统中的所有单个服务(单体或者微服务)都正常运行,这些服务之间的交互也可能导致不可预测的结果。这些不可预测的结果再加上影响生产环境的低概率但高破坏性的偶发性事件,使分布式系统在本质上是来看是混乱的。
我们需要将这些弱点在其发展成为系统级别的反常行为之前识别出来。系统级别的弱点可能表现出以下形式:
系统不可用时的不合理的回退设置。
不合理系统请求超时配置导致的重试风暴。
下游系统接收到太多流量导致的宕机。
单点故障级联到系统级别的崩溃,等等。
我们必须积极主动的在其影响到生系统之前解决掉这些最重要的弱点。这时我们需要一种全新的方法和实践来管理这些系统中固有的混乱,利用开发和部署中不断提高的灵活性和敏捷,建立起对于复杂系统在生产部署的信心。
作为一种基于系统级别的实证方法论,用于解决大规模分布式系统中的混乱,建立起复杂系统在混乱极端环境条件下的承受能力的信心。我们通过在对照实验中观察分布式系统的行为表现来了解他们。我们称之为混沌工程。
为了具体解决分布式系统的不确定性,混沌工程可以被认为是通过利用实验来发现系统弱点。这些实验遵循四个步骤:
首先将"稳态"定义为指示正常行为的系统的某些可测量输出。
假设这种稳定状态将在对照组和实验组中继续存在。
引入反映真实世界事件变量,如服务器崩溃、硬盘驱动器故障、网络连接断开等。
尝试通过寻找对照组和实验组之间的稳态差异来反驳假设。
破坏稳定状态越难,我们对系统行为的信心就越大。反之,每发现一个弱点,也就有了一个需要改进的目标,在这个弱点在整个生产系统中表现出来之前处理掉。
以下原则描述了混沌工程的理想应用场景,应用于上述的实验过程。对于这些原则的接受和实践应用程度与我们对于分布式系统的信心建立密切相关。
专注于系统的可衡量输出,而不是系统的内部属性。在短时间内利用输出的测量值构建成系统稳定状态的描述指标。整个系统的吞吐量、错误率、延迟百分比等都可以是表示稳态行为的相关指标。通过在实验期间关注系统行为模式,混沌验证系统是否能正常工作,而不是试图验证它是如何工作的。
混沌变量反映了现实世界的事件。按潜在影响或估计频率确定事件的优先级。考虑硬件故障(如服务器死亡)、软件故障(如格式错误的响应)以及非故障事件(如流量峰值或扩展事件)对应的事件。任何能够破坏稳态的事件都是混沌实验中的潜在变量。
系统的行为因环境和流量模式不同而有所不同。由于系统服务的使用行为可以随时改变,因此对实际流量进行采样是能可靠地捕获请求路径的唯一方法。为了保证系统运行方式的真实性以及与当前部署系统的相关性,混沌工程强烈倾向于直接在生产流量上进行实验。
手动运行实验是劳动密集型的,最终是不可持续的。自动执行实验并持续运行。混沌工程需要自动化构建到系统中,以推动编排和分析。
在生产中进行试验可能会给客户带来不必要的痛苦。虽然必须考虑到一些短期的负面影响,但混沌工程师的责任和义务是确保实验的影响最小化并得到控制。
混沌工程是一种强大的实践,它已经改变了世界上一些最大规模运营的软件设计和工程方式。在其他实践需要解决速度和灵活性的地方,混沌工程用于专门解决这些分布式系统中的系统不确定性。混沌原理为大规模快速创新提供了信心,并提高了客户的体验。