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 toolkit
Usage:
blade [command]
Available Commands:
create Create a chaos engineering experiment
destroy Destroy a chaos experiment
...
2)创建实验场景
blade create cpu fullload -h
就可以查看具体的场景参数,选择相应参数执行即可:
Create chaos engineering experiments with CPU load
Usage:
blade create cpu fullload
Aliases:
fullload, fl, load
Examples:
# Create a CPU full load experiment
blade create cpu load
#Specifies two random kernel's full load
blade 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 consumer
Usage:
blade create dubbo delay
Examples:
# Invoke com.alibaba.demo.HelloService.hello() service, do delay 3 seconds experiment
blade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --consumer
Flags:
--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 version
Global 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 frontend
Java 进程
-
--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 experiment
Usage:
blade create mysql delay
Examples:
# Do a delay 2s experiment for mysql client connection port=3306 INSERT statement
blade create mysql delay --time 2000 --sqltype select --port 3306
Flags:
--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 seconds
Global 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 的连接
总结