混沌工程:打破现实

现代分布式系统,尤其是在云计算领域内,已经变得如此复杂且不可预测,以至于无法可靠地识别出所有可能出问题的事物,已经不再可行。 从不良的配置推送到硬件故障,再到流量突然激增带来意想不到的结果,可能出现的故障数量太大,以至于没有完美的分布式系统。 如果无法达到完美,还有什么要争取? 弹性。

“云完全是关于冗余和容错的。 由于没有任何单个组件可以保证100%的正常运行时间(甚至最昂贵的硬件最终都会出现故障),因此我们必须设计一种云架构,其中单个组件可以在不影响整个系统可用性的情况下发生故障。 实际上,我们必须比最薄弱的环节更强大。” Netflix解释道。

要确定单个组件的故障不会影响整个系统的可用性,有必要在实践中体验该故障,最好以一种现实的,完全自动化的方式进行。 在对系统进行了足够数量的故障测试之后,并且解决了所有发现的弱点后,该系统很可能具有足够的弹性,可以在生产中继续使用。

Netflix说:“这是我们构建Chaos Monkey时的理念,该工具会随机禁用我们的生产实例,以确保我们能够克服这种常见的故障而不会受到任何客户的影响。” Netflix在生产中进行了弹性测试的早期实验已经诞生进入软件工程的新学科:混沌工程。

什么是混沌工程?

Chaos Engineering背后的核心思想是故意破坏事物以发现并修复弱点。 Netflix将Chaos Engineering定义为自动故障测试领域的先驱,该公司最初将Chaos Engineering正式定义为Chaos Engineering原理中的一门学科,是在分布式系统上进行实验的学科,旨在建立对分布式系统的信心。系统在生产中承受动荡条件的能力。

混沌工程公司承认,我们生活在一个不完美的世界中,这里的事物出乎意料地破灭,而且往往是灾难性的。 知道了这一点,我们可以做出的最有生产力的决定就是接受这一现实,并专注于创建可以抵抗故障的优质产品和服务。

专业的基础架构开发人员Mathias Lafeldt目前正在Gremlin Inc.进行远程工作。他说:“构建弹性系统需要经验丰富的失败。 等待生产中断的方法是不可行的。 我们应该以可控的方式主动注入故障,以获得对我们的生产系统可以承受这些故障的信心。 通过预先模拟潜在的错误,我们可以验证我们的系统是否按预期运行,如果不行,请进行修复。”

为此,我们正在构建反脆弱性的系统,该术语是从纳西姆·尼古拉斯·塔勒布(Nassim Nicholas Taleb)2012年的书中借用的,该书的标题为“反脆弱:从混乱中获得收益”。黎巴嫩裔美国散文家,学者,统计学家,前商人,风险分析师在介绍这本书时说:“有些事情会从冲击中受益; 当他们面对波动,随机,混乱和压力,并喜欢冒险,冒险和不确定性时,它们会蓬勃发展。 然而,尽管这种现象无处不在,但对于脆弱的确切对立面却没有字可言。 让我们称之为抗脆弱性。 抗脆弱性不只是弹性或坚固性。 弹性能抵抗冲击并保持不变; 抗脆性会变得更好。”

拉费尔特(Lafeldt)在他的博客上举了另一个抗脆弱性的例子:“接种疫苗-我们将有害物质注入复杂的系统(有机体)中,以增强免疫力。 这很好地反映了我们的分布式系统,在该系统中,我们希望增强对硬件和网络故障,我们的依存关系下降或任何可能出错的东西的抵抗力。”

就像接种疫苗一样,将系统暴露于波动性,随机性,无序性和压力源的过程必须以深思熟虑的方式执行,以防万一出问题。 理想情况下,自动故障测试应该从可能产生的最小影响开始,随着所测试系统的恢复能力的增强,它会逐渐产生影响。

混沌工程的五个原理

“混乱”一词唤起了一种随机和混乱的感觉。 但是,这并不意味着您会随机或随意地进行混沌工程。 这也不意味着混乱工程师的工作就是诱发混乱。 相反:我们将混沌工程学视为一门学科。 特别是,我们将混沌工程学视为一门实验学科,”凯西·罗森塔尔(Casey Rosenthal),洛林·霍赫斯坦(Lorin Hochstein),亚伦·布洛豪亚克(Aaron Blohowiak),诺拉·琼斯(Nora Jones)和阿里·巴西里(Ali Basiri)在“混沌工程:通过实验建立系统行为的信心”一书中说道。

在他们的书中,作者提出了混沌工程学的以下五个原则:

关于稳态的假设

系统思维社区使用术语“稳定状态”来指系统倾向于将其保持在一定范围或模式内的属性。 在故障测试方面,被测系统的正常运行是系统的稳定状态,我们可以根据许多指标(包括CPU负载,内存利用率,网络I / O,需要多长时间)来确定什么是正常状态。服务Web请求,或在各种数据库查询中花费了多少时间,等等。

