來源|阿里巴巴雲原生公衆號前端
前言
在分佈式系統架構下,服務組件繁多且服務間的依賴錯綜複雜,很難評估單個故障對整個系統的影響,並且請求鏈路長,若是監控告警、日誌記錄等基礎服務不完善會形成故障響應、故障定位問題難,因此如何構建一個高可用的分佈式系統面臨着很大挑戰。混沌工程就此產生,在可控範圍或環境下經過對系統注入故障,觀察系統行爲並發現系統缺陷,以創建對分佈式系統因意外條件引起混亂的能力和信心,持續提高系統的穩定性和高可用能力。java
混沌工程的實施流程是制訂混沌實驗計劃、定義穩態指標,作出系統容錯行爲假設,而後執行混沌實驗,檢查系統穩態指標等。也所以混沌實驗整個過程須要可靠的、易於使用且場景豐富的混沌實驗工具注入故障以及完整的分佈式鏈路追蹤和系統監控工具,以便觸發應急響應預警方案與快速地進行故障定位,並觀察整個過程系統的各項數據指標等。本篇文章咱們介紹混沌實驗工具(ChaosBlade)和 分佈式系統監控工具(SkyWalking),而且結合一個的微服務案例分享一下 ChaosBlade 和 SkyWalking 微服務高可用實踐。mysql
工具介紹
1. ChaosBlade
ChaosBlade 是一款遵循混沌工程實驗原理,提供豐富故障場景實現,幫助分佈式系統提高容錯性和可恢復性的混沌工程工具,可實現底層故障的注入,而且在企業上雲或往雲原生系統遷移過程當中業務連續性保障,特色是操做簡潔、無侵入、擴展性強。ChaosBlade 能夠在可控範圍或環境下,經過故障注入,來持續提高系統的穩定性和高可用能力。linux
ChaosBlade 不只使用簡單,並且支持豐富的實驗場景,場景包括:git
- 基礎資源:好比 CPU、內存、網絡、磁盤、進程等實驗場景;
- Java 應用:好比數據庫、緩存、消息、JVM 自己、微服務等,還能夠指定任意類方法注入各類複雜的實驗場景;
- C++ 應用:好比指定任意方法或某行代碼注入延遲、變量和返回值篡改等實驗場景;
- Docker 容器:好比殺容器、容器內 CPU、內存、網絡、磁盤、進程等實驗場景;
- 雲原平生臺:好比 Kubernetes 平臺節點上 CPU、內存、網絡、磁盤、進程實驗場景,Pod 網絡和 Pod 自己實驗場景如殺 Pod,容器的實驗場景如上述的 Docker 容器實驗場景;
ChaosBlade 將場景按領域實現封裝成一個個單獨的項目,不只可使領域內場景標準化實現,並且很是方便場景水平和垂直擴展,經過遵循混沌實驗模型,實現 chaosblade cli 統一調用 。github
2. SkyWalking
SkyWalking 是一個開源的 APM 系統,包括對雲本地架構中的分佈式系統的監視、跟蹤和診斷功能。核心特性以下:sql
- 服務、服務實例、端點指標分析
- 根本緣由分析
- 服務拓撲圖分析
- 服務、服務實例和端點依賴性分析
- 檢測到慢速服務和終結點
- 性能優化
- 分佈式跟蹤和上下文傳播
- 數據庫訪問指標。檢測慢速數據庫訪問語句(包括SQL語句)。
- 報警
工具安裝及使用
ChaosBlade 的安裝和使用都很簡便,ChaosBlade 各場景經過 chaosblade cli 統一調用,僅須要下載對應的 tar 包,解壓後使用 blade
可執行文件來進行混沌實驗,下載地址詳見:https://github.com/chaosblade-io/chaosblade/releases 。docker
1. ChaosBlade 安裝
本次咱們的實際環境是 linux-amd64,下載最新版本 chaosblade-linux-amd64.tar.gz 包,安裝步驟以下:shell
## 下載 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 混沌工程生態建設。