大规模分布式软件系统的发展正在改变软件工程。作为一个行业,我们很快采用了提高开发灵活性和部署速度的实践。紧随着这些优点的一个迫切问题是:我们对投入生产的复杂系统有多少信心?
即使分布式系统中的所有单个服务都正常运行, 这些服务之间的交互也会导致不可预知的结果。 这些不可预知的结果, 由影响生产环境的罕见且破坏性的事件复合而成,令这些分布式系统存在内在的混沌。
我们需要在异常行为出现之前,在整个系统内找出这些弱点。这些弱点包括以下形式:
当服务不可用时的不正确回滚设置;
不当的超时设置导致的重试风暴;
由于下游依赖的流量过载导致的服务中断;
单点故障时的级联失败等。
我们必须主动的发现这些重要的弱点,在这些弱点通过生产环境暴露给我们的用户之前。我们需要一种方法来管理这些系统固有的混沌, 通过增加的灵活性和速率以提升我们对生产环境部署的信心, 尽管系统的复杂性是由这些部署所导致的。
我们采用基于经验和系统的方法解决了分布式系统在规模增长时引发的问题, 并以此建立对系统抵御这些事件的能力和信心。通过在受控实验中观察分布式系统的行为来了解它的特性,我们称之为混沌工程。
混沌工程实践
为了具体地解决分布式系统在规模上的不确定性,可以把混沌工程看作是为了揭示系统弱点而进行的实验。这些实验遵循四个步骤:
首先,用系统在正常行为下的一些可测量的输出来定义“稳定状态”。
其次,假设这个在控制组和实验组都会继续保持稳定状态。
然后,在实验组中引入反映真实世界事件的变量,如服务器崩溃、硬盘故障、网络连接断开等。
最后,通过控制组和实验组之间的状态差异来反驳稳定状态的假说。
破坏稳态的难度越大,我们对系统行为的信心就越强。如果发现了一个弱点,那么我们就有了一个改进目标。避免在系统规模化之后被放大。
高级原则
以下原则描述了应用混沌工程的理想方式,这些原则基于上述实验过程。对这些原则的匹配程度能够增强我们在大规模分布式系统的信心。
建立一个围绕稳定状态行为的假说
要关注系统的可测量输出, 而不是系统的属性。对这些输出在短时间内的度量构成了系统稳定状态的一个代理。 整个系统的吞吐量、错误率、延迟百分点等都可能是表示稳态行为的指标。 通过在实验中的系统性行为模式上的关注, 混沌工程验证了系统是否正常工作, 而不是试图验证它是如何工作的。
多样化真实世界的事件
混沌变量反映了现实世界中的事件。 我们可以通过潜在影响或估计频率排定这些事件的优先级。考虑与硬件故障类似的事件, 如服务器宕机、软件故障 (如错误响应) 和非故障事件 (如流量激增或伸缩事件)。 任何能够破坏稳态的事件都是混沌实验中的一个潜在变量。
在生产环境中运行实验
系统的行为会依据环境和流量模式都会有所不同。 由于资源使用率变化的随时可能发生, 因此通过采集实际流量是捕获请求路径的唯一可靠方法。 为了保证系统执行方式的真实性与当前部署系统的相关性, 混沌工程强烈推荐直接采用生产环境流量进行实验。
持续自动化运行实验
手动运行实验是劳动密集型的, 最终是不可持续的。所以我们要把实验自动化并持续运行,混沌工程要在系统中构建自动化的编排和分析。
最小化爆炸半径
在生产中进行试验可能会造成不必要的客户投诉。虽然对一些短期负面影响必须有一个补偿, 但混沌工程师的责任和义务是确保这些后续影响最小化且被考虑到。
混沌工程是一个强大的实践, 它已经在世界上一些规模最大的业务系统上改变了软件是如何设计和工程化的。 相较于其他方法解决了速度和灵活性, 混沌工程专门处理这些分布式系统中的系统不确定性。 混沌工程的原则为我们大规模的创新和给予客户他们应得的高质量的体验提供了信心。
https://principlesofchaos.org/zh/
Netflix不仅是一家互联网视频平台, 它也提出了一系列混沌工程的基本原则。
混沌工程这个词可能听起来不是那么清晰,但它实际上是一种提高技术架构弹性能力的复杂技术手段。
这篇文章旨在解释混沌工程是什么以及它是如何使用的。 我们先简单了解混沌工程的历史。
拥抱”混沌”
为了支持支持日益复杂的业务,Netflix 一直都发力基础设施。现在Netflix拥有分布在190多个国家的1亿用户。早期公司的服务器运行在自己机房,但这会造成单点故障和其他问题。在2008年8月,数据库的问题导致了三天宕机,在此期间在Netflix无法看任何视频。Netflix工程师在2011年将服务迁移到Amazon Web Services。
这种由数百个微服务组成的新型分布式架构消除了单点故障。但它也引入了新的复杂性问题,需要更加可靠和容错性更强的系统。正是在这一点上,Netflix的工程团队学到了重要的教训:通过不断失败避免失败。
“混沌”新用法
为此,Netflix工程师创建了Chaos Monkey,使用该工具可以在整个系统中在随机位置引发故障。正如GitHub上的工具维护者所说,“Chaos Monkey会随机终止在生产环境中运行的虚拟机实例和容器。”通过Chaos Monkey,工程师可以快速了解他们正在构建的服务是否健壮,是否可以弹性扩容,是否可以处理计划外的故障。
随着Chaos Monkey的出现,一门新学科诞生了:混沌工程,被描述为“在分布式系统上进行实验的学科,目的是建立对系统承受生产环境中湍流条件能力的信心。”。
2012年,Netflix开源了Chaos Monkey。今天,许多公司(包括谷歌,亚马逊,IBM,耐克等),都采用某种形式的混沌工程来提高现代架构的可靠性。 Netflix甚至将其混沌工程工具集扩展到包括整个“Simian Army(中文可以译为猿军)”,用它攻击自己的系统。
混沌工程:不是那么混乱
混沌工程创业公司Gremlin的首席执行官Kolton Andrus曾在Google和Netflix工作过,他建议将混沌工程视为流感疫苗。 Andrus说,故意将有害物质注入体内以防止未来疾病,这似乎很疯狂,但这种方法也适用于分布式云系统。混沌工程会将故障注入系统以测试系统对其的响应。这使公司能够为宕机做准备,并在宕机发生之前将其影响降至最低。
将混沌工程视为实际混乱是一种误解。事实上,大量测试是非随机的。相反,混沌工程会在实施前进行深入思考,组织有计划和受控制的实验,旨在揭示系统在失败时的表现。
“在我去年与客户进行的所有混乱工程实验中,一般只有很少的随机测试,”欧洲混沌http://ChaosIQ.io的创始人兼首席执行官Russ Miles在接受采访时说。 “他们中的大多数都非常谨慎。它实际上与随机性无关,除非随机性是你想要测试的东西。“
尽量减少雷区
Amalgam Insights的研究员Tom Petrocelli在接受采访时说,混沌工程最佳实践的关键是“尽量减少雷区。 这意味着最大限度地减少对业务的影响。“
“是的,你想发现技术上的漏洞,”Petrocelli说,“但不想损害业务运营。”
为了确保不会破坏业务,Petrocelli建议工程团队“精心策划”混乱工程。
Petrocelli说,确保你有合适的团队来解决任何可能的故障是至关重要的。 “如果所有的Kubernetes工程师都不在场,请不要把Kubernetes容器全部宕机,”他警告说。
不只是测试,也是生成知识的实验
Netflix混沌团队前工程经理Casey Rosenthal在DZone Q&A中明确指出,混沌工程不仅仅是测试系统的一种方法。另一方面,也是一种产生新知识的正确方法。正是因为现代软件系统往往太复杂,任何人都无法完全理解它们,所以工程师会进行实验以揭示有关系统的更多信息。Rosenthal在问答环节中表示,传统测试仍然至关重要,但混沌工程应该是传统测试的补充。
混沌工程以实验发现系统性弱点。这些实验通常遵循四个步骤:
1.定义并测量系统的“稳定状态”。首先精确定义指标,表明您的系统按照应有的方式运行。 Netflix使用客户点击视频流设备上播放按钮的速率作为指标,称为“每秒流量”。请注意,这更像是商业指标而非技术指标;事实上,在混沌工程中,业务指标通常比技术指标更有用,因为它们更适合衡量用户体验或运营。
2.创建假设。与任何实验一样,您需要一个假设来进行测试。因为你试图破坏系统正常运行时的稳定状态,你的假设将是这样的,“当我们做X时,这个系统的稳定状态应该没有变化。”为什么用这种方式表达?如果你的期望是你的动作会破坏系统的稳定状态,那么你会做的第一件事会是修复问题。混沌工程应该包括真正的实验,涉及真正的未知数。
DevOps解决方案策略师、New Relic SRE Beth Long认为:“混沌工程不适用于那些可预测的、被运行手册覆盖的、你知道必须自动化但还没有开始的事件。”“你需要它来处理由复杂性本身产生的各种因素。因为不知道该怎么介入,所以每个人觉得老虎吃天,无从下爪。”
3.模拟现实世界中可能发生的事情。在《混沌工程:通过实验建立对系统行为的信心》一书中,Netflix架构师,Casey Rosenthal,Lorin Hochstein,Aaron Blohowiak,Nora Jones和Ali Basiri,提出了许多混沌工程实践方法:
模拟数据中心的故障
强制系统时钟不同步
在驱动程序代码中模拟I/O异常
模拟服务之间的延迟
随机引发函数抛异常
通常,您希望模拟可能导致系统不可用或导致其性能降低的场景。首先考虑可能出现什么问题,然后进行模拟。一定要优先考虑潜在的错误。 “当你拥有非常复杂的系统时,很容易引起出乎意料的下游效应,这是混沌工程寻找的结果之一,”Petrocelli说。 “因此,系统越复杂,越重要,它就越有可能成为混沌工程的候选对象。”
4.证明或反驳你的假设。将稳态指标与干扰注入系统后收集的指标进行比较。如果您发现测量结果存在差异,那么您的混沌工程实验已经成功 - 您现在可以继续加固系统,以便现实世界中的类似事件不会导致大问题。或者,如果您发现稳定状态可以保持,那么你对该系统的稳定性大可放心。
不要破坏你的系统 - 了解它并改进它
Miles认为:“混沌工程本身并不是要破坏系统。它从来就不是破坏系统的工具,而是学习系统的路径。” “你正试图将团队引入学习循环,总结经验是最好地吸取信息的方式。”
你当然可以从实际问题中学习经验,但这非常痛苦。 “混沌工程让你有机会把问题提前,并将一切置于你的掌控之中。”
混沌工程也可以利用对系统最为了解的工程师。根据Long的说法,“更有趣的混沌工程实验不应该基于重要并且明显的假设,例如’如果这个机架出现故障,该服务延迟会增大但仍然可用’,而应是基于对系统深入理解后作出的假设。混沌工程的实施过程有助于将专家直觉转化为明确的,可测试的假设,暴露出有价值的信息,这些信息不仅仅是以局外人的角度来看待系统本身“。
这个网页上https://github.com/dastergon/awesome-chaos-engineering列出了许多混沌工程工具包可供选择。
https://github.com/Netflix/chaosmonkey
https://zhuanlan.zhihu.com/p/55612414
https://github.com/dastergon/awesome-chaos-engineering
https://zhuanlan.zhihu.com/p/90294032
https://zhuanlan.zhihu.com/p/55612414
https://zhuanlan.zhihu.com/p/74717464
https://zhuanlan.zhihu.com/p/52505917
https://zhuanlan.zhihu.com/p/78083694
https://zhuanlan.zhihu.com/p/55973357
https://www.cnblogs.com/rongfengliang/p/9131757.html
https://aws.amazon.com/cn/blogs/china/tag/chaos-engineering/
https://www.infoq.cn/article/chaos-engineering-the-history-principles-and-practice/?utm_campaign=infoq_content&utm_source=infoq&utm_medium=feed&utm_term=global
https://zhuanlan.zhihu.com/p/68733881
https://principlesofchaos.org/?lang=ENcontent
https://www.infoq.cn/article/jjp0c2bR4*Ulld0wb88r
https://www.jianshu.com/p/4bd4f88e24e4
https://segmentfault.com/a/1190000018059404
https://oracleblog.org/its-my-life/study-note-of-chaos-engineering/
https://juejin.im/post/6844903910268731399
https://blog.csdn.net/u013256816/article/details/103998060