如何设计一个混沌工程实验?

1 什么是混沌工程?

混沌工程是通过应用一些经验探索的原则,来学习观察系统是如何反应的。

这就跟科学家做实验去学习物理定律一样,混沌工程是通过做实验去了解系统。

注:这里举一个我自己的实际例子:有一次,我设计一个了让mail系统使用的redis的master实例down掉,这时候发现使用java的jedis的一个mail接口过了很久都不能返回结果,

最后排查我们java框架代码ClusterClient中,有一个参数配置的是redis重试100次,最终改成1次就好了。 通过这个例子再次说明,通过做混沌工程试验,能够促进你去更加了解你的系统!

2 为什么需要混沌工程?

应用混沌工程能提升整个系统的弹性。通过设计并且进行混沌实验,我们可以了解到系统脆弱的一面,在还没出现对用户造成伤害之前,我们就能主动发现这些问题。

3 混沌工程和测试有什么区别?

混沌工程是通过实践对系统有更新的认知。(试验结果是不明确的)

传统测试则是使用特定方式对某一块进行特定测试。(测试结果是明确的)

譬如在传统测试里面,

我们可以写一个断言,我们给定特定的条件,产生一个特定的输出,如果不满足断言条件,测试就出错了,这个其实是具有很明确的特性。

但混沌工程是试验,而试验会有怎样的新信息生成,我们是不确定的。例如你在redis的master注入延时故障,你不知道系统会产生什么的结果。

4 混沌工程的先决条件是什么?

4.1 先解决确定会导致问题的弱点

要确定是否已准备好开始采用混沌工程,需要回答一个问题:你的系统是否能够适应现实世界中的事件,例如服务故障和网络延迟峰值?

如果答案是“否”,那么你还有一些工作要做。

混沌工程非常适合揭露生产系统中未知的弱点,但如果确定混沌工程实验会导致系统出现严重问题,那么运行该实验就没有任何意义。先解决这个弱点,然后回到混沌工程,它将发现你不了解的其他弱点,或者它会让你发现你的系统实际上是有弹性的。

注:比如对redis中注入网络分区故障,刚好分区后一个分片的主从落到了一个分区了,那么集群肯定会有1/3概率不可以用,这个从redis的三主三从中一定是可以知道的。那么我们需要先解决这个问题,才能进行网络分区实验。比如我们可以加强对网络分区

故障的告警监控,如果出现网络分区之后,是否可以做到故障自动转移。

4.2 监控系统来确定系统的状态

混沌工程的另一个重要元素是一个监控系统,您可以使用它来确定系统的当前状态。在没有了解系统行为的情况下,您将无法从实验中得出结论。

5 混沌工程原则是什么?

5.1 假定稳定状态

表征稳态:根据业务指标(登录数量,登录成功率等等)或者系统指标(系统吞吐量,错误率等等)来确定系统是否稳定的指标。

形成假设:一旦你有了你的指标,并了解他们的稳态行为,你可以用它们来定义你的实验的假设。我们应用混沌工程来提高系统的灵活性。因此,我们的实验中的假设通常是以“我们注入系统的事件不会导致系统的行为从稳定状态改变”的形式。

5.2 多样化真实世界的事件

每个系统,从简单到复杂,如果运行时间足够长,就会受到不可预知的事件和条件的影响。做混沌试验的时候需要模拟这些故障,来看系统的状态。但从成本上面考虑,

我们并不需要模拟所有的故障,仅仅需要考虑那些会比较频繁发生,而且模拟之后会很有效果的。(我们不需要列举所有可能改变系统的事件,只需要注入频繁而有影响力的事件,并了解由此产生的故障域。)

在这里插入图片描述

5.3 在生产中进行试验

从功能性的故障测试角度来看,非生产环境去实施故障注入是可以满足预期的,所以最早的强弱依赖测试就是在日常环境中完成的。不过,因为系统行为会根据环境和流量模式有所不同,为了保证系统执行方式的真实性与当前部署系统的相关性,推荐的实施方式还是在生产环境(仿真环境、沙箱环境都不是最好的选择)。

很多同学恐惧在生产环境执行实验,原因还是担心故障影响不可控。实施实验只是手段,通过实验对系统建立信心是我们的目标。关于如何减少实验带来的影响,这点在"最小化爆炸半径"部分会有阐述。

5.4 自动化持续执行

自动化是最长的杠杆。在混沌工程实践中,我们自动执行实验,分析实验结果,并期望自动创建新的实验。实验具有最小的爆炸半径。一旦我们成功地进行了实验,下一步就是使实验自动化,以便持续运行。

5.5 最小爆炸半径

为了达到这个目的,我们注入了验证客户端设备功能的故障,这些客户端设备功能是针对一个或一小组设备的这些实验限制了可能影响的设备和用户流量。

注:可以先小范围的做实验,然后在扩大范围。例如:可以针对某个系统一个用户在使用redis的时候,注入延时故障实验,然后在扩大范围。

6 如何设计一个混沌工程实验?

6.1 混沌工程实验步骤

1.选择一个假设

