ChaosBlade x SkyWalking 微服务高可用实践
前言
工具介绍
1. ChaosBlade
是一款遵循混沌工程实验原理,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具,可实现底层故障的注入,并且在企业上云或往云原生系统迁移过程中业务连续性保障,特点是操作简洁、无侵入、扩展性强。ChaosBlade 可以在可控范围或环境下,通过故障注入,来持续提升系统的稳定性和高可用能力。
-
基础资源:比如 CPU、内存、网络、磁盘、进程等实验场景;
-
Java 应用:比如数据库、缓存、消息、JVM 本身、微服务等,还可以指定任意类方法注入各种复杂的实验场景;
-
C++ 应用:比如指定任意方法或某行代码注入延迟、变量和返回值篡改等实验场景;
-
Docker 容器:比如杀容器、容器内 CPU、内存、网络、磁盘、进程等实验场景;
-
云原生平台:比如 Kubernetes 平台节点上 CPU、内存、网络、磁盘、进程实验场景,Pod 网络和 Pod 本身实验场景如杀 Pod,容器的实验场景如上述的 Docker 容器实验场景;
2. SkyWalking
是一个开源的 APM 系统,包括对云本地架构中的分布式系统的监视、跟踪和诊断功能。核心特性如下:
-
服务、服务实例、端点指标分析
-
根本原因分析
-
服务拓扑图分析
-
服务、服务实例和端点依赖性分析
-
检测到慢速服务和终结点
-
性能优化
-
分布式跟踪和上下文传播
-
数据库访问指标,检测慢速数据库访问语句(包括 SQL 语句)
-
报警
工具安装及使用
blade
可执行文件来进行混沌实验。
1. ChaosBlade 安装
## 下载wget https://chaosblade.oss-cn-hangzhou.aliyuncs.com/agent/github/0.9.0/chaosblade-0.9.0-linux-amd64.tar.gz## 解压tar -zxf chaosblade-0.9.0-linux-amd64.tar.gz## 设置环境变量export PATH=$PATH:chaosblade-0.9.0/## 测试blade -h
2. ChaosBlade 使用
blade 可执行文件即可创建目前所支持的所有场景的混沌实验。首先使用 blade -h
查看如何使用,选择子命令之后只需要逐层向下使用 -h 即可看到完整的使用案例以及各参数的详细解析,下面我们来演示一下:
1)blade 如何使用
blade -h 可以
查看支持命令有哪些:
An easy to use and powerful chaos engineering experiment toolkitUsage:blade [command]Available Commands:create Create a chaos engineering experimentdestroy Destroy a chaos experiment...
2)创建实验场景
blade create cpu fullload -h
就可以查看具体的场景参数,选择相应参数执行即可:
Create chaos engineering experiments with CPU loadUsage:blade create cpu fullloadAliases:fullload, fl, loadExamples:# Create a CPU full load experimentblade create cpu load#Specifies two random kernel's full loadblade create cpu load --cpu-percent 60 --cpu-count 2...Flags:--blade-release string Blade release package,use this flag when the channel is ssh--channel string Select the channel for execution, and you can now select SSH--climb-time string durations(s) to climb--cpu-count string Cpu count--cpu-list string CPUs in which to allow burning (0-3 or 1,3)--cpu-percent string percent of burn CPU (0-100)...
3)恢复实验
-
ChaosBlade 创建实验成功后会返回一个UID,执行 blade destroy uid即可。
-
如果找不到对应的 UID 时,执行 blade destroy target action即可,例如blade destroy cpu fullload。
-
在创建实验时带上 --timeout 10参数,在实验场景执行十秒后会自动恢复,同时支持表达式,例如三分钟--timeout 30m。
3. SkyWalking 安装&使用
应用容错案例
我们在日常环境部署一个来进行实验,使用 ab 测试模拟系统请求。微服务应用服务包含前端、购物车、推荐服务、商品、订单等,使用组建包含 Springboot、Nacos、Mysql、Redis、Lettuce、Dubbo 等。ChaosBlade 支持该应用的大部分组件,我们通过 ChaosBlade 来注入混沌实验,验证应用容错能力并且使用 SkyWalking 进行应用监控和问题定位。
1. 案例环境
-
Linux-AMD64,发行版本 CentOS-7.x
-
JDK1.8
-
chaosblade-0.9.0,下载地址:http://t.tb.cn/1CCLPUQ3fj9BMjFkJXsMmC
-
skywalking-apm-8.1.0,下载地址:http://t.tb.cn/S1iTZzEyS42YYENrK2VPH
2. 应用拓扑结构
3. 混沌实验步骤
-
制定混沌实验计划
-
定义系统稳态指标
-
作出系统容错行为假设
-
执行混沌实验
-
检查稳态指标
-
记录和恢复混沌实验
-
修复发现的问题
-
自动化持续进行验证
4. 案例一
1)场景
ab -n 10000 -c 2 http://127.0.0.1:8083/cart
2)监控指标
-
平均响应时间(RT)在 15ms 左右
-
P99 指标在 20ms 以内
3)期望假设
-
配置调用超时时间,不会长时间阻塞客户端请求
-
配置服务熔断策略/服务降级
4)混沌实验
blade create dubbo delay -h 命令
查看 dubbo 调用延迟的命令用法:
Dubbo interface to do delay experiments, support provider and consumerUsage:blade create dubbo delayExamples:# Invoke com.alibaba.demo.HelloService.hello() service, do delay 3 seconds experimentblade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --consumerFlags:--appname string The consumer or provider application name--consumer To tag consumer role experiment.--effect-count string The count of chaos experiment in effect--effect-percent string The percent of chaos experiment in effect--group string The service group-h, --help help for delay--methodname string The method name--offset string delay offset for the time--override only for java now, uninstall java agent--pid string The process id--process string Application process name--provider To tag provider experiment--service string The service interface--time string delay time (required)--timeout string set timeout for experiment in seconds--version string the service versionGlobal Flags:-d, --debug Set client to DEBUG mode--uid string Set Uid for the experiment, adapt to docker
查找链路
获取协议详细信息
-
--time 30000延迟 30s
-
--service com.alibabacloud.hipstershop.cartserviceapi.service.CartService服务
-
--methodname viewCart服务方法
-
--process frontendJava 进程
-
--consumer当前是 Dubbo 服务 客户端
blade create dubbo delay --time 30000 --service com.alibabacloud.hipstershop.cartserviceapi.service.CartService --methodname viewCart --process frontend --consumer
5)监控指标
平均响应时间(RT)在 2000ms 左右,P99 指标在 2000ms 左右
/cart 接口调用报错,com.alibabacloud.hipstershop.cartserviceapi.service.CartService 服务出现异常。
出现 timeout 异常,超时时间为 2000ms
|
|
|
|
|
|
|
|
|
|
|
|
6)修复问题
1)场景
2)监控指标
com.alibabacloud.hipstershop.cartserviceapi.service.CartService.viewCart 服务正常。
3)期望假设
4)混沌实验
-
--interface eth0网卡
-
--percent 100丢包率 100%
-
--local-port本地端口 8848
blade create network loss --interface eth0 --percent 100 --local-port 8848
5)监控指标
|
|
|
|
|
|
|
|
6. 牛刀小试
blade create mysql delay -h 查
看 MySQL 调用延迟的命令用法:
Mysql delay experimentUsage:blade create mysql delayExamples:# Do a delay 2s experiment for mysql client connection port=3306 INSERT statementblade create mysql delay --time 2000 --sqltype select --port 3306Flags:--database string The database name which used--effect-count string The count of chaos experiment in effect--effect-percent string The percent of chaos experiment in effect-h, --help help for--host string The database host--offset string delay offset for the time--override only for java now, uninstall java agent--pid string The process id--port string The database port which used--process string Application process name--sqltype string The sql type, for example, select, update and so on.--table string The first table name in sql.--time string delay time (required)--timeout string set timeout for experiment in secondsGlobal Flags:-d, --debug Set client to DEBUG mode--uid string Set Uid for the experiment, adapt to docker
blade create mysql delay --time 10000 --sqltype select --port 3306
-
--time 10000延时 10s
-
--sqltype select仅支持 select 类型的 SQL 语句
-
--port 3306仅支持端 口是 3306 的连接
总结
