混沌工程ChaosBlade在微服务上的实践

目录

  • ChaosBlade简介
  • 使用文档
  • Demo体验
  • 本地编译
  • 组建架构
  • 场景覆盖图
  • 工具使用实战
    • 背景介绍
    • k8s故障实验
    • CPU故障实验
    • 磁盘故障实验
    • 数据库连接池故障实验
    • HTTP故障实验
    • JVM故障实验
    • 数据库故障实验
    • network故障实验
    • process故障实验
    • 脚本故障实验
    • servlet故障实验

ChaosBlade简介

  • ChaosBlade 是阿里巴巴开源的一款简单易用、功能强大的混沌实验注入工具,提供丰富故障场景实现,可实现底层故障的注入,特点是操作简洁、无侵入、扩展性强。
  • Chaosblade 是内部 MonkeyKing 对外开源的项目,其建立在阿里巴巴近十年故障测试和演练实践基础上,结合了集团各业务的最佳创意和实践。
  • Chaosblade 可直接编译运行,cli 命令提示使执行混沌实验更加简单。目前支持的演练场景有操作系统类的 CPU、磁盘、进程、网络,Java 应用类的 Dubbo、MySQL、Servlet 和自定义类方法延迟或抛异常等以及杀容器、杀 Pod,具体可执行 blade create -h 查看:
  • 目前我涉及到业务线引入此工具的目的就在于在微服务架构中优化原有的故障植入方式,并扩展一些新的植入场景,如服务异常,mysql操作,网络异常,特定方法异常等。

项目地址:https://github.com/chaosblade-io/chaosblade

使用文档

Chaosblade 的 cli 工具是 blade,下载或编译后可直接使用。blade 命令列表如下:

  • prepare:简写 p,混沌实验前的准备,比如演练 Java 应用,则需要挂载 java agent。要演练应用名是 business 的应用,则在目标主机上执行 blade p jvm --process business。如果挂载成功,返回挂载的 uid,用于状态查询或者撤销挂载使用。
  • revoke:简写 r,撤销之前混沌实验准备,比如卸载 java agent。命令是 blade revoke UID
  • create: 简写是 c,创建一个混沌演练实验,指执行故障注入。命令是 blade create [TARGET] [ACTION] [FLAGS],比如实施一次 Dubbo consumer 调用 xxx.xxx.Service 接口延迟 3s,则执行的命令为 blade create dubbo delay --consumer --time 3000 --service xxx.xxx.Service,如果注入成功,则返回实验的 uid,用于状态查询和销毁此实验使用。
  • destroy:简写是 d,销毁之前的混沌实验,比如销毁上面提到的 Dubbo 延迟实验,命令是 blade destroy UID
  • status:简写 s,查询准备阶段或者实验的状态,命令是 blade status UID 或者 blade status --type create

Demo体验

如果不想在本地配置环境,可以下载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对项目进行编译

编译过程解析:

  • 在项目根目录下创建编译结果文件夹 target 和 chaosblade 版本目录,编译后的文件放在 target/chaosblade-[version] 目录下
  • 下载 Java 应用混沌实验所需要的第三方包 jvm-sandbox 至编译缓存文件夹中(target/cache)
  • 下载 chaosblade java agent 和 tools.jar(用于挂载 jvm),用于实施 Java 混沌实验的 jar 包至编译缓存文件夹(target/cache)
  • 解压 JVM-SANDBOX 包至 target/chaosblade-[version]/lib 目录;拷贝 chaosblade java agent jar 到 JVM-SANDBOX 模块目录(target/chaosblade-[version]/lib/sandbox/module)
  • 编译 blade(cli 命令工具)到 target/chaosblade-[version] 目录,实施混沌实验所需要的其他程序会编译到 target/chaosblade-[version]/bin 目录下
  • 编译完成,可以进入 target/chaosblade-[version] 目录,即可使用 blade 工具

组建架构

混沌工程ChaosBlade在微服务上的实践_第1张图片

  • Cli 包含 create、destroy、status、prepare、revoke、version 6 个命令
  • 相关混沌实验数据使用 SQLite 存储在本地(chaosblade 目录下)
  • Create 和 destroy 命令调用相关的混沌实验执行器创建或者销毁混沌实验
  • Prepare 和 revoke 命令调用混沌实验准备执行器准备或者恢复实验环境,比如挂载 jvm-sandbox
  • 混沌实验和混沌实验环境准备记录都可以通过 status 命令查询