实验中的假设通常是以“我们注入系统的事件不会导致系统的行为从稳定状态改变”的形式。例如:假设一个redis的master实例down掉不会导致整个系统不可用

2.选择实验的范围

环境范围:线下环境,仿真环境,线上环境

用户范围:一个用户,多个用户,全部用户。

例如:线上环境,将user系统中使用的redis,h2019用户,所有的redis请求注入3秒延时故障。

3.确定您要观看的指标

根据5.1章节设定的稳定的状态指标,通过监控系统,或者日志系统,数据库等查看稳定状态的指标

4.通知组织

通知本次试验影响的部门和用户。

例如这里可以通知user系统部门和hdf2019这个用户。

5.运行实验

可以借助一下工具取值执行本次试验或者自己写脚本执行。可以利用的工具:Netflix :Netflix-SimianArmy(猴子军团);阿里巴巴:chaosblade 混沌工程-阿里巴巴-chaosblade

6.分析结果

实验完成后,使用您收集的指标来测试您的假设是否正确。您的系统是否适应您注入的现实世界事件?有没有发生你没有想到的事情?

可以通过分析监控,日志查看是否影响。

7.增加范围

运行较小规模的实验中获得了一些信心,就可以增加实验的范围。增加实验的范围可以揭示小规模实验中不明显的系统效应。

8.自动化

你有信心手动运行你的混沌练习,一旦你自动完成混沌实验,你就会从混沌实验中获得更多的价值,所以它们会定期运行。

6.2 混沌工程实验样例

在这里插入图片描述

7 混沌工程成熟度模型是什么?

这里在简单说说混沌成熟度模型,Netflix 总结了两个维度,一个是复杂度,一个就是接受度。前者表示的是混沌工程能有多复杂,而后者则表示的是混沌工程被团队的接受程度。

7.1 复杂度

复杂度分为几个阶段:

1 初级

试验没有在生产中进行
进程被收工管理
结果只反映系统 metric,没有业务的
只有简单的事件进行试验

2 简单

试验可以在类生产环境中进行
能自动启动执行,但需要人工监控和终止
结果能反应一些聚合的业务 metric
一些扩展的事件譬如网络延迟可以进行试验
结果可以手工汇总和聚合
试验是预先定义好的
有一些工具能进行历史对照

3 复杂

试验直接在生产环境中进行
启动,执行,结果分析,终止都是自动完成
试验框架集成在持续发布
业务 metrics 会在实验组和控制组进行比较
一些组合错误或者服务级别影响的事件可以进行试验
结果一直可以追踪
有工具可以更好的交互式的对比试验和控制组

高级

试验在每个开发步骤和任意环境都进行
设计,执行和提前终止这些全部都是自动化的
框架跟 A/B 或者其他试验系统整合
一个事件譬如更改使用模式和返回值或者状态变更开始进行试验
试验包括动态作用域和影响,可以找到突变点
通过试验结果能保护资产流失
容量预测可以通过试验分析提前得出
试验结果可以区分不同服务的临界状态

7.2 接受度

而接受度也有几个阶段:

1 在暗处

相关项目不被批准
很少系统被覆盖
很少或者没有团队有意识
早期接受者不定期的进行试验

2 有投入

试验被被官方批准
部分资源被用于实践
多个团队有兴趣并投入
少部分关键服务不定期进行试验

3 接受

有专门的 team 进行混沌工程
应急响应被集成到框架,从而可以创建回归试验
多数关键系统定期进行混沌试验
一些试验验证会在应急响应或者游戏时间被临时执行

4 文化

所有关键服务都有频繁的混沌试验
大多数非关键服务定期进行
混沌试验已经是工程师的日常工作
默认所有系统组件都必须参与,如果不想进行,需要有正当的理由

8 参考资料

《混沌工程简介》:https://www.jianshu.com/p/4bd4f88e24e4

《鲜为人知的混沌工程,到底哪里好?》:https://www.jianshu.com/p/02f8e7b7d1ad

《阿里巴巴在混沌工程领域的实践和思考》:https://www.jianshu.com/p/99e414408cca

《微服务架构下的质量迷思——混沌工程》:https://mp.weixin.qq.com/s?__biz=MjM5MjY3OTgwMA==&mid=2652464707&idx=1&sn=079caeae3314ad1c04f62e7a0306e430&chksm=bd4f54548a38dd4203f25420c944c89c252802dd3ed98cebfd4e48de7462643c3e41a3d63159&xtrack=1&scene=0&subscene=131&clicktime=1556797540&ascene=7&devicetype=android-27&version=2700033c&nettype=WIFI&abtest_cookie=BAABAAoACwASABMABQAjlx4AW5keAMCZHgDcmR4A%2BpkeAAAA&lang=zh_CN&pass_ticket=sD0SA%2FqW4GYHQXX2TfTBKe0X3b5PqXDFnNrfCPP8MCKd8w1FgB6ANL05%2BAbAigTr&wx_header=1

《chaosblade-新手指南》:https://github.com/chaosblade-io/chaosblade/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97

技术交流

CleverCode是一名架构师,技术交流,咨询问题,请加CleverCode创建的qq群(架构师俱乐部):517133582。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值