“一旦有了指标并了解了它们的稳态行为,就可以使用它们来定义实验的假设。 考虑将不同类型的事件注入系统后稳态行为将如何变化。 如果将请求添加到中间层服务,则稳定状态会被破坏还是保持不变? 如果受到干扰,您希望系统输出增加还是减少?”作者问。

各种真实世界的事件

混沌实验的合适事件包括能够破坏稳态的所有事件。 这包括硬件故障,功能错误,状态传输错误(例如,发送方和接收方节点之间的状态不一致),网络延迟和分区,输入(上下)的大波动和重试风暴,资源耗尽,异常或不可预测的组合服务间通信,拜占庭式故障(例如,一个节点认为它实际上没有最新数据),竞争条件,下游依赖项故障等。

“仅诱发您期望能够处理的事件! 引发实际事件,而不仅仅是失败和延迟。 尽管提供的示例集中于系统的软件部分,但是人类在弹性和可用性方面起着至关重要的作用。 对人为控制的事件响应(及其工具!)进行试验也将提高可用性。”作者警告说。

进行生产实验

Chaos Engineering倾向于直接对生产流量进行实验,以确保系统运行方式的真实性和与当前部署系统的相关性。 这与经典测试的普遍宗旨背道而驰,经典测试力求找出尽可能远离生产的问题。 自然,人们需要对被测系统对注入事件的恢复能力有很大的信心。 对现有弱点的了解表明该系统缺乏成熟度,需要在进行任何混沌工程实验之前加以解决。

“当我们进行传统的软件测试时,我们正在验证代码的正确性。 我们对函数和方法的行为方式有很好的认识,并且编写测试来验证这些组件的行为。 当我们进行混沌工程实验时,我们会对整个整体系统的行为感兴趣。 代码是系统的重要组成部分,但是我们的系统不仅仅包含代码。 特别是,状态和输入以及其他人的系统导致了各种难以预料的系统行为。”作者写道。

自动化实验可连续运行

自动化是混沌工程的重要支柱。 混沌工程师可以自动执行实验,分析实验结果,有时甚至可以自动创建新实验。 也就是说,一次性手动实验是从失败测试开始的好地方。 经过几批精心设计的手动实验后,我们可以期望的下一个自然水平是它们的自动化。

“设计混沌工程实验的挑战不是确定导致生产中断的原因,因为事件跟踪器中的数据具有该信息。 我们真正想做的是确定不应该导致生产中断的事件,以及从未导致生产中断的事件,并不断设计实验以验证情况仍然如此。”作者强调要注意的事项设计自动化实验时

最小化高炉半径

重要的是要意识到每个混乱的实验都有可能造成真正的破坏。 设计不良的混沌实验与设计良好的混沌实验之间的区别在于爆炸半径。 如何最小化任何混乱实验的爆炸半径的最基本方法是始终采用紧急停止机制,以在实验失控时立即关闭实验。 应当通过谨慎,可衡量的风险在彼此之间建立混乱的实验,这些风险会逐渐扩大测试的总体范围,而不会造成不必要的伤害。

“如果实验的工具和仪器本身对关注指标产生不适当的影响,那么混沌工程的整个目的就会受到损害。 我们希望建立对系统的弹性的信心,这是一次很小的且可控制的故障,”书中的作者警告说。

NETFLIX的混乱

自从公司于2008年开始将数据中心移出云服务以来,Netflix一直在生产中进行某种形式的弹性测试。第一个在Netflix办公室外广受赞誉的Chaos Engineering工具是Chaos Monkey,目前版本为2.0。

“几年前,我们决定提高微服务架构的弹性。 以我们的规模,可以保证我们云平台上的服务器有时会突然失效或消失而不会发出警告。 如果我们没有适当的冗余和自动化功能,这些消失的服务器可能会导致服务问题。 Netflix的“自由与责任”文化没有一种机制可以迫使工程师以任何特定方式构建其代码。 取而代之的是,我们发现可以通过消除服务器消失的痛苦并将这种痛苦向前推进,从而围绕弹性建立牢固的一致性。 我们创建了Chaos Monkey,以便在生产环境中随机选择服务器,并在工作时间内将其关闭。” Netflix解释说。

Chaos Monkey关闭服务器的速率高于正常情况下服务器中断的速率,并且Chaos Monkey配置为在生产时间内关闭服务器。 因此,工程师被迫通过自动化,冗余,后备和其他弹性设计最佳实践来构建弹性服务。

虽然还允许早期版本的Chaos Monkey执行诸如消耗CPU并使存储设备脱机等操作,但Netflix使用Chaos Monkey 2.0仅终止实例。 Chaos Monkey 2.0与Netflix的开源多云连续交付平台Spinnaker完全集成,该平台旨在使扩展和增强云部署模型变得容易。 与Spinnaker的集成允许服务所有者通过Spinnaker应用程序设置其Chaos Monkey 2.0配置,而Chaos Monkey 2.0可以从Spinnaker获取有关如何部署服务的信息。

Netflix意识到有意打破事物以重建更好的巨大潜力后,该公司决定将事物推向新的高度,并通过在2013年发布Chaos Kong,将规模从小规模扩展到超大规模。测试某个区域或整个区域被拆除时其服务的行为。 Netflix工程师Nir Alfasi表示,该公司几乎每个月都会使用Kong进行区域中断。

