什么是混沌工程?

您的客户、客户、访客,甚至内部员工,都依赖您的系统随时运行、可用和执行。 在一个完美的世界中,当系统、应用程序和服务下降时,永远不会有一个术语,但这不是一个完美的世界,不幸的是,有时事情没有按计划进行。 中断和停机时间可能会使公司损失数百万美元。 有时,最好的计划是意外的计划,这正是混乱工程试图解决的。 混沌工程,也称为混沌测试,可以被认为是一个学科,或方法,测试和建立一个系统,可以承受意外的失败或条件。

随着 DevOps 实践的出现,从初创公司到企业的组织在开发工作流程中慢慢采用了自己的混沌测试实践。 无论是由特定团队进行混沌工程,还是作为 现场可靠性工程师 (SREs)职责的一部分,混沌工程的实践旨在发现系统、应用程序和服务中隐藏的弱点,确保它能够承受最极端的情况,实现完全的弹性。

混沌工程与性能测试

压力测试或负载测试,混沌工程通过创建异常或不稳定的环境帮助团队识别断点或故障。 然而,混沌工程与 性能测试 之间的一个关键区别是,混沌工程不仅侧重于几个关键部件,而且可以由看似无限数量的因素组成,超出正常和明显的测试考虑范围。 在大型分布式网络环境中,系统可能会因各种原因而失败,这些原因与其他环境相比不容易发现。 发现这些漏洞有助于团队了解弱点的位置,以防止这些潜在的故障发生。

 

混沌(工程)诞生

混乱工程的实践起源于 Netflix 在 2008 年左右, 因为他们已经正式推出了他们的流媒体服务。 在 2011 年左右出现数据库腐败问题后,Netflix 计划通过 AWS(亚马逊网络服务)将其数据中心过渡到云。 事实上,他们花了八年时间才最终完成迁移。 2015 年,AWS 经历了一次中断,导致 Netflix 中断数小时。 这是云计算的早期,所以它不像现在这样强大、稳定、安全。 当他们发现迁移到云并没有产生他们期望的一些好处,如可扩展性、运行时间、避免单点故障、自动缩放等时,他们决定需要一种方法来测试这些意外问题,以确保他们的服务启动和运行,并最终避免对用户的影响并导致挫折。 从这次经历中,混乱工程诞生了。

 

混沌工程原理与步骤

混沌工程并不寻求制造混乱只是为了制造混乱。 相反,它基于一套精确的原则和步骤,旨在深思熟虑地创建计划和实验,以学习如何在大型分布式系统和网络中降低风险的唯一目的。 下面列出的步骤是创建混乱实验的一般准则。

 

第 1 步:创建假设

这包括对系统在引入不稳定因素和条件时与正常环境相比如何响应做出一般假设。 这也是您确定在混沌实验中要测量哪些指标(如误差率、延迟、吞吐量等)的地方。

 

第 2 步:识别变量和预期效果

考虑当这些假设事件发生在现实生活中时会发生什么。 例如,如果您的服务器意外崩溃或流量显著增加,将对您的整个系统产生什么影响?

 

第 3 步:启动实验

理想情况下,您希望在实时生产环境中运行您的混沌实验。 但是,必须制定保护措施,防止发生更坏的情况。 如果实验侧身进行,您希望确保您仍然能够控制环境。 这也被称为控制爆炸半径。 这些实验可以自动化,以便更好地分析,并且比手动执行实验更可持续。 有时使用的另一种方法是利用成熟的测试环境,但是,这可能无法反映现实世界中发生的情况。

 

第 4 步:测量影响

结果如何达到初始假设? 根据假设中设定的指标,实验是否过于有限,还是需要扩大规模以更好地识别错误和故障? 爆炸半径太有限了吗? 也许需要扩大规模,以设置那些在现实生活中可能发生的故障。 这个实验也可能发现其他需要研究的问题。

 

混沌工程工具

