简介
混沌工程是在分布式系统上进行实验的学科,旨在提升系统容错性,建立系统抵御生产环境中发生不可预知问题的信心。Chaosblade(混沌之刃) 是阿里巴巴内部 MonkeyKing 对外开源的项目,其遵循混沌工程(Chaos Engineering)实验模型,提供丰富故障场景实现,特点是操作简洁、无侵入、扩展性强。
本文根据 GitHub 收录的文档简单整理,方便后面查看使用。
GitHub 地址:https://github.com/chaosblade-io
混沌实验模型
混沌实验举例:一个运行在 10.0.0.1 机器上的应用,调用com.example.HelloService@1.0.0 Dubbo 服务延迟 3s。
根据故障场景,可以统一成如下的混沌实验模型:
使用 chaosblade 完成上例中的混沌实验注入命令如下:
1 | blade create dubbo delay --time 3000 --consumer --service com.example.HelloService --version 1.0.0 |
结合混沌实验模型对 chaosblade 命令进行分析:
- Target:实验靶点,指实验发生的组件,本例中为
dubbo
,即对 Dubbo 实施实验。 - Scope:实验实施的范围,指具体触发实验的机器或者集群等。由于 chaosblade 是在单机执行的工具,所以 scope 默认为本机,不显式声明。
- Matcher:实验规则匹配器,根据所配置的 Target,定义相关的实验匹配规则,可以配置多个。本例中为
--consumer
、--service
、--version
,根据对应的匹配条件进行匹配。 - Action:指实验模拟的具体场景,Target 不同,实施的场景也不一样。本例中为
delay
、--time
,即执行延迟演练场景,并设置延迟时间。
工具介绍
Chaosblade 的 CLI 工具是 blade,下载最新的 release 包解压后即可使用,无需编译。截至本文更新,最新的 Chaosblade 版本为 v0.1.0 。
执行 ./blade -h
可以查看支持的命令选项,如下:
1 | [quote@chaosblade-0.1.0]$ ./blade -h |
介绍:
- create:创建一个混沌演练实验,执行故障注入。如果注入成功,则返回实验的 uid,用于状态查询和销毁此实验使用。命令
blade create [TARGET] [ACTION] [FLAGS]
- destroy:销毁之前的混沌实验。命令
blade destroy UID
- prepare:混沌实验前的准备,比如演练 Java 应用,则需要挂载 java agent。如果挂载成功,返回挂载的 uid,用于状态查询或者撤销挂载使用。命令
./blade prepare jvm -h
- query:查询混沌实验所需的参数值。
- revoke:撤销之前混沌实验准备,比如卸载 java agent。命令
blade revoke UID
- status:查询混沌实验和混沌实验环境准备记录。命令
blade status UID
或者blade status --type create
- version:打印版本信息。
以上命令都支持首字母简写,且可通过 --help
查看命令帮助,如 ./blade c -h
。查看新手指南,快速上手使用。
使用举例:
- blade create cpu fullload
- blade destroy 7c1f7afc281482c8
- blade status 7c1f7afc281482c8
- blade prepare jvm –process dubbo.consumer
- blade status –type prepare
- blade create dubbo delay –time 3000 –service com.alibaba.demo.HelloService –methodname hello –consumer –process dubbo.consumer
- blade create jvm throwCustomException –exception java.lang.Exception –classname com.example.controller.DubboController –methodname hello
- blade revoke e669d57f079a00cc
- blade query disk mount-point
混沌实验注入
目前支持的演练场景有操作系统类的 CPU、磁盘、进程、网络,Java 应用类的 Dubbo、MySQL、Servlet 和自定义类方法延迟或抛异常等以及杀容器、杀 Pod等,具体可执行 ./blade c -h
查看:
1 | [quote@chaosblade-0.1.0]$ ./blade c -h |
动态脚本实现 Java 实验场景:
Chaosblade 从 0.1.0 版本开始支持编写脚本实现复杂的 Java 实验场景,脚本支持 Java 和 Groovy 实现。动态脚本场景支持指定脚本文件或者脚本内容(base64 编码后的内容)来调用。具体的使用帮助命令:
1 | [quote@chaosblade-0.1.0]$ ./blade create jvm script -h |
主要参数介绍:
classname
:必要参数,指定触发实验场景的类,注意,必须是实现类,不能是接口类。methodname
:必要参数,指定触发实验场景的方法,静态、私有、公有、父类方法都支持。script-type
:脚本类型,默认为 java。script-file
:脚本文件,文件绝对路径。script-content
:脚本内容,是 Base64 编码后的内容。
- 使用
script-content
指定演练脚本内容:
1 | ./blade c jvm script --classname com.example.controller.DubboController --methodname call --script-content [Base64_content] --script-name exception |
- 使用
script-file
参数指定文件演练:
1 | ./blade c jvm script --classname com.example.controller.DubboController --methodname call --script-file [FILE_PATH] --script-name exception |
Java 脚本实现规范:
- 必须创建一个类,对类名和包名没有要求,其中所依赖的类,必须是目标应用所具备的类。
- 必须添加
public Object run(Map<String, Object> params)
方法,其中 params 对象中包含目标方法参数,key 是参数索引下标,从 0 开始,比如目标方法是public String call(Object obj1, Object obj2){}
,则params.get("0")
则返回的是obj1
对象,可以执行params.put("0", <NEW OBJECT>)
来修改目标方法参数(目标方法及--classname
和--methodname
所指定的类方法)。 - 上述方法返回的对象如果不为空,则会根据脚本中返回的对象来修改目标方法返回值,注意类型必须和目标方法返回值一致。如果上述方法返回 null,则不会修改目标方法返回值。
分布式实践
文档下载学习: 分布式服务架构下混沌工程实践