什么是混沌工程?

文章目录

  • 参考资料
  • 什么是混沌工程
  • 服务可用性实践
  • 混沌工程的原则
    • 1、建立稳定状态的假设
    • 2、真实世界的事件
    • 3、在生产中实验
    • 4、持续的自动化实验
    • 5、最小的影响范围
  • 混沌工程工具

参考资料

  • 主要转载出处:《DevOps实战笔记》 极客时间,石雪峰
  • 一文读懂混沌工程
  • 为什么你需要混沌工程以及 Chaos Mesh

经济学领域有一本特别有名的书,叫作《反脆弱》。它的核心理念就是,在面对普遍存在又不可预估的不确定性时,通过一种行之有效的方法,不仅可以规避重大风险,还能够利用风险获取超出预期的回报。另外,通过积极地试错,控制损失成本,还能不断提升在不确定性事件发生时的收益。

不仅仅要规避风险,还要在风险中受益,这听起来是不是很神奇?其实,在软件工程领域,也有类似的思想和实践,可以帮助我们在面对极其复杂且规模庞大的分布式系统时,有效地应对不可预见的故障,不仅可以从容不迫地应对,还能从中获益,并且通过频繁、大量地实验,识别并解决潜在的风险点,从而提升对于复杂系统的信心。这就是今天我要给你分享的主题:混沌工程。

什么是混沌工程

混沌工程作为软件领域的一门新兴学科,就和它的名字一样,让很多人感到非常“混沌”。那么,混沌工程究竟是从何而来,又是要解决什么问题呢?

我们先来看看混沌原则网站对混沌工程的定义:

Chaos Engineering is the discipline of experimenting on a distributed system in order to build confidence in the system’s capability to withstand turbulent conditions in production.

混沌工程是一门在分布式系统上进行实验的学科,目的是建立人们对于复杂系统在生产环境中抵御突发事件的信心。

简单来说,混沌工程要解决的,就是复杂环境下的分布式系统的反脆弱问题。那么,我们所要面对的“复杂的分布式”的真实世界是怎样的呢?Netflix 公司在 2014 年公开的微服务调用关系图,你可以参考一下。
什么是混沌工程?_第1张图片
面对这样复杂的分布式系统,想要通过穷尽全面的测试来保障质量,不出线上问题几乎是不可能的事情。

混沌工程采取了一种更加积极的方式,换了一个思路主动出击。那就是,尽可能在这些故障和缺陷发生之前,通过一系列的实验,在真实环境中验证系统在故障发生时的表现

服务可用性实践

区别于故障演练。
故障演练:就是针对以往发生过的问题进行有针对性地模拟演练。

Netflix 公司著名的“混乱猴子(Chaos Monkey)”,就是用来随机关闭生产环境的实例的工具。在生产环境放任一个“猴子”乱搞事情,这是疯了吗?还真不是。Netflix 的“猴子军团”的威力一个比一个巨大,甚至可以直接干掉一个云服务可用区。

必须要强调的是,在引入混沌工程的实践之前,首先需要确保现有的服务已经具备了弹性模式,并且能够在应急响应预案和自动化工具的支撑下尽早解决可能出现的问题。

如果现有的服务连基本的可恢复性这个条件都不具备的话,那么这种混沌实验是没有意义的。

混沌工程的原则

混沌工程的五大原则:建立稳定状态的假设、真实世界的事件、在生产中试验、持续的自动化实验、最小影响范围。

1、建立稳定状态的假设

比如,对于技术指标来说,前面在压测部分提到的指标就很有代表性(QPS、TP99、CPU 使用率等);而对于业务指标来说,根据公司具体业务的不同会有所不同。

举个例子,对于游戏来说,在线用户数和平均在线时长就很重要;对于电商来说,各种到达率、结算完成率,以及更加宏观的 GMV、用户拉新数等,都能表现出业务的健康程度。与

技术指标相比,业务指标更加重要,尤其是对电商这种活动密集型的行业来说,业务指标会受到活动的影响,但基于历史数据分析,总体趋势是比较明显的。