“我们需要一种方法来限制故障测试的影响,同时仍然以现实的方式破坏事物。 我们需要控制结果,直到我们确信系统会正常降级,然后再增加它以应对大规模故障。 这是FIT(故障注入测试)出现的地方。” Netflix意识到自己在故意破坏事物时需要比当时现有工具允许的更好的控制水平,于2014年初表示。 FIT是旨在简化Netflix生态系统内故障的产生的平台,具有更高的精确度。 FIT还允许Netflix以一致且受控的方式在整个Netflix中传播故障。 “事实证明,FIT有助于弥合孤立测试与大规模混乱练习之间的鸿沟,并使此类测试成为自助服务。”

一旦Netflix的Chaos Engineering团队认为他们在小规模(Chaos Monkey)和大规模(Chaos Kong)以及介于两者之间(FIT)都有一个好故事,就该将Chaos Engineering规范化为实践了,这发生在中期-2015年出版了《混沌工程原理》。 “通过这种新的形式化,我们在Netflix上推动了Chaos Engineering的发展。 我们为造成混乱的问题制定了蓝图:我们知道目标是什么,我们知道如何评估我们是否做得很好。 这些原则为我们提供了将混沌工程学带入更高层次的基础,” Casey Rosenthal,Lorin Hochstein,Aaron Blohowiak,Nora Jones和Ali Basiri在“混沌工程学:通过实验建立系统行为的信心”中写道。

Netflix的Chaos Engineering工具系列的最新显着新增功能是2016年底推出的ChAP(混沌自动化平台)。“我们很高兴宣布ChAP,这是我们混沌工具家族的最新成员! Chaos Monkey和Chaos Kong确保了我们对实例和区域故障的适应能力,但是对可用性的威胁也可能来自微服务级别的中断。 FIT旨在在生产中注入微服务级故障,而ChAP则旨在克服FIT的局限性,因此我们可以提高安全性,节奏和实验范围。

尽管Netflix不是唯一对Chaos Engineering感兴趣的公司,但他们公开发展并与他人共享的意愿对该行业产生了深远的影响。 Netflix的GitHub页面除了定期在各种行业活动上发表演讲外,还包含大量有趣的开源项目,可供采用。

Etsy,Microsoft,Jet,Gremlin,Google和Facebook也采用了Chaos Engineering,仅举几例。 这些公司和其他公司针对不同的用例开发了广泛的开源工具。 这些工具包括Simoorg(LinkedIn自己的故障诱发器框架),Pumba(用于Docker的混沌测试和网络仿真工具),Chaos Lemur(可自行托管的应用程序,用于在BOSH管理的环境中随机破坏虚拟机)和Blockade(一个Docker)。实用程序,用于测试分布式应用程序中的网络故障和分区(仅举几例)。

学习拥抱混乱

如果您现在受到启发以接受上述原理和工具来创建自己的混沌工程实验,则可能需要遵循以下混沌工程实验设计过程,如“混沌工程:通过以下方法建立系统行为的信心”中概述的那样实验。

1.选择一个假设

  • 确定要测试的假设,不要忘记您的系统包括参与维护该系统的人员。

2.选择实验范围

  • 努力进行生产实验并最大程度地减少爆炸半径。 测试离生产越近,您将从结果中学到的越多。

3.确定您要观看的指标

  • 尝试使用指标尽可能多地实施假设。 如果实验产生的影响比您预期的严重,请及早放弃。

4.通知组织

  • 向组织成员通知您正在做什么,并与对结果感兴趣并且对实验的影响感到不安的多个团队进行协调。

5.运行实验

  • 下一步是运行实验,同时密切关注指标,以防您需要中止实验。

6.分析结果

  • 仔细分析实验结果,并将实验结果提供给所有相关团队。

7.扩大范围

  • 一旦您对进行较小规模的实验有信心,您可能希望扩大实验范围,以揭示较小规模的实验所不明显的系统性影响。

8.自动化

  • 您越频繁地运行混沌实验,就可以从中获得更多价值。

由于某种程度的混乱和不可预测性是不可避免的,为什么不接受它呢? “下一步是使混乱制度化,也许是通过拥抱Netflix的开源Simian Army。 但是,[拥抱混沌工程]确实不是技术问题,而是文化。 让您的开发人员期望并促进故障发展,以将弹性提高到您的云系统中,这是21世纪工程开发道路上的一大步。 是时候开始了,” Matt Asay关于该主题的文章总结道。

结论

混沌工程学是一门非常有价值的学科和实践,可以帮助任何企业或组织建立一个能够应对其可能面临的所有挑战和逆境的弹性分布式系统。 混沌工程可以在任何规模和任何自动化水平上执行。 尽管它还很年轻,但是Chaos Engineering已经改变了我们对失败测试的看法,而且由于有了Netflix这样的公司,对于想要亲身体验Chaos Engineering所提供的第一手资料的人,还提供了大量的Chaos Engineering测试。 。