失败是不可避免的。磁盘失败。软件bug潜伏着等待合适的条件来攻击。犯错误的人。数据中心是建立在不可靠的商用硬件上的。如果您在云环境中运行,那么其中许多因素都不在您的控制范围之内。更复杂的是,失效是不可预测的,并且发生的概率和频率不均匀。缺乏统一的频率增加了系统中的不确定性和风险。面对这种不可避免和不可预测的故障,您如何构建一个可靠的服务,为您的用户提供高级别的可用性?
一个朴素的方法可以试图通过严格的分析来证明一个系统的正确性。它可以模拟所有不同类型的故障,并通过模拟或分析真实操作环境的另一个理论框架推断出系统的正确工作方式。不幸的是,行业中的静态分析和测试技术还没有达到这些能力。4
另一种方法可以尝试创建详尽的测试套件,在单独的测试环境中模拟所有失败模式。每个测试套件的目标是维护每个组件的正常功能,以及当单个组件出现故障时整个系统的正常功能。大多数软件系统以一种或另一种形式使用这种方法,并结合了单元测试和集成测试。更高级的用法包括测量测试的覆盖面以指示完整性。
虽然这种方法确实提高了系统的质量,并可以防止大量的故障,但它在大规模分布式系统中维持弹性方面是不够的。分布式系统必须应对数据和信息流带来的挑战。设计和执行正确捕获目标系统行为的测试的复杂性比构建系统本身的复杂性要大。在此基础上再加上大规模的属性,以目前的手段,在保持高创新速度和特性交付的同时,在实践中实现这一点变得不可行。
另一种方法,在这篇文章中提倡,是诱导系统的失败,以经验证明弹性和验证预期的行为。考虑到系统设计具有抗故障能力,在原始设计参数中引入这些故障,验证了系统的预期行为。因为这种方法使用实际的动态系统,所以随着系统的发展和变化,出现的任何弹性缺口都可以被快速识别和捕获。在刚刚描述的第二种方法中,许多复杂的问题在测试环境中没有捕捉到,只有在实际环境中才会以独特和罕见的方式表现出来。这反过来又增加了潜在bug未被发现和积累的可能性,只会在正确的故障模式发生时造成更大的问题。通过失败诱导,在测试环境中对数据、信息流和部署架构的更改建模的需求被最小化了,并减少了错过问题的机会。
在深入讨论之前,让我们讨论一下什么是弹性以及如何提高弹性。
弹性是系统的一个属性,它使系统能够以一种不会导致整个系统失败的方式处理故障。它可能包括在故障发生时最小化爆炸半径,或者改变用户体验以绕过故障组件。例如,如果电影推荐服务失败,用户可以得到一个非个性化的热门电影列表。一个复杂的系统不断地发生不同程度的故障。弹性是指它能够从当前和未来的失败中恢复或绝缘的措施。7
有两种方法可以增加系统的弹性:
第一个项目在其他文献中有很好的论述。本文的其余部分将重点讨论第二点。
一旦你接受了经常导致失败的想法,接下来就有几个选择。一个选择是GameDays,1一组有计划的演习,其中失败是人工引入或模拟的,以反映真实世界的失败,目标是确定结果并进行相应的消防演习。GameDays被Amazon和谷歌等公司使用,它是一种很好的方法,可以在常规基础上诱导失败,验证关于系统行为的假设,并改进组织响应。
但是,如果您想要一个更可扩展和自动化的解决方案,而不是每季度运行一次,而是每周或甚至每天运行一次,该怎么办?你不希望失败是一场消防演习。你希望它是一个无关紧要的事情——一直在后台发生的事情,这样当真正的失败发生时,它就会融入其中,而不会产生任何影响。
实现这一目标的一种方法是设计在实际环境中发生故障。这就是“猴子”(实际上是自主代理,但猴子能激发想象力)的想法如何来到Netflix,造成破坏并导致失败。后来,这些猴子被聚集在一起,并被称为“猿军”。5下面是对每只与弹性相关的猴子的描述。
混乱的猴子.虚拟实例的故障是典型的公共云环境中最常见的故障类型。它可能是由主机机架中的电源中断、磁盘故障或网络分区切断访问引起的。不管原因是什么,结果都是一样的:实例变得不可用。诱导此类故障有助于确保服务不依赖于任何on-instance状态、实例关联或持久连接。
为了解决这一需求,Netflix创建了它的第一个猴子:Chaos monkey,它在生产环境中随机终止服务于实时客户流量的虚拟实例。3.
Chaos Monkey首先查看服务注册表,以找到所有正在运行的服务。在Netflix的案例中,这是通过Asgard的组合实现的6和埃达。2每个服务都可以覆盖缺省的Chaos Monkey配置,以更改终止概率或完全退出。每个小时,Chaos Monkey都会醒来,掷骰子,并使用Amazon Web Services (AWS) api终止受影响的实例。
当服务终止时,Chaos Monkey可以有选择地向服务所有者发送电子邮件,但大多数服务所有者不启用此选项,因为实例终止非常常见,不会导致任何服务退化。
混乱的大猩猩.使用Chaos Monkey,系统对单个实例的故障具有弹性,但如果整个数据中心变得不可用怎么办?如果整个亚马逊可用分区(AZ)下线,会对用户产生什么影响?为了回答这个问题,并确保这样的活动对客户的影响最小,Netflix创建了混沌大猩猩。
混乱大猩猩导致整个AZ失败。它模拟了两种故障模式:
混乱大猩猩造成了巨大的破坏,需要一个复杂的控制系统来重新平衡负载。对于Net flix来说,该系统仍在开发中,因此,Chaos Gorilla是手动运行的,类似于之前提到的GameDay练习。随着每一次连续的运行,Chaos Gorilla在执行失败的方式上变得更加积极,目标是像在Chaos Monkey中那样以自动无人看管的方式运行它。
混乱的香港.区域由多个数据中心(可用分区)组成,这些数据中心之间相互隔离。健壮的部署架构通过使用多个AZ实现AZ冗余。在实践中,确实会发生区域性故障,这使得单区域部署无法为区域性故障提供弹性。一旦一个系统冗余部署到多个区域,区域故障必须以类似的方式测试实例和可用分区。《混沌金刚》就是为了这个目的。Netflix正致力于通过《混沌金刚》让整个地区下线。
延迟的猴子.一旦Chaos Monkey运行,并且单个实例故障不再产生任何影响,就会出现一种新的故障类型。处理实例失败相对容易:只需终止坏的实例,让新的健康实例取代它们。当实例变得不健康,但仍在工作时,检测是更加困难的,对这种故障模式具有弹性也更加困难。错误率可能会提高,但服务偶尔会返回成功。服务可能响应成功,但延迟可能会增加,导致超时。
一个复杂的系统不断地发生不同程度的故障。弹性是指它能够从当前和未来的失败中恢复或绝缘的措施。
Netflix需要的是一种模拟部分健康实例的失败诱导方法。因此出现了Latency Monkey,它在RESTful客户端-服务器通信层中诱导人为延迟,以模拟服务退化,并衡量上游服务是否适当响应。此外,通过创建非常大的延迟、节点停机、甚至整个服务停机,可以在不停机的情况下模拟实例或服务。当通过模拟其依赖项的失败来测试新服务的容错能力时,这尤其有用,而且不会使这些依赖项对系统的其他部分不可用。
剩余的军队.猿猴军团的其他成员,包括管理员猴子,负责维护和其他与可用性没有直接关系的杂项任务。(详情,请参阅http://techblog.netflix.com/2011/07/netflix-simian-army.html.)
虽然类人猿军队是一个新的概念,可能需要转变观点,但它并不像最初看起来那样难以实施。了解Netflix的经历对其他有兴趣追随这条道路的人来说是一个示范。
Netflix以大胆地快速追求创新和高可用性而闻名,但并没有到麻木不仁的地步。要小心避免这些失败诱导练习对客户产生任何明显的影响。为了降低风险,Netflix在引入猴子时采取了以下步骤:
如果不强调监测的重要作用,关于恢复力的讨论就不完整。监控这里指的是能够观察系统及其组件的外部和内部状态,并可选地发出警报。在故障诱导和恢复的背景下,监测是重要的两个原因:
在一个影响客户的事件中,首先要问的最重要的问题之一是:“发生了什么变化?”因此,监视和可观察性的另一个关键方面是记录系统状态变化的能力。无论是新代码部署、运行时配置中的更改,还是外部使用的服务的状态更改,都必须记录这些更改,以便稍后检索。Netflix为此建立了一个内部名为Chronos的系统。任何改变系统状态的事件都被记录在Chronos中,可以快速查询以帮助确定因果关系。
坚韧地面对失败是一个崇高的目标。它使系统能够生存并经受住失败。然而,还有一个更高的目标值得我们去奋斗:让系统在每次失败后变得更强大、更好。用纳西姆•塔勒布(Nassim Taleb)的话说,它可以成为antifragile从每一个相继的压力、干扰和失败中成长壮大。8
Netflix采取了以下步骤来创建一个更抗脆弱的系统和组织:
故障发生得越频繁,系统和组织就越有准备,能够以透明和可预测的方式处理它。诱导失败是确保系统和组织弹性的最佳方法。我们的目标是最大限度地提高可用性,使服务的用户免受故障的影响,并提供一致的可用用户体验。弹性可以通过增加故障的频率和种类来提高,并改进系统以更好地处理每一个新发现的故障,从而增加抗脆弱性。注重学习和培养无可指责的文化是在系统中创造适当反馈的重要组织因素。
相关文章
在queue.acm.org
自动化软件故障报告
布伦丹·墨菲
http://queue.acm.org/detail.cfm?id=1036498
保持比特安全:有多难?
大卫·s·h·罗森塔尔
http://queue.acm.org/detail.cfm?id=1866298
监控,为您服务
比尔·霍夫曼
http://queue.acm.org/detail.cfm?id=1113335
1.ACM。弹性工程:学会接受失败。Commun。ACM 55, 11(2012年11月),4047;http://dx.doi.org/10.1145/2366316.2366331.
2.Bennett, C. EddaLearn您的云部署的故事。Netflix科技博客;http://techblog.netflix.com/2012/11/edda-learn-stories-of-your-cloud.html.
3.班尼特,c,和塞特林,a,混乱的猴子被释放到野外。Netflix科技博客;http://techblog.netflix.com/2012/07/chaos-monkey-released-into-wild.html.
4.钱德拉,t.d., Griesemer, R.和雷石东,J.帕克索斯创造了生活:工程学的观点。在第26届ACM分布式计算原理年会论文集(2007), 398407;http://labs.google.com/papers/paxos_made_live.pdf.
5.伊兹瑞耶夫斯基(Izrailevsky)和塞特林(Tseitlin)。Netflix科技博客;http://techblog.netflix.com/2011/07/netflix-simian-army.html.
6.Sondow, J. Asgard:基于web的云管理和部署。Netflix科技博客;http://techblog.netflix.com/2012/06/asgard-web-based-cloud-management-and.html.
7.容错和弹性:含义、措施和评估。伦敦城市大学软件可靠性研究中心,伦敦,英国,2009;http://www.csr.city.ac.uk/projects/amber/resilienceFTmeasurementv06.pdf.
©2013 0001 - 0782/13/08 ACM
如果您不是为了盈利或商业利益而制作或分发本作品的部分或全部,并在第一页注明本通知和完整引用,则允许您免费制作本作品的部分或全部数字或纸质副本,供个人或课堂使用。本作品的组成部分必须由ACM以外的其他人享有版权。信用文摘是允许的。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,需要事先获得特定的许可和/或费用。请求发布的权限permissions@acm.org或传真(212)869-0481。
数字图书馆是由计算机协会出版的。版权所有©2013 ACM有限公司
没有发现记录