ChaosBlade x SkyWalking 微服务高可用实践
來源|阿里巴巴云原生公眾號(hào)
前言
在分布式系統(tǒng)架構(gòu)下,服務(wù)組件繁多且服務(wù)間的依賴錯(cuò)綜復(fù)雜,很難評(píng)估單個(gè)故障對(duì)整個(gè)系統(tǒng)的影響,而且請(qǐng)求鏈路長(zhǎng),如果監(jiān)控告警、日志記錄等基礎(chǔ)服務(wù)不完善會(huì)造成故障響應(yīng)、故障定位問題難,所以如何構(gòu)建一個(gè)高可用的分布式系統(tǒng)面臨著很大挑戰(zhàn)。混沌工程就此產(chǎn)生,在可控范圍或環(huán)境下通過對(duì)系統(tǒng)注入故障,觀察系統(tǒng)行為并發(fā)現(xiàn)系統(tǒng)缺陷,以建立對(duì)分布式系統(tǒng)因意外條件引發(fā)混亂的能力和信心,持續(xù)提升系統(tǒng)的穩(wěn)定性和高可用能力。
混沌工程的實(shí)施流程是制訂混沌實(shí)驗(yàn)計(jì)劃、定義穩(wěn)態(tài)指標(biāo),做出系統(tǒng)容錯(cuò)行為假設(shè),然后執(zhí)行混沌實(shí)驗(yàn),檢查系統(tǒng)穩(wěn)態(tài)指標(biāo)等。也因此混沌實(shí)驗(yàn)整個(gè)過程需要可靠的、易于使用且場(chǎng)景豐富的混沌實(shí)驗(yàn)工具注入故障以及完整的分布式鏈路追蹤和系統(tǒng)監(jiān)控工具,以便觸發(fā)應(yīng)急響應(yīng)預(yù)警方案與快速地進(jìn)行故障定位,并觀察整個(gè)過程系統(tǒng)的各項(xiàng)數(shù)據(jù)指標(biāo)等。本篇文章我們介紹混沌實(shí)驗(yàn)工具(ChaosBlade)和 分布式系統(tǒng)監(jiān)控工具(SkyWalking),并且結(jié)合一個(gè)的微服務(wù)案例分享一下 ChaosBlade 和 SkyWalking 微服務(wù)高可用實(shí)踐。
工具介紹
1. ChaosBlade
ChaosBlade 是一款遵循混沌工程實(shí)驗(yàn)原理,提供豐富故障場(chǎng)景實(shí)現(xiàn),幫助分布式系統(tǒng)提升容錯(cuò)性和可恢復(fù)性的混沌工程工具,可實(shí)現(xiàn)底層故障的注入,并且在企業(yè)上云或往云原生系統(tǒng)遷移過程中業(yè)務(wù)連續(xù)性保障,特點(diǎn)是操作簡(jiǎn)潔、無侵入、擴(kuò)展性強(qiáng)。ChaosBlade 可以在可控范圍或環(huán)境下,通過故障注入,來持續(xù)提升系統(tǒng)的穩(wěn)定性和高可用能力。
ChaosBlade 不僅使用簡(jiǎn)單,而且支持豐富的實(shí)驗(yàn)場(chǎng)景,場(chǎng)景包括:
- 基礎(chǔ)資源:比如 CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤、進(jìn)程等實(shí)驗(yàn)場(chǎng)景;
- Java 應(yīng)用:比如數(shù)據(jù)庫、緩存、消息、JVM 本身、微服務(wù)等,還可以指定任意類方法注入各種復(fù)雜的實(shí)驗(yàn)場(chǎng)景;
- C++ 應(yīng)用:比如指定任意方法或某行代碼注入延遲、變量和返回值篡改等實(shí)驗(yàn)場(chǎng)景;
- Docker 容器:比如殺容器、容器內(nèi) CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤、進(jìn)程等實(shí)驗(yàn)場(chǎng)景;
- 云原生平臺(tái):比如 Kubernetes 平臺(tái)節(jié)點(diǎn)上 CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤、進(jìn)程實(shí)驗(yàn)場(chǎng)景,Pod 網(wǎng)絡(luò)和 Pod 本身實(shí)驗(yàn)場(chǎng)景如殺 Pod,容器的實(shí)驗(yàn)場(chǎng)景如上述的 Docker 容器實(shí)驗(yàn)場(chǎng)景;
ChaosBlade 將場(chǎng)景按領(lǐng)域?qū)崿F(xiàn)封裝成一個(gè)個(gè)單獨(dú)的項(xiàng)目,不僅可以使領(lǐng)域內(nèi)場(chǎng)景標(biāo)準(zhǔn)化實(shí)現(xiàn),而且非常方便場(chǎng)景水平和垂直擴(kuò)展,通過遵循混沌實(shí)驗(yàn)?zāi)P?#xff0c;實(shí)現(xiàn) chaosblade cli 統(tǒng)一調(diào)用 。
2. SkyWalking
SkyWalking 是一個(gè)開源的 APM 系統(tǒng),包括對(duì)云本地架構(gòu)中的分布式系統(tǒng)的監(jiān)視、跟蹤和診斷功能。核心特性如下:
- 服務(wù)、服務(wù)實(shí)例、端點(diǎn)指標(biāo)分析
- 根本原因分析
- 服務(wù)拓?fù)鋱D分析
- 服務(wù)、服務(wù)實(shí)例和端點(diǎn)依賴性分析
- 檢測(cè)到慢速服務(wù)和終結(jié)點(diǎn)
- 性能優(yōu)化
- 分布式跟蹤和上下文傳播
- 數(shù)據(jù)庫訪問指標(biāo)。檢測(cè)慢速數(shù)據(jù)庫訪問語句(包括SQL語句)。
- 報(bào)警
工具安裝及使用
ChaosBlade 的安裝和使用都很簡(jiǎn)便,ChaosBlade 各場(chǎng)景通過 chaosblade cli 統(tǒng)一調(diào)用,僅需要下載對(duì)應(yīng)的 tar 包,解壓后使用 blade 可執(zhí)行文件來進(jìn)行混沌實(shí)驗(yàn),下載地址詳見:https://github.com/chaosblade-io/chaosblade/releases 。
1. ChaosBlade 安裝
本次我們的實(shí)際環(huán)境是 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 ## 設(shè)置環(huán)境變量 export PATH=$PATH:chaosblade-0.9.0/ ## 測(cè)試 blade -h2. ChaosBlade 使用
ChaosBlade 安裝完成后,僅需要使用 blade 可執(zhí)行文件即可創(chuàng)建目前所支持的所有場(chǎng)景的混沌實(shí)驗(yàn)。首先使用 blade -h 查看如何使用,選擇子命令之后只需要逐層向下使用 -h 即可看到完整的使用案例以及各參數(shù)的詳細(xì)解析,下面我們來演示一下:
1)blade 如何使用
執(zhí)行 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)創(chuàng)建實(shí)驗(yàn)場(chǎng)景
比如創(chuàng)建 CPU 滿載場(chǎng)景,執(zhí)行 blade create cpu fullload -h 就可以查看具體的場(chǎng)景參數(shù),選擇相應(yīng)參數(shù)執(zhí)行即可:
Create chaos engineering experiments with CPU loadUsage:blade create cpu fullloadAliases:fullload, fl, loadExamples:# 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)恢復(fù)實(shí)驗(yàn)
ChaosBlade 支持三種方式恢復(fù)實(shí)驗(yàn):
- ChaosBlade 創(chuàng)建實(shí)驗(yàn)成功后會(huì)返回一個(gè)UID,執(zhí)行 blade destroy uid 即可。
- 如果找不到對(duì)應(yīng)的UID時(shí),執(zhí)行 blade destroy target action 即可,例如 blade destroy cpu fullload。
- 在創(chuàng)建實(shí)驗(yàn)時(shí)帶上 --timeout 10 參數(shù),在實(shí)驗(yàn)場(chǎng)景執(zhí)行十秒后會(huì)自動(dòng)恢復(fù),同時(shí)支持表達(dá)式,例如三分鐘 --timeout 30m。
3. SkyWalking 安裝&使用
SkyWalking 安裝和使用文檔詳見:https://github.com/apache/skywalking/tree/v8.1.0/docs
工具部署好之后,下面我們將結(jié)合案例,主動(dòng)出擊,通過故障注入,觀察系統(tǒng)行為,定位問題并發(fā)現(xiàn)系統(tǒng)缺陷,以便構(gòu)建高可用的微服務(wù)系統(tǒng)。
應(yīng)用容錯(cuò)案例
我們?cè)谌粘-h(huán)境部署一個(gè)微服務(wù)應(yīng)用 來進(jìn)行實(shí)驗(yàn),使用 ab 測(cè)試模擬系統(tǒng)請(qǐng)求。微服務(wù)應(yīng)用服務(wù)包含前端、購物車、推薦服務(wù)、商品、訂單等,使用組建包含 Springboot、Nacos、Mysql、Redis、Lettuce、Dubbo 等。ChaosBlade 支持該應(yīng)用的大部分組件,我們通過 ChaosBlade 來注入混沌實(shí)驗(yàn),驗(yàn)證應(yīng)用容錯(cuò)能力并且使用 SkyWalking 進(jìn)行應(yīng)用監(jiān)控和問題定位。
1. 案例環(huán)境
- Linux-AMD64,發(fā)行版本 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. 應(yīng)用拓?fù)浣Y(jié)構(gòu)
應(yīng)用的整體架構(gòu)如下,前端(frontend)對(duì)購物車(car)、產(chǎn)品(product)等都是通過 Dubbo 強(qiáng)依賴調(diào)用。
3. 混沌實(shí)驗(yàn)步驟
- 制定混沌實(shí)驗(yàn)計(jì)劃
- 定義系統(tǒng)穩(wěn)態(tài)指標(biāo)
- 作出系統(tǒng)容錯(cuò)行為假設(shè)
- 執(zhí)行混沌實(shí)驗(yàn)
- 檢查穩(wěn)態(tài)指標(biāo)
- 記錄和恢復(fù)混沌實(shí)驗(yàn)
- 修復(fù)發(fā)現(xiàn)的問題
- 自動(dòng)化持續(xù)進(jìn)行驗(yàn)證
下面我們將根據(jù)混沌實(shí)驗(yàn)步驟使用 ChaosBlade 實(shí)際進(jìn)行混沌實(shí)驗(yàn)。
4. 案例一
1)場(chǎng)景
制定混沌實(shí)驗(yàn)計(jì)劃,調(diào)用下游服務(wù)頻繁延遲,使用 ab 測(cè)試,模擬常態(tài)訪問購物車接口,開啟 2 個(gè)線程,進(jìn)行 10000 次接口訪問。
ab -n 10000 -c 2 http://127.0.0.1:8083/cart2)監(jiān)控指標(biāo)
定義系統(tǒng)穩(wěn)態(tài)指標(biāo),在 SkyWalking 控制臺(tái)選擇 /cart 端點(diǎn),穩(wěn)態(tài)指標(biāo)如下:
- 平均響應(yīng)時(shí)間(RT)在 15ms 左右。
- P99 指標(biāo)在 20ms 以內(nèi)。
3)期望假設(shè)
- 配置調(diào)用超時(shí)時(shí)間,不會(huì)長(zhǎng)時(shí)間阻塞客戶端請(qǐng)求。
- 配置服務(wù)熔斷策略/服務(wù)降級(jí)。
4)混沌實(shí)驗(yàn)
在上節(jié)我們已經(jīng)介紹過 ChaosBlade 的安裝和簡(jiǎn)單實(shí)用,本次案例我們使用 ChaosBlade 對(duì)下游 Dubbo 購物車服務(wù)注入延遲故障(延遲時(shí)間 30 秒),執(zhí)行 blade create dubbo delay -h 命令查看 dubbo 調(diào)用延遲的命令用法:
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 experiment blade 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參考案例和參數(shù)解釋,需要上游服務(wù)客戶端注入延遲故障(延遲時(shí)間 30 秒),借助 SkyWalking 可以很方便找到鏈路上 Dubbo 服務(wù)相關(guān)信息,首先查詢端點(diǎn)為 /cart 的鏈路,在鏈路上找到 Dubbo 服務(wù),如下圖:
- 查找鏈路
- 獲取協(xié)議詳細(xì)信息
點(diǎn)進(jìn)來可以查看 Dubbo 服務(wù)詳細(xì)跨度信息,獲取 Dubbo 服務(wù)的 URL 后,就可以拿到使用 ChaosBlade 來注入上游服務(wù)延時(shí)所需要的參數(shù),因此我們的最終參數(shù)結(jié)構(gòu)為:
- --time 30000 延遲30s
- --service com.alibabacloud.hipstershop.cartserviceapi.service.CartService 服務(wù)
- --methodname viewCart 服務(wù)方法
- --process frontend Java 進(jìn)程
- --consumer 當(dāng)前是 Dubbo 服務(wù)客戶端
下發(fā)命令注入故障:
blade create dubbo delay --time 30000 --service com.alibabacloud.hipstershop.cartserviceapi.service.CartService --methodname viewCart --process frontend --consumer5)監(jiān)控指標(biāo)
注入故障后檢查系統(tǒng)指標(biāo),查看 SkyWalking 上的指標(biāo):
- 平均響應(yīng)時(shí)間(RT)在 2000ms 左右,P99 指標(biāo)在 2000ms 左右
- /cart 接口調(diào)用報(bào)錯(cuò),com.alibabacloud.hipstershop.cartserviceapi.service.CartService 服務(wù)出現(xiàn)異常。
- 出現(xiàn) timeout 異常,超時(shí)時(shí)間為 2000ms
結(jié)論說明上游服務(wù)配置了調(diào)用超時(shí)時(shí)間,但沒有配置服務(wù)熔斷策略,實(shí)際是不符合預(yù)期的。
6)修復(fù)問題
配置服務(wù)熔斷策略/服務(wù)降級(jí)。
5. 案例二
1)場(chǎng)景
運(yùn)行中 Dubbo 服務(wù)提供方訪問注冊(cè)中心失敗,在注冊(cè)中心機(jī)器注入故障網(wǎng)絡(luò)丟包 100%。
2)監(jiān)控指標(biāo)
定義系統(tǒng)穩(wěn)態(tài)指標(biāo),在 SkyWalking 控制臺(tái)選擇服務(wù)端點(diǎn),穩(wěn)態(tài)指標(biāo)如下:
- com.alibabacloud.hipstershop.cartserviceapi.service.CartService.viewCart 服務(wù)正常
3)期望假設(shè)
上游服務(wù)業(yè)務(wù)不受影響,下游服務(wù)不受影響。
4)混沌實(shí)驗(yàn)
對(duì)注冊(cè)中心端口注入丟包故障(100%),我們是使用的 nacos 作為 Dubbo 的注冊(cè)中心,默認(rèn)端口 8848,網(wǎng)卡是 eth0,命令參數(shù)如下:
- --interface eth0 網(wǎng)卡
- --percent 100 丟包率100%
- --local-port 本地端口 8848
下發(fā)命令注入故障:
blade create network loss --interface eth0 --percent 100 --local-port 88485)監(jiān)控指標(biāo)
在注入故障后,在 SkyWalking 控制臺(tái)選擇服務(wù)端點(diǎn),穩(wěn)態(tài)指標(biāo)如下:
- com.alibabacloud.hipstershop.cartserviceapi.service.CartService.viewCart 服務(wù)正常
結(jié)論:服務(wù)對(duì)注冊(cè)中心是弱依賴且服務(wù)本身具有本地緩存,符合期望假設(shè)。
假設(shè)應(yīng)用現(xiàn)在部署 Kubernetes 集群中,可以增加驗(yàn)證注冊(cè)中心水平擴(kuò)容能力,ChaosBlade 同時(shí)也支持 Kubernetes 集群場(chǎng)景。
6. 牛刀小試
在上訴案例中,我們驗(yàn)證了服務(wù)是否配置了超時(shí)和熔斷策略,驗(yàn)證了 Dubbo 是否對(duì)注冊(cè)中心是弱依賴且服務(wù)本身具有本地緩存。你是否也躍躍欲動(dòng),想要在自己系統(tǒng)中體驗(yàn)一把?ChaosBlade 為大家準(zhǔn)備了豐富的實(shí)驗(yàn)場(chǎng)景,不僅支持基礎(chǔ)資源、應(yīng)用維度,還是云原生平臺(tái)的一把利器。 ChaosBlade 易于使用,也提供了詳細(xì)的參數(shù)來控制故障最小爆炸半徑,相信 ChaosBlade 會(huì)讓大家非常容易上手。
紙上得來終覺淺,這里我們提供一個(gè)額外的小案例,供大家實(shí)踐。我們?cè)趹?yīng)用開發(fā)中經(jīng)常會(huì)與關(guān)系數(shù)據(jù)庫打交通,而當(dāng)應(yīng)用流量快速增長(zhǎng)時(shí),瓶頸往往會(huì)在數(shù)據(jù)庫端發(fā)生,出現(xiàn)很多慢 SQL。當(dāng)沒有慢 SQL 預(yù)警時(shí),我們很難找到原始 SQL 并對(duì)它進(jìn)行優(yōu)化,所以慢 SQL 預(yù)警十分重要。如何驗(yàn)證應(yīng)用具備這個(gè)能力,ChaosBlade 就可以支持注入 MySQL 慢 SQL 故障,執(zhí)行 blade create mysql delay -h 查看 MySQL 調(diào)用延遲的命令用法:
Mysql delay experimentUsage:blade create mysql delayExamples: # Do a delay 2s experiment for mysql client connection port=3306 INSERT statement blade 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可以看到 ChaosBlade 提供了完整的案例,支持更細(xì)粒度的 SQL 類型,表名等參數(shù)。對(duì)連接端口時(shí) 3306 的 select 操作延時(shí) 10s 看看,當(dāng)流量命中時(shí),是否在你的應(yīng)用中產(chǎn)生了預(yù)警呢?
blade create mysql delay --time 10000 --sqltype select --port 3306命令參數(shù)解釋:
- --time 10000 延時(shí) 10s
- --sqltype select 僅支持 select 類型的 SQL 語句
- --port 3306 僅支持端口是 3306 的連接
總結(jié)
在本篇文章中,我們介紹了混沌工程在實(shí)際復(fù)雜分布式架構(gòu)中的應(yīng)用,并且結(jié)合 ChaosBlade 和 SkyWalking 在實(shí)際應(yīng)用中進(jìn)行混沌實(shí)驗(yàn),從而可以根據(jù)故障的情況來對(duì)系統(tǒng)分析優(yōu)化,持續(xù)提升系統(tǒng)的穩(wěn)定性和高可用能力。ChaosBlade 不僅支持基礎(chǔ)資源、應(yīng)用維度,還是云原生平臺(tái)的一把利器,歡迎大家嘗試使用。
ChaosBlade 項(xiàng)目地址:https://github.com/chaosblade-io/chaosblade , 歡迎大家加入,一起共建!點(diǎn)擊查看貢獻(xiàn)指南。
作者信息
葉飛:Github @tiny-x,開源社區(qū)愛好者,ChaosBlade Committer,參與推動(dòng) ChaosBlade 混沌工程生態(tài)建設(shè)。
總結(jié)
以上是生活随笔為你收集整理的ChaosBlade x SkyWalking 微服务高可用实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020 阿里云原生实战峰会即将开幕 云
- 下一篇: Github 2020 年度报告:你以为