场景覆盖图

混沌工程ChaosBlade在微服务上的实践_第2张图片

工具使用实战

Chaosblade的一些命令
混沌工程ChaosBlade在微服务上的实践_第3张图片
目前支持的一些能力

混沌工程ChaosBlade在微服务上的实践_第4张图片

背景介绍

本人研究的课题是AIops中的调用链分析,为了有更大量的数据进行分析,搭建了一个基于SpringBootK8s的购买火车票的微服务系统 trainticket
其包括了60多个微服务,架构图如下
混沌工程ChaosBlade在微服务上的实践_第5张图片
在分布式集群上基于k8s搭建了该系统:
混沌工程ChaosBlade在微服务上的实践_第6张图片
混沌工程ChaosBlade在微服务上的实践_第7张图片
通过自己编写的脚本模拟agent实现了火车票的购买,采用ELK架构对数据进行收集和分析。由于我研究的是AIops中非常有价值的根因定位(调用链数据),需要在整个系统中模拟一些故障,从而生成足量的数据对算法进行训练。

k8s故障实验

混沌工程ChaosBlade在微服务上的实践_第8张图片

./blade create k8s delete --pod ts-voucher-service-5b49bcdbbd-ppsdw --namespace wzk

pod
目前看来只能删除【pod】还有【container】

CPU故障实验

-h查看CPU的使用方法
混沌工程ChaosBlade在微服务上的实践_第9张图片

./blade create cpu fullload

在这里插入图片描述
通过top命令查看结果
混沌工程ChaosBlade在微服务上的实践_第10张图片

./balde status ID 

查看状态,发现确实存在
混沌工程ChaosBlade在微服务上的实践_第11张图片
通过./balde destroy ID 取消CPU打满,通过top查看发现CPU回归正常
混沌工程ChaosBlade在微服务上的实践_第12张图片

磁盘故障实验

混沌工程ChaosBlade在微服务上的实践_第13张图片
采用指令sudo ./blade create disk fill -d --mount-point /bladedisk --size 1024
正常情况下会在/bladedisk文件夹下创建一个chaos_filldisk.log.dat文件。此文件的大小为1024个字节

混沌工程ChaosBlade在微服务上的实践_第14张图片
可以用df查看挂载效果,从23%-36%(6000的效果)
混沌工程ChaosBlade在微服务上的实践_第15张图片
./blade query disk mount-point command to query the mount points
在这里插入图片描述
除了 fillburn 也可以用

数据库连接池故障实验

混沌工程ChaosBlade在微服务上的实践_第16张图片

HTTP故障实验

混沌工程ChaosBlade在微服务上的实践_第17张图片
可以注入时延throw exception两个故障

JVM故障实验

混沌工程ChaosBlade在微服务上的实践_第18张图片
针对jvm的一些实验,ChaosBlade的原理主要是使用了字节码增强技术(ASM),即改变class内容,再重新通过jvm-sandbox提供的SandboxClassLoader加载到jvm使其生效,相比于spring的AOP切面,它更像是一此JVM动态切面

  • 关于jvm的一些增强,具体原理和设计思想可以查看:
    1.chaosblade-exec-jvm:https://github.com/chaosblade-io/chaosblade-exec-jvm 【based on jvm-sandbox】
    2.jvm-sandbox:https://github.com/alibaba/jvm-sandbox

进入k8s中的pod:

kubectl exec -ti   -n   -- /bin/sh

通过ps -ef | grep java看到java进程相应jvm启动参数
混沌工程ChaosBlade在微服务上的实践_第19张图片

数据库故障实验

混沌工程ChaosBlade在微服务上的实践_第20张图片
比如Mysql抛出异常

$ ./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”}

network故障实验

混沌工程ChaosBlade在微服务上的实践_第21张图片

process故障实验

混沌工程ChaosBlade在微服务上的实践_第22张图片

脚本故障实验

混沌工程ChaosBlade在微服务上的实践_第23张图片

servlet故障实验

混沌工程ChaosBlade在微服务上的实践_第24张图片

你可能感兴趣的:(AIops)