介绍一款混沌实验注入工具—ChaosBlade

chaosblade.png

简介

混沌工程是在分布式系统上进行实验的学科,旨在提升系统容错性,建立系统抵御生产环境中发生不可预知问题的信心。Chaosblade(混沌之刃) 是阿里巴巴内部 MonkeyKing 对外开源的项目,其遵循混沌工程(Chaos Engineering)实验模型,提供丰富故障场景实现,特点是操作简洁、无侵入、扩展性强。

本文根据 GitHub 收录的文档简单整理,方便后面查看使用。

GitHub 地址:https://github.com/chaosblade-io

混沌实验模型

混沌实验举例:一个运行在 10.0.0.1 机器上的应用,调用com.example.HelloService@1.0.0 Dubbo 服务延迟 3s。

根据故障场景,可以统一成如下的混沌实验模型:

chaos_model

使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[quote@chaosblade-0.1.0]$ ./blade -h
An easy to use and powerful chaos engineering experiment toolkit

Usage:
blade [command]

Available Commands:
create Create a chaos engineering experiment
destroy Destroy a chaos experiment
help Help about any command
prepare Prepare to experiment
query Query the parameter values required for chaos experiments
revoke Undo chaos engineering experiment preparation
status Query preparation stage or experiment status
version Print version info

Flags:
-d, --debug Set client to DEBUG mode
-h, --help help for blade

Use "blade [command] --help" for more information about a command.

介绍:

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[quote@chaosblade-0.1.0]$ ./blade c -h
Create a chaos engineering experiment

Usage:
blade create [command]

Aliases:
create, c

Examples:
create dubbo delay --time 3000 --offset 100 --service com.example.Service --consumer

Available Commands:
cpu Cpu experiment
disk Disk experiment
docker Execute a docker experiment
druid Druid experiment
dubbo dubbo experiment
http http experiment
jvm method
k8s Kubernetes experiment
mysql mysql experiment
network Network experiment
process Process experiment
script Script chaos experiment
servlet java servlet experiment

Flags:
-h, --help help for create

Global Flags:
-d, --debug Set client to DEBUG mode

Use "blade create [command] --help" for more information about a command.

动态脚本实现 Java 实验场景:

Chaosblade 从 0.1.0 版本开始支持编写脚本实现复杂的 Java 实验场景,脚本支持 Java 和 Groovy 实现。动态脚本场景支持指定脚本文件或者脚本内容(base64 编码后的内容)来调用。具体的使用帮助命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[quote@chaosblade-0.1.0]$ ./blade create jvm script -h
Dynamically execute custom scripts

Usage:
blade create jvm script

Flags:
--classname string The class name with package (required)
--effect-count string The count of chaos experiment in effect
--effect-percent string The percent of chaos experiment in effect
-h, --help help for script
--methodname string The method name (required)
--process string Application process name
--script-content string The script contents
--script-file string The Script file full path
--script-name string The script name for label, unnecessary
--script-type string The script file type, java or groovy, default value is java
--timeout string set timeout for experiment

Global Flags:
-d, --debug Set client to DEBUG mode

主要参数介绍:

  • classname:必要参数,指定触发实验场景的类,注意,必须是实现类,不能是接口类。

  • methodname:必要参数,指定触发实验场景的方法,静态、私有、公有、父类方法都支持。

  • script-type:脚本类型,默认为 java。

  • script-file:脚本文件,文件绝对路径。

  • script-content:脚本内容,是 Base64 编码后的内容。

  1. 使用 script-content 指定演练脚本内容:
1
./blade c jvm script --classname com.example.controller.DubboController --methodname call --script-content [Base64_content]  --script-name exception
  1. 使用 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,则不会修改目标方法返回值。

分布式实践

文档下载学习: 分布式服务架构下混沌工程实践