架构师口中的混沌工程,究竟用来解决什么问题?

分享 未结
1 1 0 7
小编 2019-06-17发布
收藏 点赞
来源: 高可用架构

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://blog.newrelic.com/engineering/chaos-engineering-explained/haos-engineering-explained/


回帖
  • 消灭零回复