一線實踐 | 藉助混沌工程工具 ChaosBlade 構建高可用的分佈式系統

在分佈式架構環境下,服務間的依賴日益複雜,可能沒有人能說清單個故障對整個系統的影響,構建一個高可用的分佈式系統面臨着很大挑戰。在可控範圍或環境下,使用 ChaosBlade 工具,對系統注入各類故障,持續提高分佈式系統的容錯和彈性能力,以構建高可用的分佈式系統。git

ChaosBlade 是什麼?

ChaosBlade 是一款遵循混沌工程實驗原理,創建在阿里巴巴近十年故障測試和演練實踐基礎上,並結合了集團各業務的最佳創意和實踐,提供豐富故障場景實現,幫助分佈式系統提高容錯性和可恢復性的混沌工程工具。點擊這裏,瞭解詳情。github

ChaosBlade 無需編譯,下載解壓便可使用,支持基礎資源、Java 應用、容器服務類的混沌實驗,特色是操做簡潔、無侵入、擴展性強。架構

ChaosBlade @GitHub點擊進入併發

下面咱們以微服務分佈式系統舉例,一步一步構建高可用的分佈式系統。jvm

構建高可用的分佈式系統

ChaosBlade 的使用方式

ChaoBlade 經過 CLI 方式調用,好比咱們模擬 A 服務調用 B 提供的 com.alibaba.demo.HelloService 服務下的 hello 服務延遲 3 秒,咱們能夠在 B 應用上注入延遲故障,僅需兩步操做:
第一步:準備階段。因爲 Java 應用的故障注入是經過 Java Agent 機制實現,因此首先要先掛載 agent,執行的命令是 blade prepare jvm --process <PROCESS NAME OF B APPLICATION>
第二步:執行階段,注入故障。執行命令是 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 操做,可詳見新手指南ide

分佈式系統高可用原則

高可用的分佈式系統通常須要知足如下原則:微服務

  • 失敗重試
  • 實例隔離
  • 請求限流
  • 服務降級
  • 服務熔斷
  • 流量調度
  • 開關&預案
  • 監控告警
  • 日誌跟蹤

混沌實驗場景實踐

咱們以 A 調用 B,B 調用 C,A 同時也調用 D 舉例,A一、A2 是 A 服務的多個實例,依次類推。高併發

失敗重試

實驗場景:調用下游服務實例異常。
容錯方案:會再次請求另一個服務實例進行重試。
場景模擬:對 B1 注入異常故障,A 服務調用到 B1 時會出現調用失敗。
預期方案:系統會將 A 服務的請求路由到 B2 進行重試。
blade 命令:blade c dubbo throwCustomException --exception <EXCEPTION CLASS> --service <SERVICE NAME> --provider
修復方案:添加失敗檢測和請求重試能力。工具

實例隔離

演練場景:屢次調用下游一個服務實例超時。
容錯方案:會隔離或者下線此服務實例,防止請求路由到此服務實例。
場景模擬:對 B1 注入延遲故障,A 服務調用到 B1 時,出現調用超時。
預期方案:系統會自動隔離或下線 B1 實例。
blade 命令:blade c dubbo delay --time <DELAY TIME> --service <SERVICE NAME> --provider
修復方案:添加服務質量檢查,下線不可用的服務實例。

請求限流

演練場景:服務線程池滿。
容錯方案:會對入口流量進行限流,防止請求堆積,資源耗盡致使服務不可用。
場景模擬:對 A 注入線程池滿故障。
預期方案:線程池滿時,觸發限流,新請求快速失敗。
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
修復方案:梳理服務依賴,添加服務降級能力。

調用熔斷

演練場景:下游服務不可用
容錯方案:觸發熔斷,快速失敗返回
場景模擬:對 B 服務全部的實例注入延遲超時故障。
blade 命令:blade c dubbo delay --time <DELAY TIME> --service <SERVICE NAME> --provider
修復方案:當下遊服務不可用時,能當即熔斷,快速失敗。

流量調度

演練場景:上游高併發下,擴容下游服務,在服務實例初始化時,CPU 負載高,致使上游服務受影響
容錯方案:當服務實例機器負載高時,自動切流到正常機器
場景模擬:對 B1 作 CPU 滿載操做。
blade 命令:blade c cpu fullload
修復方案:添加系統、應用資源監控和流量調度能力。

系統預案

演練場景:殺掉服務實例。
容錯方案:快速拉起或擴容
場景模擬:殺掉 B 大部分實例。
blade 命令: blade create process kill --process <PROCESS NAME>
修復方案:添加相關係統預案。

監控告警

注入任意故障,驗證監控告警的有效性

日誌跟蹤

演練場景:修改應用中具體方法返回值。
容錯方案:全鏈路調用日誌記錄。
場景模擬:修改 B 服務的一個業務方法的返回值。
blade 命令:blade c jvm return --classname <CLASS NAME> --methodname <METHOD NAME> --value <RETURN VALUE>
修復方案:添加全鏈路日誌記錄,便於排查和追溯問題。

總結

經過 ChaosBlade 工具能簡潔有效的執行混沌實驗,上文提到的請求限流、降級熔斷功能能夠使用 Sentinel 來解決。阿里雲 AHAS 產品已經集成混沌工程平臺 和 Sentinel 功能。ChaosBlade 除了上述實驗場景,還有更多的場景期待你來挖掘。

後續規劃

ChaosBlade 後續會繼續加強對 Java 生態的混沌實驗,好比對 Redis、GRPC、RabbitMQ 等主流組件的支持。也會增長雲原生設施的混沌實驗,好比 Kubernetes、Service Mesh 等。


原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索