- 起源 -
混沌工程是在分布式系统上进行实验的学科, 目的是建立对系统抵御生产环境中失控条件的能力以及信心。由Netflix在2010年底提出,2012开源Chaos Monkey(混乱猴子),中间经过了一系列的演化。具体路线为:
国内则是阿里在12年内部尝试使用,经过6年实践,最后在19.03.28开源了ChaosBlade,目前最新版本ChaosBlade0.6发行于20.05.27。
混沌工程应用场景比如有:
- 提升系统容错能力以及稳定性
- 评估系统容灾红线
- 验证云服务的动态扩展能力
- 验证监控和告警的有效性以及指标是否全面
- 故障突袭,提升相关人员定位,故障问题的能力
- 混沌工程原则 -
混沌工程原则是混沌工程的原理和设计指导思维。
- 建立稳定状态的假设。 将系统正常运行时的状态定义为系统的“稳定状态”。
- 多样化现实世界事件。 我们无法穷举所有可能事件,但可以尽量多元化现实事件来模拟。
- 在生产环境运行实验。
为了保障系统在未来不会遭受大规模中断事故,冒一点可控的风险是值得的。
- 持续自动化运行实验。
找到那些本不应该让系统崩溃的事件的原因,包括那些还从未发生过的事件,保证系统的高可用。
- 最小化“爆炸半径”。
“切尔诺贝利事件”起源一次验证冷却剂泵冗余电源的演习,所以我们需要吸取教训,且混沌工程的职责就是要理解和降低生产风险,可以为实验而具备良好设计的系统可以阻止大规模的生产事故,仅仅影响到少量的用户。
混沌工程原则其实是一种反脆弱哲学的软件实践,德国哲学家尼采说过:“任何不能杀了我的,只会令我更强大”。混动工程通过模拟现实世界事件去实验我们的系统,帮助我们的系统在失控的生产环境中保证高可用。
- 混沌实验 -
一、需求 混沌实验是混沌工程的落地表现,任何事情都有前提,实验一样有自己的前提需求:
- 对什么做混沌实验 明确实验靶点,确定实验参与者和组件。
- 混沌实验实施的范围是是什么 确定实验范围,比如对应的集群、集群、对象
- 具体实施什么实验 确定实验匹配条件,建立好匹配规则器
- 实验生效的匹配条件有哪些 驱动实验实行,即建立号具体执行的实验规则
二、混沌实验模型 由混沌实验的需求,我们可以抽象出混沌实验,得到混沌实验模型:
- Target:实验靶点,指实验发生的组件,例如容器、应用框架(Dubbo、Redis、Zookeeper)等。
- Scope:实验范围,指具体触发实验的机器或者集群等。
- Matcher:规则匹配器,根据所配置的 Target,定义相关的实验匹配规则,可以配置多个。
- RPC 领域的 grpc、Dubbo,可以根据服务提供者提供的服务和服务消费者调用的服务进行匹配。
- 缓存领域的 Redis,可以根据 set、get 操作进行匹配。
- Action:实验行为,具体的实验规则,指实验模拟的具体场景,Target 不同,实施的场景也不一样。
- 比如磁盘,可以演练磁盘满,磁盘IO 读写高,磁盘硬件故障等。
- 比如应用,可以抽象出延迟、异常、返回指定值(错误码、大对象等)、参数篡改、重复调用等。
三、混沌实验流程 设计一个混沌实验的流程如下:
- 选定假设
- 设定实验的范围
- 识别出要监控的指标
- 在组织内沟通到位
- 执行实验
- 分析实验结果
- 扩大实验范围
- 自动化实验
四、混沌实验场景案例
- 模拟数据中心的故障
- 强制系统时钟不同步
- 在驱动程序代码中模拟I/O异常l模拟服务之间的延迟
- 随机引发函数抛异常 - 混沌工程 VS 测试 -
混沌工程、故障注入和故障测试在关注点和工具中都有很大的重叠,经过思考后,可以得出以下差别:
- 对象
- 混沌工程侧重现实世界意外事件引起的系统不稳定。l测试偏重于系统自身的流程不稳定性。
- 目标
- 混沌工程侧重实践产生无法预知的信息,帮助我们更好的认识系统,有更多的不确定性。
- 测试更偏重于是否达到预期。
- 结果
- 测试主要用来验证;混沌工程用来探索未知,发现新知识。
- 环境
- 混沌工程离生产环境越近越好,而且需要持续自动化运行实验。比如全链路压测、广义负载均衡等。
- 测试主要是内部环境自主控制。 - ChaosBlade -
ChaosBlade的中文名是“混沌之刃”,是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具,是MonkeyKing对外开源的项目。建立在阿里巴巴近十年故障测试和演练实践基础上,结合了集团各业务的最佳创意和实践。旨在帮助企业提升分布式系统的容错能力,并且在企业上云或往云原生系统迁移过程中业务连续性提供保障。
目前支持的场景有:基础资源、Java应用、C 应用、Docker容器以及 Kubernetes平台。该项目将场景按领域实现封装成单独的项目,不仅可以使领域内场景标准化实现,而且非常方便场景水平和垂直扩展,通过遵循混沌实验模型,实现 chaosblade cli 统一调用。
ChaosBlade 特点
- 场景丰富度高
- 使用简单,易于理解
- 动态加载,无侵入
- 场景扩展方便
- 支持运行时长设置
ChaosBlade 支持的实验
- CPU 满载
- 网络丢包 延迟 屏蔽
- 域名屏蔽
- 磁盘填充,磁盘 IO 读写负载
- 杀进程
- 删容器,POD
- RPC 调用延迟
- JAVA 方法注入指定异常和设置返回值
ChaosBlade组成
- chaosblade:阿里巴巴开源的一款简单易用、功能强大的混沌实验注入工具;地址为 https://github.com/chaosblade-io/chaosblade
- chaosblade-exec-jvml:对 Java 应用实施混沌实验的 chaosblade执行器;地址为https://github.com/chaosblade-io/chaosblade-exec-jvm
ChaosBlade模型
- ExpModelCommandSpec:模型声明,包含组件名称和所支持的实验场景列表。
- ExpActionCommandSpec:实验场景,包含场景名称,场景所需参数和一些实验规则匹配器
- ExpFlagSpecl:实验匹配器定义,包含名字、描述、参数值和是否必要
- Executorl:执行器,例如如cpu下的fullload
- expCommand:输入命令
ChaosBladel文档
https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/
作者介绍
林淮川
毕业于西安交通大学;奈学教育《百万架构师训练营》的讲师,奈学教育企业级源码内源负责人,前大树金融高级架构师;前大树金融技术委员会开创者;前大树金融供应链金融技术总监;前天阳宏业交易事业部技术主管;多年互联网金融行业(ToB)经验。