Chaos Engineering(混沌工程),相信搞互联网的或多或少都听过,Netflix发明了Chaos Monkey,经过社区的发展回馈,慢慢行成了Chaos Engineering,当你看到这边文章的时候,相信你对混沌工程是有一丢丢想法的,要不然你也不会找到这里来,国内关于混沌工程的资料不多,多数都是讲解概念的,可借鉴的落地方案不多(但也不是没有),例如阿里的Chaosblade,搞明白国内的之后,就可以朝着国外放眼了,这里有大量Chaos Engineering的资料。
本文就以chaosblade工具为例,来看看一个简单的Chaos Engineering怎么来落地,快速上手:chaosblade wiki,关于chaosblade的架构设计本文就不聊了,直接两个字:开干,所有操作均在/mnt/chaosblade-0.0.3下进行
blade指令
./blade -h
An easy to use and powerful chaos engineering experiment toolkit
Usage:
blade [command]
Available Commands:
create Create a chaos engineering experiment #create 创建一个chaos engineering
destroy Destroy a chaos experiment #destroy 销毁一个destroy,一般销毁完之后,再执行revoke子命令
help Help about any command #在任何子命令后输入help可查看该子命令的用法
prepare Prepare to experiment #prepare 准备一个chaos engineering实验
query Query the parameter values required for chaos experiments #查询已经注册的chaos
revoke Undo chaos engineering experiment preparation #撤回注册chaos engineering
status Query preparation stage or experiment status #查看注册的chaos engineering的状态
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.
ps:其中prepare、create、destroy、revoke四个指令用的比较多,prepare是运行java程序的时候需要提前使用的一个指令,提前attach到jvm上
blade默认支持场景
./blade create -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 #cpu负载测试,还可以指定负载在哪个cpu上
disk Disk experiment #disk负载测试,支持disk的read/write负载模拟,还支持模拟磁盘填充
docker Execute a docker experiment #docker负载测试,支持docker的cpu、disk、network、process、remove、script等负载测试
druid Druid experiment #支持druid连接池的连接满模拟
dubbo dubbo experiment #支持dubbo的延迟、连接池满、异常模拟
jvm method #这个支持的就多了,下面细聊
k8s Kubernetes experiment #k8s负载测试,支持k8s的同期的删除测试
mysql mysql experiment #支持mysql的延迟、异常模拟
network Network experiment #network负载测试,支持网络的延迟、dns查询延迟、丢包、远程服务丢失等场景
process Process experiment #process负载测试,支持模拟kill process的场景
script Script chaos experiment
servlet java servlet experiment #支持servlet的延迟、异常模拟
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.
其中network、jvm、mysql、docker都是一些热门组件的异常模拟场景。
下面看看jvm的,jvm支持以下五个场景:
delay delay time
outofmemoryerror JVM out of memory
return Return the specify value
throwCustomException throw custom exception
throwDeclaredException Throw the first declared exception of method
ps:其中delay、throwCustomException都是需要指定到方法级别的,如果测试人员对业务代码了解深入的话,可以利用这个特性做破坏性测试。
看着支持的场景很多,其实在Chaosblade没出现之前,cpu、disk、network、process、k8s这些场景都是可以通过linux下面的某些命令来模拟的,如果是阿里生态系的,jvm、druid、dubbo这三个需要熟练的使用, 如果官方能提供oracle的异常场景就更好了。
blade启动注意
blade需要和待测试的运行进程属于同一用户,且JAVA版本、JAVA_HOME要设置正确。针对系统层面的设置,则需要管理员权限。
blade模拟接口延时
准备attach一个jvm
./blade prepare jvm --process 19761
---
{"code":200,"success":true,"result":"2679c66005a0aadd"}
ps:2679c66005a0aadd需要记住,如果忘记也可以通过query查询
模拟接口延迟
./blade create network delay --interface eth0 --exclude-port 22 --time 10000
---
{"code":200,"success":true,"result":"dc913ccc9a7e5ea1"}
ps:注意针对接口的延迟需要管理员权限才能操作
测试接口延迟
#测试前
time curl http://192.168.1.6:8000/test/index.php -I
---
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Content-Length: 69
Date: Mon, 10 Jun 2019 08:35:31 GMT
real 0m0.026s
user 0m0.003s
sys 0m0.000s
#测试后
time curl http://192.168.1.6:8000/test/index.php -I
---
curl: (7) couldn't connect to host
real 0m3.003s
user 0m0.001s
sys 0m0.003s
ps:可以看到针对url的访问明显失败
查看有哪些chaos实验
./blade status --type create
{
"code": 200,
"success": true,
"result": [
{
"Uid": "dc913ccc9a7e5ea1",
"Command": "network",
"SubCommand": "delay",
"Flag": "--exclude-port 45685 --debug false --help false --interface eth0 --time 10000",
"Status": "Success",
"Error": "",
"CreateTime": "2019-06-10T16:36:31.072125181+08:00",
"UpdateTime": "2019-06-10T16:36:31.107533437+08:00"
}
]
}
销毁创建的chaos实验
./blade destroy dc913ccc9a7e5ea1
---
{"code":200,"success":true,"result":"command: network delay --exclude-port 22 --debug false --help false --interface eth0 --time 10000"}
撤销chaos工程
先查询id
./blade status --type prepare
---
{
"code": 200,
"success": true,
"result": [
{
"Uid": "2679c66005a0aadd",
"ProgramType": "jvm",
"Process": "19761",
"Port": "16698",
"Status": "Running",
"Error": "",
"CreateTime": "2019-06-10T16:31:58.09072211+08:00",
"UpdateTime": "2019-06-10T16:32:05.907016597+08:00"
}
]
}
再撤销
./blade revoke 2679c66005a0aadd
---
{"code":200,"success":true,"result":"success"}
Chaosblade模型
ps:默认的场景肯定不能完全适应你的需求,所以我们还是需要了解Chaosblade的设计模型的,看看如何自定义扩展需求场景
Chaosblade命令执行过程