故障演练利器之ChaosBlade介绍
一、什么是ChaosBlade
ChaosBlade是阿里巴巴在其自身故障测试和演练实践基础上,结合自身业务场景而开发的故障注入工具。
该工具目前已经开源,项目地址:
https://github.com/chaosblade-io/chaosblade
二、为什么需要故障演练
ChaosBlade是一款故障注入工具,是整个故障演练的一个小环节,那为什么要做故障演练呢?
在我看来,主要是为了验证在故障场景程序的可靠性和可用性,因为大部分人写代码都有惯性,只喜欢写正向流程,对于一些异常处理往往是非常简单和粗暴的,所以很有可能出现在系统发生故障时可能出现各种问题:如数据丢失、数据对不上等。
故障演练主要是通过模拟一个个故障场景来验证程序的可靠性和可用性,这样也反过来提升系统架构,为后续开发、设计提供一些指导。
三、安装
如果不想自己修改代码,可以用官方版本:
https://github.com/chaosblade-io/chaosblade/releases
我选择的是v0.6.0,解压后在根目录下有个blade的二进制文件。
如果想自己编译,则需要以下软件,以下是我的环境相关软件版本:
Java:1.8.1
Maven:3.6.3
Go>=1.13
Git>=1.8.5
编译步骤:
git clone https://github.com/chaosblade-io/chaosblade
git checkout v0.6.0
make
四、使用
官方文档已经介绍的非常详细了,建议仔细阅读:
https://chaosblade-io.gitbook.io/chaosblade-help-zh-cn/
这里介绍一个模拟CPU Load高的命令如何使用:
blade create cpu load
--返回如下
{"code":200,"success":true,"result":"0496e31d8c619016"}
其中result相当于一个实验,如果想停止试验,执行命令:
blade destroy 0496e31d8c619016
--输出如下
{"code":200,"success":true,"result":{"Target":"cpu","Scope":"","ActionName":"fullload","ActionFlags":{}}}
功能大概分几大块:
1、模拟CPU负载高
blade create cpu load
2、模拟磁盘IO压力
blade create disk burn
blade create disk fill
3、内存负载
blade create mem load
4、模块网络负载
有模块延迟、丢包、重复等场景,这里就不一一详述了
5、模拟进程宕掉
blade create process kill
blade create process stop
6、JVM
blade create jvm
可以指定类,方法注入延迟、返回值、异常故障场景,也可以编写 groovy 和 java 脚本来实现复杂的场景。
7、WEB服务
后台启动 blade,会暴露出 web 服务,上层可通过 http 调用。
请求格式是 chaosblade?cmd=具体命令,例如执行 CPU 满载,则请求是 chaosblade?cmd=create%20cpu%20fullload
这个是重点,因为前面讲的这些功能都是单机命令行的,实际的场景是希望在一个控制台集中操作所有场景,有了这个远程通信能力,上述需求落地才有了可能。
五、整体感受
ChaosBlade的功能非常强大,常见的故障场景都能覆盖到,另外还提供了远程控制的能力,美中不足的是目前没有开源相应的控制台,如果需要最终落地并且产品化还需要做进一步开发,不过阿里 的AHAS已经集成了ChaosBlade,如果只是用了一个云厂商可以不用自己开发了,如果使用多个云厂商,像国内阿里云,海外AWS的这种情况,就需要自己做进一步的开发了。
真的需要做控制台,细节很多,如何自动化发现ChaosBlade,并且和自己的业务结合,还是需要自己做进一步的开发,如我在Mysql和Redis上都部署了ChaosBlade,如果识别自己操控的是Mysql还是Redis,这就涉及到ChaosBlade的管理了,这个可以参考下ServiceMesh的设计。
- Linux下FTP虚拟账号环境部署总结
- Replace方法与正则表达式的性能比较
- 由索引节点(inode)爆满引发的问题
- As3.0中的位图(Bitmap/BitmapData)编程
- Mesos+Zookeeper+Marathon的Docker管理平台部署记录(2)--负载均衡marathon-lb
- Docker集群管理工具-Kubernetes部署记录
- AS3:小游戏“贪吃蛇”的实现
- 超实用的8个Linux命令行性能监测工具
- 用javascript替换URL中的参数值
- Gitblit版本服务器环境部署记录
- HDK扩展自定义VEX函数print
- AsyncTask和Handler对比
- sql初始化XML操作
- 给你一根杠杆,撬起万亿的小程序红利市场!
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu16.04搭建NFS 文件共享服务器的方法
- 详解linux pwm驱动编写
- Ubuntu 16.04 LTS系统里中文txt文件打开的问题解决
- linux nand flash驱动编写
- 在Linux中使用Vundle管理Vim插件的方法
- 详解linux添加硬盘分区挂载教程
- CentoS6.5环境下redis4.0.1(stable)安装和主从复制配置方法
- 详解linux dma驱动编写
- CentOS6.5环境安装nginx服务器及负载均衡配置操作详解
- 详解linux 驱动编写(sd卡驱动)
- Centos 6.9环境下创建用户及删除用户的方法
- 详解linux驱动编写(入门)
- Ubuntu使用国内源出现Hash Sum mismatch错误的解决
- CentOS基于nginx反向代理实现负载均衡的方法
- CentOS7服务器环境下vsftpd安装及配置方法