什么是混沌工程以及它是如何工作的

445 阅读12分钟

当代大型企业的大多数软件系统都在满负荷运转,因为它们必须处理分布式系统架构上的复杂计算。在这些情况下,系统故障的可能性很大,而故障的原因在很大程度上仍然难以捉摸。混沌工程是一个被广泛应用的领域,它是一种可靠的手段,可以提前为这种故障做好准备。

能够预测系统故障实际上是一个悖论,因为没有办法准确地确定系统故障的触发因素的出现。随着混沌工程对混沌测试阶段的扩展,可以建立更有弹性的软件系统,以承受复杂和沉重的计算负荷。

在这篇文章中,我们将深入了解混沌工程的基本原理,以及它如何应用于开发健壮的软件系统。我们还将探讨混沌工程如何帮助缓解生产过程中出现的不确定和不稳定的情况。

什么是混沌工程?

混沌工程从根本上说是在软件系统中手动引入故障,以最终通过每次迭代来建立系统的弹性的做法。

虽然它听起来像一个杂乱无章的过程,但在运行这种故障注入的实验背后有很多纪律和数据驱动。

这种做法主要是由网站可靠性工程(SRE)团队应用的,目的是最大限度地延长系统的正常运行时间,为终端用户提供无缝体验。混沌工程也有助于实现与软件开发敏捷性有关的领先的DevOps目标,避免沿途的路障。

随着更多计划中的故障点被放置在软件系统中,中断可以在导致重大系统停机之前被迅速识别。在某种程度上,通过增加自动化,并在SRE团队的技能组合中增加一些内容,可以实现混沌工程的结果。

混沌工程的重要性是什么?

一些传统的系统可靠性测试范式把反应过程放在弹性建设战略的最前沿。这些往往更注重事后的行动,如事件管理和停机后的系统恢复。

混沌工程方法的目的是在系统问题出现之前最终缓解它。它涉及到在系统的流程中建立各种点,作为防止某些预定的系统错误的故障保险。混沌工程的主要目标包括以下几个方面:

  • 探索和防止技术债务的可能性。
  • 提高在软件系统上合作的团队的可信度,以及对系统本身的更多信任。
  • 在识别系统故障点或触发器方面,用插件和集成来覆盖所有的基础。
  • 建立系统的可靠性和弹性,并促进SRE团队更多的基于实验的学习。

客户成功案例。为一家印度的独角兽电子商务门户网站进行性能和可扩展性测试

混沌工程的简史

当使用大规模分布式互联网系统的技术集团需要为潜在的故障制定故障安全策略时,就出现了对混沌工程或混沌测试工具和团队的需求。最早使用混沌工程工具的是Netflix、Facebook和Alphabet,它们使用复杂的系统架构并处理Yottabytes的数据。

Chaos Monkey是Netflix工程工具团队在2010年首创的混沌工程,以防止Netflix的流媒体体验被打断。在这之后,亚马逊网络服务(AWS)提供的云基础设施中的一个实例的损失不会导致最终用户体验的任何停止。

2012年,Netflix在GitHub上发布了混沌猴的代码后,整个科技行业涌现出了几个小型的混沌工程项目。2014年,Netflix提出了一个专门的混沌工程师的角色,它起飞了,并被谷歌和Facebook等大型科技公司采用,成为一个主流。

2018年见证了有史以来第一次公开会议Chaos Conf,在接下来的两年里,同样的会议出席人数增长了10倍。2020年,亚马逊将混沌工程加入其良好架构框架(WAF)基准的可靠性支柱中。所有这些都在2021年世界上第一份混沌工程状况报告中达到了高潮,该报告介绍了这种做法在科技行业中的意外增长。

混沌工程的原则是什么?

在实施混沌工程时,只有遵循某些最佳实践原则,才能实现最佳情况。在过去的十年中,这些原则得到了实施和完善,使今天的混沌工程团队能够最大限度地实现预期结果。通过不断的实验过程,我们得出了以下混沌工程原则:

1)基准稳定状态

与其拆解系统的固有特性,不如将重点转移到其可量化的输出上。对潜在产出的短期量化是对系统的实际定义良好的稳态的一种弱的替代。可能的吞吐量、误差率和延迟百分比是一些可用于测量和基准化稳态行为的系统范围内的指标。

2)基于事件的变量

混沌变量最好能代表现实生活中的实际发生情况。这些事件需要根据其潜在的影响或预期的发生频率进行重新排列。与故障有关的事件,如软件系统的服务器发生故障,以及非故障事件,如在线流量的增加或扩展事件,都可以作为混沌工程的变量。

3)生产级别的自动实验

手动进行实验是劳动密集型的,从长远来看最终是不可持续的。系统会根据周围的环境和交通模式做出不同的反应。正确记录请求流的唯一可靠方法是对真实流量进行采样,因为与资源利用相关的行为随时都会发生变化。自动化通过混沌工程被整合到系统中,以加快实施以及分析工作。

4)受控的爆炸半径

如果你在为你的软件系统进行实验时发现了一个潜在的故障,你可以叫它一天,继续前进。如果不是,你需要增加爆炸半径,也就是系统内的实验范围。生产实验可能会让客户承受不必要的痛苦。混沌工程师有责任确保将实验的后果控制在最小范围内,并加以控制,尽管必须对某些短期逆境有一定的灵活性。

5大混沌工程工具

随着越来越多的大型科技实体采用混沌工程范式,这种新兴的SRE策略在过去十年中获得了很大的成熟度。围绕这一战略的一些最佳实践已经实现,导致了高效的混沌工程工具的引入。以下是目前市场上最好的工具。

1)Gremlin