当业务指标发生大量的抖动时(比如瞬时降低提升),就意味着系统出现了异常。比如,几天前微信支付出现问题,从监控来看,支付的成功率就受到了比较明显的影响。

在真实世界中,为了描述一种稳定状态,需要一组指标构成一种模型,而不是单一指标。无论是否采用混沌工程,识别出这类指标的健康状态都是至关重要的。而且,还要围绕它们建立一整套完善的数据采集、监控、预警机制。

2、真实世界的事件

比如,我印象比较深的一次故障就是,服务器在处理并发任务的时候,CPU 跑满,系统直接卡死。通过调查发现,在出现问题的时候,系统的 I/O Wait 很高,这就说明磁盘发生了 I/O 瓶颈。经过仔细地分析,最终发现是磁盘 Raid 卡上的电池没电了,从而导致磁盘 Raid 模式的降级。

像这种事情,你很难通过监控所有 Raid 卡的电池容量来规避问题,也不可能在每次模拟故障的时候,故意换上没电的电池来进行演练。

所以,既然我们无法模拟所有的异常事情,投入产出比最高的就是选择重要指标(比如设备可用性、网络延迟,以及各类服务器问题),进行有针对性地实验。另外,可以结合类似全链路压测等手段,从全局视角测试系统整体运作的可用性,通过和稳定状态的假设指标进行对比,来识别潜在的问题。

3、在生产中实验

跟测试领域的“质量右移理念”一样,混沌工程同样鼓励在靠近生产环境的地方进行实验,甚至直接在生产环境中进行实验。

这是因为,真实世界的问题,只有在生产环境中才会出现。

要求实验范围可控,并且具备随时停止实验的能力。还是最开始的那个原则,如果系统没有为弹性模式做好准备,那么就不要开启生产实验。

4、持续的自动化实验

通过自动化的实验和自动化结果分析,我们可以保证混沌工程的诸多实践可以低成本、自动化地执行。正因为如此,以混沌工程为名的工具越来越多。

比如,商业化的混沌工程平台 Gremlins 就可以支持不可用依赖、网络不可达、突发流量等场景。今年,阿里也开源了他们的混沌工具ChaosBlade,缩短了构建混沌工程的路径,引入了更多的实践场景。另外,开源的Resilience4j和Hystrix也都是非常好用的工具。无论是自研,还是直接采用,都可以帮助你快速上手。

5、最小的影响范围

混沌工程实践的原则就是不要干扰真实用户的使用,所以,在一开始将实验控制在一个较小的范围内,是非常有必要的,这样可以避免由于实验失控带来的更大问题。

比如,圈定一小部分用户,或者服务范围,可以帮助我们客观地评估实验的可行性。假设要实验一个 API 对错误的处理能力,我们可以部署一个新的 API 实验集群,并修改路由导流 0.5% 的流量用于线上实验。在这个集群中通过故障注入的方式,验证 API 是否能够处理流量带来的错误场景。这有点类似于一个灰度实验环境,或者暗部署的方式。

除了可以用于验证新功能,做线上的 A/B 测试,同样适用于混沌工程的故障注入。


这五大原则共同勾勒出了混沌工程的全景图,描述系统稳定状态的前提下,将真实世界的事件在生产环境中进行实验,并控制最小影响范围,引入自动化方式持续进行。作为一种全新的工程领域,混沌工程还要走很长的路,才能跨越技术演进的鸿沟。

混沌工程工具

Netflix 是混沌工程的著名先驱,也是最早将其用于生产系统的公司之一。Netflix 设计并开源的混沌测试自动化平台统称为" Simian Army."。

Simian Army 套房中包括几种工具,包括:

· 混沌金刚:禁用整个 AWS 可用区。

· 混沌猴子:随机禁用生产环境实例会导致系统故障,但设计不会对客户活动产生影响。

· 混沌大猩猩:像混沌猴子,但在更大的规模。

· 延迟:引入延迟以模拟网络中断和退化。

你可能感兴趣的:(DevOps,devops,运维)