文章目录

  • 1 什么是混沌工程?
  • 2 为什么需要混沌工程?
  • 3 混沌工程和测试有什么区别?
  • 4 混沌工程的先决条件是什么?
    • 4.1 先解决确定会导致问题的弱点
    • 4.2 监控系统来确定系统的状态
  • 5 混沌工程原则是什么?
    • 5.1 假定稳定状态
    • 5.2 多样化真实世界的事件
    • 5.3 在生产中进行试验
    • 5.4 自动化持续执行
    • 5.5 最小爆炸半径
  • 6 如何设计一个混沌工程实验?
    • 6.1 混沌工程实验步骤
    • 6.2 混沌工程实验样例
  • 7 混沌工程成熟度模型是什么?
    • 7.1 复杂度
    • 7.2 接受度
  • 8 参考资料
  • 技术交流

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。加群和腾讯,阿里,百度,新浪等公司的架构师交流。【架构师俱乐部】宗旨:帮助你成长为架构师!

如何设计一个混沌工程实验?相关推荐

  1. ChaosBlade:从混沌工程实验工具到混沌工程平台

    简介:ChaosBlade 是阿里巴巴 2019 年开源的混沌工程项目,已加入到 CNCF Sandbox 中.起初包含面向多环境.多语言的混沌工程实验工具 chaosblade,到现在发展到面向多集 ...

  2. Gremlin发布混沌工程实验平台免费版,开放了“故障即服务”功能

    Gremlin团队最近发布的"Gremlin免费版",开放了Gremlin"故障即服务"功能,支持在SaaS平台上的运行部分混沌工程实验.当前开放的免费版本允许 ...

  3. 【新书速递】重磅!混沌工程权威指南

    编辑推荐 作为一名工程师,混沌工程是开始应对系统复杂性的既可行又有效的方法.混沌工程是对系统的容错设计进行验证,保障系统稳定性的新方法!    混沌工程这门学科既成熟得可以沉淀有价值的文献和常见的行业 ...

  4. 字节跳动混沌工程实践之场景化主动实验

    背景 从 2010 年 Netflix 上线 Chaos Mokey 的第一个版本到现在,虽然混沌工程发展已历时十年,但其实只在少数大厂里面有较成熟的落地,对绝大部分研发同学来说,混沌工程还是一个比较 ...

  5. C语言程序设计:综合设计实验一(设计一个文字游戏)

    文章目录 C语言程序设计:综合设计实验一(设计一个文字游戏) 1.实验要求 2.设计思路 3.源码 4.后话 C语言程序设计:综合设计实验一(设计一个文字游戏) 1.实验要求 (1) 设计一个文字游戏 ...

  6. 【译】混沌工程与区块链

    作者 Vipin Bharathan 原文:https://medium.com/@vipinsun/chaos-engineering-the-blockchain-51e60ae74d27 第一部 ...

  7. 从甲方到乙方,如何做好混沌工程的行业化落地

    作者:穹谷|阿里云技术专家,ChaosBlade 社区以及商业化产品的 Founder 和 Maintainer ,乐于参与混沌工程布道. 2021 年 12 月 7 日,由信通院主办.混沌工程实验室 ...

  8. ChaosBlade 在工商银行混沌工程体系中的应用实践

    作者 | 吴冕冠 来源|阿里巴巴云原生公众号 互联网金融时代下,金融产品和服务模式不断创新,交易量大幅攀升.面对互联网金融的全新发展态势,传统的单体 IT 架构暴露出很多不适应的地方,为此业界广泛应用 ...

  9. 分布式系统保障—混沌工程—初识

    原文作者: 朱小厮的博客 原文地址:混沌工程(Chaos Engineering)初识 编辑推荐: 本文主要介绍什么是混沌工程.混沌工程的五大原则.混沌工程成熟度模型(CMM)以及混沌工程的目标--韧 ...

最新文章

  1. mysql 一条sql update多条记录
  2. [js] ajax请求地址只支持http/https吗?能做到让它支持rtmp://等其它自定义协议吗 ?
  3. 遍历列表python_Python 遍历List的三种方法
  4. 研究解决CLOB字段IO问题的方法
  5. mixpanel实验教程(2)
  6. java接口vm和dto的区别_第十八节:详解Java抽象类和接口的区别
  7. Hough变换检测圆
  8. esp ghost引导_UEFI引导修复教程和工具
  9. 电路设计_MOS管导通条件
  10. 情人节神奇的传情之物,“懂爱”的你都会爱上它丨情人节系列
  11. leetcode 排列组合系列
  12. 【Python】用matplotlib函数绘制股票趋势图
  13. Spring boot带来的信息泄露
  14. virtualenv virtualenvwrapper
  15. 高德地图定位及显示位置
  16. sed学习与实践1:sed基本指令
  17. persevere的用法_persevere是什么意思_persevere的翻译_音标_读音_用法_例句_爱词霸在线词典...
  18. mex matlab混编,Matlab中mex与C混合编程总结
  19. 重新install安装织梦后台DedeCms程序
  20. 如何在Windows XP中设置自定义纸张,300K打印机进纸长度

热门文章

  1. Old fishman-老赵钓鱼
  2. C语言简单编程案例(一)
  3. 何谓”透传“? UART串口WIFI模块做”透传“的目的及其局限性
  4. mysql 实数型变量定义,MySQL实数类型使用注意事项
  5. python编程计算圆面积和周长_vb编程计算圆周长面积
  6. java中接口幂等性解决方案总结
  7. 关于长期久坐网站开发程序员身体健康的5点建议
  8. 袁卫统计学第4版笔记和课后习题答案
  9. 网络安全乱流,超级保护才是根本
  10. 《Cross-Modality Person Re-Identification with Generative Adversarial Training》论文阅读