这是世界上第一个有管理的企业混沌工程服务。可以通过至少三种攻击模式来检查系统的弹性,并且可以作为软件即服务(SaaS)的解决方案来使用。根据预期的最佳结果,混沌工程团队可以选择决定测试哪种攻击。对于软件系统基础设施的全面评估,Gremlin还提供了与其他工具一起进行测试的选项:

优点

  • 可同时对攻击进行测试
  • 可定制的用户界面,用于各种攻击
  • 提供CLI、API和UI自动化功能

缺点

  • 完整版本需要支付许可费
  • 内部代码不可定制
  • 报告功能是不存在的

2)混沌工具箱

Chaos Toolkit是一个直观的基于命令行界面(CLI)的工具,帮助混沌工程团队进行合作和运行混沌实验。由于它以JSON和YAML文件的形式声明和存储混沌变量,协调和分析代码的工作就像其他基于CLI的编码方法一样进行。报告和系统故障调度是工具包程序中高度可定制的功能:

优点

  • 它可通过其开源的API进行扩展
  • 在任何CI/CD工作流程中简单嵌入,实现自动化

缺点

  • 需要安装Python才能运行
  • 只对CPython进行了测试
  • 需要几个扩展来实现全面的接口

3)Chaos Mesh

Chaos Mesh是一个云端原生的开源工具,使用广泛的可能的故障模拟。这个工具可以确定整个开发、测试和生产阶段的系统畸变。DevOps工作流程可以轻松嵌入Chaos Mesh,在Kubernetes环境中利用混沌实验。网络延迟、资源利用率和分布式系统是一些可以在该服务的帮助下进行优化的系统参数:

优点

  • 平坦的学习曲线
  • UI支持多种配置
  • 根据需要暂停/重启实验

缺点

  • 没有严格的攻击时间安排
  • 安全风险增加

4)混沌猴

Chaos Monkey是Netflix Engg Tools团队在2010年推出的第一个混沌工程解决方案,引发了混沌工程革命。在过去的十年中,它经历了一系列的升级,已经成熟为一个工具,为软件系统准备各种连续的不可预测的攻击。你可以很容易地安排攻击,并对整个程序进行细化监控:

优点

  • 易于调度和监控
  • 没有许可费用,因为它是完全开源的
  • 可追踪的历史记录

缺点

  • 需要理解和编写自定义Go代码
  • 一次只能做一种类型的实验,爆炸半径有限

5)Litmus

这是一个开源的故障注入工具,用于云原生环境和基础设施。Litmus使混沌工程师能够通过在Kubernetes内创建和分析混沌来识别系统故障,以便与CI/CD管道合作的系统能够轻松进行故障实验。所有的混沌实验,随后的补救措施都是在软件系统进入全面生产之前进行的。实验集群可以进行,同时能够确定系统内部代码中的个别bug和用户界面的限制:

优点

  • 定期的系统健康检查
  • 错误检测和弹性检查是自动化的
  • 集中的实验资源库

缺点

  • 学习曲线很陡峭
  • 跟踪和管理权限不是很方便
  • 在企业内设置多个账户的问题比较复杂

混沌测试的好处是什么?

在过去的十年里,混沌工程或混沌测试可以互换使用,发展了基于集群的大规模软件系统的适应性。Alphabet、Netflix和Facebook等科技巨头已经能够提高他们的流媒体能力,改善客户体验,并减少修复系统故障的时间。一些最经常观察到的优势包括以下几点:

  • 在故障之前、期间和之后监测系统数据,往往会得到更多的认识。这反过来有助于系统从实际故障中恢复,但它也为进一步的调查和弹性建设提供信息。
  • 仅仅在系统的代码中加入一个检查,下游的故障和崩溃的严重性就可以大量减少。在系统重启和后续分析之后,生产系统的新信息很快就可以得到。
  • 平均恢复时间(MTTR)的信心水平会增加,因为在每次故障发生后真正进行改进时,系统的端到端能力会得到极大的提升。
  • 混沌工程师可以更有创造力,产生有针对性的但又是随机的故障,这些故障是专门用来影响生产环境的某个区域的。
  • 可以在不降低系统性能、阻止用户访问部分网络或删除微服务的情况下,识别、分析和报告故障和触发系统停机的原因。

混沌测试的最佳实践

混沌测试的最佳方法是在持续测试的基础上制定的,并且在是否应用于基础设施、网络和应用层方面有所不同,具体如下:

基础设施层:在这一层,混沌测试通过预测生产故障来工作。这是通过复制不同的可用区、区域等的实例来实现的,不提供中止或回滚功能。生产或类似生产的环境是主要的实施区域。

网络层:网络设置的方式是模拟能够支持在连接中产生故意故障的条件。在进入网络层之前,应用程序本身应该是没有缺陷的,但有随机混乱的空间。整个网络层的噪音以及中断的连接都可以模拟成混乱。

应用层:在软件系统的早期开发阶段,混沌工程的原则被系统地实施。测试中的软件开发工程师(SDET)和其他开发人员是应用层中混沌测试的主要推动者。也可以咨询运营团队和产品所有者,以引导故障注入和混沌工程举措的正确方向。

另请阅读什么是动态应用安全测试(DAST)?

结论

如果混沌工程被灌输到企业软件开发的工作流程中,就可以确保更高水平的系统正常运行。终端用户对软件的体验变得精简和不间断。混沌工程策略使混沌测试人员和开发人员能够对网络带宽的意外快速波动、API超时和系统故障的快速修复已经准备就绪。

流媒体平台可以确保下载和流媒体从暂停的地方恢复,没有延迟。实施这样的持续测试策略和先进的软件开发方法,需要经常向正确的专家咨询。Daffodil的软件开发服务是您实施最新方法以确保高质量软件交付的最佳选择。