起源 | 阿里巴巴云原生公众号
前言
在分布式系统架构下,服务组件繁多且服务间的依赖盘根错节,很难评估单个故障对整个零碎的影响,而且申请链路长,如果监控告警、日志记录等根底服务不欠缺会造成故障响应、故障定位问题难,所以如何构建一个高可用的分布式系统面临着很大挑战。混沌工程就此产生,在可控范畴或环境下通过对系统注入故障,察看零碎行为并发现零碎缺点,以建设对分布式系统因意外条件引发凌乱的能力和信念,继续晋升零碎的稳定性和高可用能力。
混沌工程的施行流程是制订混沌试验打算、定义稳态指标,做出零碎容错行为假如,而后执行混沌试验,查看零碎稳态指标等。也因而混沌试验整个过程须要牢靠的、易于应用且场景丰盛的混沌试验工具注入故障以及残缺的分布式链路追踪和系统监控工具,以便触发应急响应预警计划与疾速地进行故障定位,并察看整个过程零碎的各项数据指标等。本篇文章咱们介绍混沌试验工具(ChaosBlade)和 分布式系统监控工具(SkyWalking),并且联合一个的微服务案例分享一下 ChaosBlade 和 SkyWalking 微服务高可用实际。
工具介绍
1. ChaosBlade
ChaosBlade 是一款遵循混沌工程试验原理,提供丰盛故障场景实现,帮忙分布式系统晋升容错性和可恢复性的混沌工程工具,可实现底层故障的注入,并且在企业上云或往云原生零碎迁徙过程中业务连续性保障,特点是操作简洁、无侵入、扩展性强。ChaosBlade 能够在可控范畴或环境下,通过故障注入,来继续晋升零碎的稳定性和高可用能力。
ChaosBlade 不仅应用简略,而且反对丰盛的试验场景,场景包含:
- 根底资源:比方 CPU、内存、网络、磁盘、过程等试验场景;
- Java 利用:比方数据库、缓存、音讯、JVM 自身、微服务等,还能够指定任意类办法注入各种简单的试验场景;
- C++ 利用:比方指定任意办法或某行代码注入提早、变量和返回值篡改等试验场景;
- Docker 容器:比方杀容器、容器内 CPU、内存、网络、磁盘、过程等试验场景;
- 云原生平台:比方 Kubernetes 平台节点上 CPU、内存、网络、磁盘、过程试验场景,Pod 网络和 Pod 自身试验场景如杀 Pod,容器的试验场景如上述的 Docker 容器试验场景;
ChaosBlade 将场景按畛域实现封装成一个个独自的我的项目,不仅能够使畛域内场景标准化实现,而且十分不便场景程度和垂直扩大,通过遵循混沌试验模型,实现 chaosblade cli 对立调用。
2. SkyWalking
SkyWalking 是一个开源的 APM 零碎,包含对云本地架构中的分布式系统的监督、跟踪和诊断性能。外围个性如下:
- 服务、服务实例、端点指标剖析
- 根本原因剖析
- 服务拓扑图剖析
- 服务、服务实例和端点依赖性剖析
- 检测到慢速服务和终结点
- 性能优化
- 分布式跟踪和上下文流传
- 数据库拜访指标。检测慢速数据库拜访语句(包含 SQL 语句)。
- 报警
工具装置及应用
ChaosBlade 的装置和应用都很简便,ChaosBlade 各场景通过 chaosblade cli 对立调用,仅须要下载对应的 tar 包,解压后应用 blade
可执行文件来进行混沌试验,下载地址详见:https://github.com/chaosblade-io/chaosblade/releases。
1. ChaosBlade 装置
本次咱们的理论环境是 linux-amd64,下载最新版本 chaosblade-linux-amd64.tar.gz 包,装置步骤如下:
## 下载
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 应用
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)创立试验场景
比方创立 CPU 满载场景,执行 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 反对三种形式复原试验:
- ChaosBlade 创立试验胜利后会返回一个 UID,执行
blade destroy uid
即可。 - 如果找不到对应的 UID 时,执行
blade destroy target action
即可,例如blade destroy cpu fullload
。 - 在创立试验时带上
--timeout 10
参数,在试验场景执行十秒后会主动复原,同时反对表达式,例如三分钟--timeout 30m
。
3. SkyWalking 装置 & 应用
SkyWalking 装置和应用文档详见:https://github.com/apache/skywalking/tree/v8.1.0/docs
工具部署好之后,上面咱们将联合案例,主动出击,通过故障注入,察看零碎行为,定位问题并发现零碎缺点,以便构建高可用的微服务零碎。
利用容错案例
咱们在日常环境部署一个微服务利用 来进行试验,应用 ab 测试模拟系统申请。微服务应用服务蕴含前端、购物车、举荐服务、商品、订单等,应用组建蕴含 Springboot、Nacos、Mysql、Redis、Lettuce、Dubbo 等。ChaosBlade 反对该利用的大部分组件,咱们通过 ChaosBlade 来注入混沌试验,验证利用容错能力并且应用 SkyWalking 进行利用监控和问题定位。
1. 案例环境
- Linux-AMD64,发行版本 CentOS-7.x
- JDK1.8
- chaosblade-0.9.0,下载地址:https://chaosblade.oss-cn-hangzhou.aliyuncs.com/agent/github/0.9.0/chaosblade-0.9.0-linux-amd64.tar.gz
- skywalking-apm-8.1.0,下载地址:https://www.apache.org/dyn/closer.cgi/skywalking/8.1.0/apache-skywalking-apm-8.1.0.tar.gz
2. 利用拓扑构造
利用的整体架构如下,前端(frontend)对购物车(car)、产品(product)等都是通过 Dubbo 强依赖调用。
3. 混沌试验步骤
- 制订混沌试验打算
- 定义零碎稳态指标
- 作出零碎容错行为假如
- 执行混沌试验
- 查看稳态指标
- 记录和复原混沌试验
- 修复发现的问题
- 自动化继续进行验证
上面咱们将依据混沌试验步骤应用 ChaosBlade 理论进行混沌试验。
4. 案例一
1)场景
制订混沌试验打算,调用上游服务频繁提早,应用 ab 测试,模仿常态拜访购物车接口,开启 2 个线程,进行 10000 次接口拜访。
ab -n 10000 -c 2 http://127.0.0.1:8083/cart
2)监控指标
定义零碎稳态指标,在 SkyWalking 控制台抉择 /cart 端点,稳态指标如下:
- 均匀响应工夫(RT)在 15ms 左右。
- P99 指标在 20ms 以内。
3)冀望假如
- 配置调用超时工夫,不会长时间阻塞客户端申请。
- 配置服务熔断策略 / 服务降级。
4)混沌试验
在上节咱们曾经介绍过 ChaosBlade 的装置和简略实用,本次案例咱们应用 ChaosBlade 对上游 Dubbo 购物车服务注入提早故障(延迟时间 30 秒),执行 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
参考案例和参数解释,须要上游服务客户端注入提早故障(延迟时间 30 秒),借助 SkyWalking 能够很不便找到链路上 Dubbo 服务相干信息,首先查问端点为 /cart 的链路,在链路上找到 Dubbo 服务,如下图:
- 查找链路
- 获取协定详细信息
点进来能够查看 Dubbo 服务具体跨度信息,获取 Dubbo 服务的 URL 后,就能够拿到应用 ChaosBlade 来注入上游服务延时所须要的参数,因而咱们的最终参数构造为:
--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)监控指标
注入故障后查看零碎指标,查看 SkyWalking 上的指标:
- 均匀响应工夫(RT)在 2000ms 左右,P99 指标在 2000ms 左右
- /cart 接口调用报错,com.alibabacloud.hipstershop.cartserviceapi.service.CartService 服务出现异常。
- 呈现 timeout 异样,超时工夫为 2000ms
论断阐明上游服务配置了调用超时工夫,但没有配置服务熔断策略,理论是不合乎预期的。
6)修复问题
配置服务熔断策略 / 服务降级。
5. 案例二
1)场景
运行中 Dubbo 服务提供方拜访注册核心失败,在注册核心机器注入故障网络丢包 100%。
2)监控指标
定义零碎稳态指标,在 SkyWalking 控制台抉择服务端点,稳态指标如下:
- com.alibabacloud.hipstershop.cartserviceapi.service.CartService.viewCart 服务失常
3)冀望假如
上游服务业务不受影响,上游服务不受影响。
4)混沌试验
对注册核心端口注入丢包故障(100%),咱们是应用的 nacos 作为 Dubbo 的注册核心,默认端口 8848,网卡是 eth0,命令参数如下:
--interface eth0
网卡--percent 100
丢包率 100%--local-port
本地端口 8848
下发命令注入故障:
blade create network loss --interface eth0 --percent 100 --local-port 8848
5)监控指标
在注入故障后,在 SkyWalking 控制台抉择服务端点,稳态指标如下:
- com.alibabacloud.hipstershop.cartserviceapi.service.CartService.viewCart 服务失常
论断:服务对注册核心是弱依赖且服务自身具备本地缓存,合乎冀望假如。
假如利用当初部署 Kubernetes 集群中,能够减少验证注册核心程度扩容能力,ChaosBlade 同时也反对 Kubernetes 集群场景 。
6. 牛刀小试
在上诉案例中,咱们验证了服务是否配置了超时和熔断策略,验证了 Dubbo 是否对注册核心是弱依赖且服务自身具备本地缓存。你是否也跃跃欲动,想要在本人零碎中体验一把?ChaosBlade 为大家筹备了丰盛的试验场景,不仅反对根底资源、利用维度,还是云原生平台的一把利器。ChaosBlade 易于应用,也提供了具体的参数来管制故障最小爆炸半径,置信 ChaosBlade 会让大家非常容易上手。
纸上得来终觉浅,这里咱们提供一个额定的小案例,供大家实际。咱们在利用开发中常常会与关系数据库打交通,而当利用流量快速增长时,瓶颈往往会在数据库端产生,呈现很多慢 SQL。当没有慢 SQL 预警时,咱们很难找到原始 SQL 并对它进行优化,所以慢 SQL 预警非常重要。如何验证利用具备这个能力,ChaosBlade 就能够反对注入 MySQL 慢 SQL 故障,执行 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
能够看到 ChaosBlade 提供了残缺的案例,反对更细粒度的 SQL 类型,表名等参数。对连贯端口时 3306 的 select 操作延时 10s 看看,当流量命中时,是否在你的利用中产生了预警呢?
blade create mysql delay --time 10000 --sqltype select --port 3306
命令参数解释:
--time 10000
延时 10s--sqltype select
仅反对 select 类型的 SQL 语句--port 3306
仅反对端口是 3306 的连贯
总结
在本篇文章中,咱们介绍了混沌工程在理论简单分布式架构中的利用,并且联合 ChaosBlade 和 SkyWalking 在理论利用中进行混沌试验,从而能够依据故障的状况来对系统分析优化,继续晋升零碎的稳定性和高可用能力。ChaosBlade 不仅反对根底资源、利用维度,还是云原生平台的一把利器,欢送大家尝试应用。
ChaosBlade 我的项目地址:https://github.com/chaosblade-io/chaosblade , 欢送大家退出,一起共建!点击查看奉献指南。
作者信息
叶飞:Github @tiny-x,开源社区爱好者,ChaosBlade Committer,参加推动 ChaosBlade 混沌工程生态建设。