让我们回到与 Netflix 的混乱工程的介绍。 一旦他们决定继续进攻,并开始为工程团队投入资源的过程,他们需要创建一套正规的做法和工具,以帮助工程团队进行混乱测试。 Netflix 推出的早期应用程序之一称为混沌猴子。 每天,此应用程序会随机选择一组聚类,并在一天中的某个时间关闭该实例,以观察其余系统的反应。 显然,这给每天需要处理网络头痛的工程团队带来了痛苦的体验,但最终,它使团队能够更好地了解这些中断的影响,不仅涉及他们的网络,而且了解对用户的影响。

虽然将资源和个人用于”打破”事物似乎有悖常理,但主动执行这些混乱测试有助于构建更具弹性的网络并创建更好、更可靠的用户体验。 现实世界在受控测试环境中不起作用。 自混沌猴问起,它经历了几次更新,并已成为一个流行的开源应用程序。 曾几时,这只是被称为”西米安军”的混乱工程工具套件的一部分。 Simian 陆军套房于 2018 年解散,但包括以下特定任务的混沌工程公用事业:

 

混沌孔

混沌孔旨在模拟一个完整的 AWS 区域被丢弃或删除,以查看系统如何恢复和响应,将流量移动到不同的区域,而不会性能下降。 同样,这种情况很少发生,但在混乱工程的范围内,没有什么是越界。

 

符合猴子

合规猴子是一种在 AWS 中运行的服务,目的是识别不符合预定规则的实例。 已识别任何不符合规则的实例,这些实例具有足够灵活,可以定制并设置为以不同频率运行,并且会向所有者或组发送电子邮件通知。 顺从猴子已经转移到斯宾纳克服务。

 

混沌大猩猩

混沌大猩猩就像混沌猴子,但规模更宏大。 混沌大猩猩没有模拟单个 AWS 实例上的故障,而是模拟了整个 AWS 区域的故障。 此实用程序旨在显示不同地区的大规模灾难如何影响用户或客户,非常适合 Netflix 的基础设施和商业模式的建立。 如果云平台能够通过适当确保负载平衡器做出适当响应和服务保持中断来经受住此测试,则它可以承受任何抛出的东西。

 

延迟猴子

延迟猴子,顾名思义,用于测试服务对网络延迟,或完全失败,以帮助识别服务,及其依赖性,如何回应这些模拟延迟。 但是,与一般 Web 服务一样,其他应用程序中可能存在未知的后果,乍一看可能不容易识别,这就是为什么像 Latency Monkey 这样的实用程序对于衡量跨服务的容错性如此重要。

 

猴子医生

Monkey 医生实用程序用于跨每个实例执行健康检查,并监控整个系统的健康(CPU 负载、内存、资源等)。 此外,Monkey 医生可以报告实例状态,并删除它认为不适合整个系统的任何实例服务。

 

10-18 猴子

10-18 猴子的名称来自本地化、国际化和本地化的缩写 L10n 和 i18n。 这些数字表示第一个字母和最后一个字母之间的字母数。 由于 Netflix 客户遍布世界各地,拥有一种方法来监控其流媒体服务在不同地区的可靠性至关重要。 10-18 Monkey 实用程序的优势在于,它可以检查多个地理区域的配置和性能问题,这些区域服务和使用不同的语言和字符集。

 

贾尼托猴子

那些未使用的 AWS 资源呢? 输入珍妮特猴子。 Janitor 猴子实用程序的目的是查找和删除未使用的资源。 像混沌猴子一样,它也是可定制的和可扩展的,足以与其他云提供商一起使用。 用户提供一套规则,Janitor Monkey 开始工作,识别那些未使用的资源、组和卷,这些资源、组和卷是清理和清除的候选项,并发出通知。 随着时间的推移,功能被一种名为 Swabbie 的新服务所取代。

 

结论:混沌工程 – 原理、示例和工具

随着时间的推移,混乱工程已经发展成为它自己的成熟行业。 现在有无数的开源和商业工具,如利特穆斯混沌,格林林,混沌网,等等,组织可以利用。 构建弹性系统不仅仅针对技术公司。 分布式系统变得更加复杂,这意味着故障更难预测。 此外,由于各种监管和合规问题,银行、政府实体、制药公司、教育机构等需要定期测试其系统和服务,以确保它们满足业务和任务的关键要求。 性能测试和混沌测试是学习如何通过观察故障构建弹性系统的主动方法。