代码改变世界

混沌工程

2021-03-15 09:23  Tanwheey  阅读(2995)  评论(0编辑  收藏  举报

一、什么是混沌工程

混沌工程是在分布式系统上进行实验的学科,目的是建立对系统抵御生产环境中失控条件的能力以及信心。

混沌工程,是一种提高技术架构弹性能力的复杂技术手段,旨在将故障扼杀在襁褓之中,也就是在故障造成中断之前将它们识别出来。通过主动制造故障,

测试系统在各种压力下的行为,识别并修复故障问题,避免造成严重后果。

二、混沌工程和故障注入、传统测试的区别

两者本质上是思维方式的不同。

1、故障注入首先要知道会发生什么故障,然后一个一个注入,然而在复杂分布式系统中,想要穷举所有可能的故障,本身就是奢望。

2、传统测试,旨在给定一个特定的条件,系统会输出一个特定的二元结果,它仅仅是对已知的系统属性可能的取值进行测验。

3、混沌工程的思维方式是主动去找故障,是探索性的。虽然按计划做好了降级预案,但是关闭节点时却引发了上游服务故障,进而引发雪崩,这不是靠故障注入或预先计划能发现的。

4、混沌工程,旨在帮助我们获得更多的关于系统的新认知的实验方法,而且通常还能开辟出一个更广袤的对复杂系统的认知空间。

5、混沌工程实验的可能性是无限的,根据不同的分布式系统架构和不同的核心业务价值,实验可以千变万化。

三、混沌工程的先决条件

1、团队具备面向失败设计(可以使系统暴露出已有问题的设计)和拥抱失败的技术文化。

2、系统具备一定的弹性来应对破坏性演练中的一些异常事件。

3、具备一套破坏性演练的环境:理想实践是直接在生产环境中进行实验,其次是在离生产环境越近的地方进行实验(如预发环境)。如在预发环境进行演练,确保预发和生产环境保持一致很重要,只有这样才能体现演练意义。

4、具备配套的监控系统,用于判断系统当前的各项状态。如果没有对系统行为的可见能力,那么也就无法从实验中得出有效的结论。

四、混沌工程的五大原则

1、建立一个围绕稳定状态行为的假说

“稳定状态”是指系统正常运行时的状态。而系统的稳定状态可以通过一些指标来定义,当指标在测试完成后,无法快速恢复稳态要求,可以认为这个系统是不稳定的。

指标可以分为系统指标和业务指标。系统指标(如CPU 负载、内存使用情况、网络 I/O等)有助于帮助我们诊断性能问题。但在混沌工程中,业务指标通常比系统指标更有用,因为它们更适合衡量用户体验或运营。如果不能直接获取和业务直接相关的指标,可以暂时先利用一些系统指标。

2、多样化真实世界的事件 

每个系统只要运行时间足够长,都会受到不可预测的事件和条件的影响。要彻底阻止这些对可用性的各种威胁是不可能的,只能尽可能减轻这些威胁。所以不需要穷举所有可能对系统造成改变的事件,只需要注入那些频繁发生且影响重大的事件,同时要足够理解会被影响的故障域,权衡引入的成本和复杂度。

常见事件:

  • 硬件故障
  • 功能缺陷
  • 状态转换异常(例如发送方和接收方的状态不一致);
  • 网络延迟或隔离
  • 上行或下行输入的大幅波动以及重试风暴
  • 资源耗尽
  • 服务之间的不正常的或者预料之外的组合调用
  • 拜占庭故障
  • 资源竞争条件
  • 下游依赖故障

 

3. 在生产环境中运行实验

根据环境与流量模式的不同,系统运行效果亦将受到影响。为了保证系统运行方式的真实性以及同现有部署系统间的关联性,混沌工程原则强烈建议直接面向生产流量进行实验。即便不能在生产环境中执行实验,也要尽可能的在离生产环境最接近的环境中运行。

 

4. 持续自动化运行实验

系统实际上,当今的系统越来越复杂,且处在一个无时不在变化的状态,这意味着我们无法预先地知道生产环境的哪些变动会改变混沌工程实验的结果。所以需要混沌工程的自动化工具和平台,以期不断降低创建新实验的门槛,并能够完全自动运行这些实验。

 

5. 最小化爆炸半径

混沌实验通过很多方法来探寻故障会造成的未知的、不可预见的影响,关键在于如何让这些薄弱环节曝光出来而不会意外造成更大规模的故障。我们称之为最小化“爆炸半径”。

一般先只作用于很少的用户之上,当自动化实验成功之后,运行小规模的扩散实验,再进行小规模的集中实验,最后就是大规模无自定义路由的实验。扩大实验范围的目的是进一步暴露小范围实验无法发现的一些问题。

根据对用户的影响度判断,随时遏制和停止实验的能力是必备的,可以避免造成更大的危机。

五、混沌成熟度模型

混沌工程成熟度模型(CMM)用于评估当前混沌工程项目成熟度状态。CMM 包含熟练度(Sophistication)和接纳度(Adoption)。缺乏熟练度时,实验会比较危险、不可靠、且有可能是无效的。缺乏接纳度时,所做的实验就不会有什么意义和影响。要发挥混沌工程项目的最大效果需要在这两个维度上保持一定的平衡。

1、混沌工程实验熟练度等级

熟练度可以反映出,在你的组织中混沌工程项目的有效性和安全性。项目各自的特性会反映出不同程度的熟练度,有些完全不具备熟练度,而有些可能具备很高的熟练度。

 

2、混沌工程实验接纳度等级

接纳度用来衡量混沌工程实验覆盖的广度和深度。接纳度越高,暴露的脆弱点就越多,你对系统的信心也就越足。

六、混沌工程的目标——韧性架构

“故障是注定的,随着时间的流逝,一切终将归于失败”。必须接受故障发生是新常态的想法,处在部分故障的系统正常运行是完全可行的,这就需要架构本身具备韧性。

韧性架构的重要特征:

 

七、混沌工程实践

完整的混沌工程实验是一个持续性迭代的闭环体系,大致分为以下几个步骤:

八、开源工具

Chaos Monkey:通过关停一个或多个虚拟机来模拟服务实例失效的工具。(https://github.com/Netflix/chaosmonkey)

Simian Army:猿军工具集,除Chaos Monkey外,还包括Chaos Kong、Latency Monkey、Conformity Monkey、Security Monkey等。(https://github.com/Netflix/SimianArmy/tree/master/src/main/java/com/netflix/simianarmy)

ChaosBlade:是阿里巴巴开源的一款遵循混沌工程实验原理,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具,可实现底层故障的注入,特点是操作简洁、无侵入、扩展性强。(https://github.com/chaosblade-io/chaosblade)

ChaoMesh:是PingCap团队研发的一款用于测试kubernetes环境的工具。通过人为地在集群中注入故障来检测集群对故障的处理以及恢复能力。(https://github.com/chaos-mesh/chaos-mesh)