借助混沌工程工具 ChaosBlade 构建高可用的分布式系统
為什么80%的碼農都做不了架構師?>>> ??
在分布式架構環(huán)境下,服務間的依賴日益復雜,可能沒有人能說清單個故障對整個系統(tǒng)的影響,構建一個高可用的分布式系統(tǒng)面臨著很大挑戰(zhàn)。在可控范圍或環(huán)境下,使用 ChaosBlade 工具,對系統(tǒng)注入各種故障,持續(xù)提升分布式系統(tǒng)的容錯和彈性能力,以構建高可用的分布式系統(tǒng)。
ChaosBlade 是什么?
ChaosBlade?是一款遵循混沌工程實驗原理,建立在阿里巴巴近十年故障測試和演練實踐基礎上,并結合了集團各業(yè)務的最佳創(chuàng)意和實踐,提供豐富故障場景實現(xiàn),幫助分布式系統(tǒng)提升容錯性和可恢復性的混沌工程工具。點擊這里,了解詳情。
ChaosBlade 無需編譯,下載解壓即可使用,支持基礎資源、Java 應用、容器服務類的混沌實驗,特點是操作簡潔、無侵入、擴展性強。
ChaosBlade @GitHub,點擊進入
下面我們以微服務分布式系統(tǒng)舉例,一步一步構建高可用的分布式系統(tǒng)。
構建高可用的分布式系統(tǒng)
ChaosBlade 的使用方式
ChaoBlade 通過 CLI 方式調用,比如我們模擬 A 服務調用 B 提供的 com.alibaba.demo.HelloService 服務下的 hello 服務延遲 3 秒,我們可以在 B 應用上注入延遲故障,僅需兩步操作:
第一步:準備階段。由于 Java 應用的故障注入是通過 Java Agent 機制實現(xiàn),所以首先要先掛載 agent,執(zhí)行的命令是?blade prepare jvm --process <PROCESS NAME OF B APPLICATION>
第二步:執(zhí)行階段,注入故障。執(zhí)行命令是?blade create dubbo delay --time 3000 --service com.alibaba.demo.HelloService --methodname hello --provider,即對 B 服務提供方提供的 com.alibaba.demo.HelloService#hello 服務注入 3 秒延遲。
ChaosBlade 使用簡潔,如果想了解命令的如何使用,可在命令后面添加?-h?參數,比如?blade create dubbo delay -h。更詳細的 chaosblade 操作,可詳見新手指南
分布式系統(tǒng)高可用原則
高可用的分布式系統(tǒng)一般需要滿足以下原則:
- 失敗重試
- 實例隔離
- 請求限流
- 服務降級
- 服務熔斷
- 流量調度
- 開關&預案
- 監(jiān)控告警
- 日志跟蹤
混沌實驗場景實踐
我們以 A 調用 B,B 調用 C,A 同時也調用 D 舉例,A1、A2 是 A 服務的多個實例,依次類推。
失敗重試
實驗場景:調用下游服務實例異常。
容錯方案:會再次請求另外一個服務實例進行重試。
場景模擬:對 B1 注入異常故障,A 服務調用到 B1 時會出現(xiàn)調用失敗。
預期方案:系統(tǒng)會將 A 服務的請求路由到 B2 進行重試。
blade 命令:blade c dubbo throwCustomException --exception <EXCEPTION CLASS> --service <SERVICE NAME> --provider
修復方案:添加失敗檢測和請求重試能力。
實例隔離
演練場景:多次調用下游一個服務實例超時。
容錯方案:會隔離或者下線此服務實例,防止請求路由到此服務實例。
場景模擬:對 B1 注入延遲故障,A 服務調用到 B1 時,出現(xiàn)調用超時。
預期方案:系統(tǒng)會自動隔離或下線 B1 實例。
blade 命令:blade c dubbo delay --time <DELAY TIME> --service <SERVICE NAME> --provider
修復方案:添加服務質量檢查,下線不可用的服務實例。
請求限流
演練場景:服務線程池滿。
容錯方案:會對入口流量進行限流,防止請求堆積,資源耗盡導致服務不可用。
場景模擬:對 A 注入線程池滿故障。
預期方案:線程池滿時,觸發(fā)限流,新請求快速失敗。
blade 命令:blade c dubbo threadpoolfull --consumer
修復方案:添加限流能力。
服務降級
演練場景:A 對 B 是強依賴,對 D 是弱依賴,A 調用 D 線程數多,爭搶調用 B 服務的資源。
容錯方案:對弱依賴 B 進行降級,減少資源分配。
場景模擬:對 A 注入調用 D 線程數滿故障。
blade 命令:blade c dubbo threadpoolfull --service <D SERVICE NAME> --consumer
修復方案:梳理服務依賴,添加服務降級能力。
調用熔斷
演練場景:下游服務不可用
容錯方案:觸發(fā)熔斷,快速失敗返回
場景模擬:對 B 服務所有的實例注入延遲超時故障。
blade 命令:blade c dubbo delay --time <DELAY TIME> --service <SERVICE NAME> --provider
修復方案:當下游服務不可用時,能立即熔斷,快速失敗。
流量調度
演練場景:上游高并發(fā)下,擴容下游服務,在服務實例初始化時,CPU 負載高,導致上游服務受影響
容錯方案:當服務實例機器負載高時,自動切流到正常機器
場景模擬:對 B1 做 CPU 滿載操作。
blade 命令:blade c cpu fullload
修復方案:添加系統(tǒng)、應用資源監(jiān)控和流量調度能力。
系統(tǒng)預案
演練場景:殺掉服務實例。
容錯方案:快速拉起或擴容
場景模擬:殺掉 B 大部分實例。
blade 命令:?blade create process kill --process <PROCESS NAME>
修復方案:添加相關系統(tǒng)預案。
監(jiān)控告警
注入任意故障,驗證監(jiān)控告警的有效性
日志跟蹤
演練場景:修改應用中具體方法返回值。
容錯方案:全鏈路調用日志記錄。
場景模擬:修改 B 服務的一個業(yè)務方法的返回值。
blade 命令:blade c jvm return --classname <CLASS NAME> --methodname <METHOD NAME> --value <RETURN VALUE>
修復方案:添加全鏈路日志記錄,便于排查和追溯問題。
總結
通過 ChaosBlade 工具能簡潔有效的執(zhí)行混沌實驗,上文提到的請求限流、降級熔斷功能可以使用?Sentinel?來解決。阿里云?AHAS?產品已經集成混沌工程平臺 和 Sentinel 功能。ChaosBlade 除了上述實驗場景,還有更多的場景期待你來挖掘。
后續(xù)規(guī)劃
ChaosBlade 后續(xù)會繼續(xù)增強對 Java 生態(tài)的混沌實驗,比如對 Redis、GRPC、RabbitMQ 等主流組件的支持。也會增加云原生設施的混沌實驗,比如 Kubernetes、Service Mesh 等。
參與貢獻
歡迎加入 ChaosBlade 社區(qū),參與混沌工程生態(tài)建設,貢獻不局限于代碼,也可以是想法、文檔、和社區(qū)答疑、討論。
作者:中間件小哥
原文鏈接
本文為云棲社區(qū)原創(chuàng)內容,未經允許不得轉載。
轉載于:https://my.oschina.net/yunqi/blog/3049315
總結
以上是生活随笔為你收集整理的借助混沌工程工具 ChaosBlade 构建高可用的分布式系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android开发中遇到的问题(二)——
- 下一篇: LeetCode--055--跳跃游戏(