项目地址:https://github.com/chaosblade-io/chaosblade
Chaosblade 的 cli 工具是 blade,下载或编译后可直接使用。blade 命令列表如下:
blade p jvm --process business
。如果挂载成功,返回挂载的 uid,用于状态查询或者撤销挂载使用。blade revoke UID
blade create [TARGET] [ACTION] [FLAGS]
,比如实施一次 Dubbo consumer 调用 xxx.xxx.Service 接口延迟 3s,则执行的命令为 blade create dubbo delay --consumer --time 3000 --service xxx.xxx.Service
,如果注入成功,则返回实验的 uid,用于状态查询和销毁此实验使用。blade destroy UID
blade status --type create
如果不想在本地配置环境,可以下载chaosblade demo 镜像体验 blade 工具的使用
下载镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/chaosblade/chaosblade-demo:latest
启动镜像:
docker run -it registry.cn-hangzhou.aliyuncs.com/chaosblade/chaosblade-demo:latest
进入镜像之后,可阅读 README.txt 文件实施混沌实验
首先需要安装Go环境
我用的是ubuntu的集群,直接使用
sudo apt-get install golang
注意要配置好GOPATH的地址,go的环境变量可以通过go env
查看然后使用
go get github.com/chaosblade-io/chaosblade
之后项目会下载到GOPATH/src/github.com/chaosblade-io/chaosblade文件夹下,进入这个文件下使用命令make
对项目进行编译
编译过程解析:
本人研究的课题是AIops中的调用链分析,为了有更大量的数据进行分析,搭建了一个基于SpringBoot 和 K8s的购买火车票的微服务系统 trainticket
其包括了60多个微服务,架构图如下
在分布式集群上基于k8s搭建了该系统:
通过自己编写的脚本模拟agent实现了火车票的购买,采用ELK架构对数据进行收集和分析。由于我研究的是AIops中非常有价值的根因定位(调用链数据),需要在整个系统中模拟一些故障,从而生成足量的数据对算法进行训练。
./blade create k8s delete --pod ts-voucher-service-5b49bcdbbd-ppsdw --namespace wzk
./blade create cpu fullload
./balde status ID
查看状态,发现确实存在
通过./balde destroy ID
取消CPU打满,通过top查看发现CPU
回归正常
采用指令sudo ./blade create disk fill -d --mount-point /bladedisk --size 1024
正常情况下会在/bladedisk文件夹下创建一个chaos_filldisk.log.dat文件。此文件的大小为1024个字节
可以用df
查看挂载效果,从23%-36%(6000的效果)
用./blade query disk mount-point
command to query the mount points
除了 fill
外 burn
也可以用
针对jvm的一些实验,ChaosBlade的原理主要是使用了字节码增强技术(ASM),即改变class内容,再重新通过jvm-sandbox提供的SandboxClassLoader加载到jvm使其生效,相比于spring的AOP切面,它更像是一此JVM动态切面
进入k8s中的pod:
kubectl exec -ti -n -- /bin/sh
通过ps -ef | grep java
看到java进程相应jvm启动参数
$ ./blade prepare jvm --process JDBCConnection
{“code”:200,“success”:true,“result”:“f278e66ddb1b4e11”}
$ ./blade create mysql throwCustomException --database test --host 127.0.0.1 --port 3306 --process JDBCConnection --sqltype select --table t_test --exception java.lang.Exception
{“code”:200,“success”:true,“result”:“ddd6799da50f9201”}
增加延迟:
$ ./blade create mysql delay --database test --host 127.0.0.1 --port 3306 --process JDBCConnection --sqltype select --table t_test --time 4000
{“code”:200,“success”:true,“result”:“8e5b35e76098caab”}