天天看點

分布式系統之容錯設計-故障隔離

容錯設計又叫彈力設計,其中着眼于分布式系統的各種“容忍”能力,包括容錯能力(服務隔離、異步調用、請求幂等性)、可伸縮性(有 / 無狀态的服務)、一緻性(補償事務、重試)、應對大流量的能力(熔斷、降級)。可以看到,在確定系統正确性的前提下,系統的可用性是彈力設計保障的重點。

故障隔離

隔離設計對應的單詞是 Bulkheads,中文翻譯為隔闆。但其實,這個術語是用在造船上的,也就是船艙裡防漏水的隔闆。一般的船無論大小都會有這個東西,大一點的船都會把船艙隔成若幹個空間。這樣,如果船艙漏水,隻會進到一個小空間裡,不會讓整個船艙都進水而導緻整艘船都沉了,

在分布式軟體架構中,我們同樣需要使用類似這樣的技術來讓我們的故障得到隔離。這就需要我們對系統進行分離。一般來說,對于系統的分離有兩種方式,一種是以服務的種類來做分離,一種是以使用者來做分離。下面具體說明一下這兩種方式。

按服務的種類來做分離

下面這個圖中,說明了按服務種類來做分離的情況。

分布式系統之容錯設計-故障隔離

上圖中,我們将系統分成了使用者、商品、社群三個版塊。三個闆塊分别使用不同的域名、伺服器和資料庫,做到從接入層到應用層再到資料層三層完全隔離。這樣一來,在實體上來說,一個版塊的故障就不會影響到另一版塊。

按使用者的請求來做分離

下圖是一個按使用者請求來做分離的圖示。

分布式系統之容錯設計-故障隔離

在這個圖中,可以看到,我們将使用者分成不同的組,并把後端的同一個服務根據這些不同的組分成不同的執行個體。讓同一個服務對于不同的使用者進行備援和隔離,這樣一來,當服務執行個體挂掉時,隻會影響其中一部分使用者,而不會導緻所有的使用者無法通路。

這種分離和上面按功能的分離可以融合。說白了,這就是所謂的“多租戶”模式。對于一些比較大的客戶,我們可以為他們設定專門獨立的服務執行個體,或是服務叢集與其他客戶隔離開來,對于一些比較小的使用者來說,可以讓他們共享一個服務執行個體,這樣可以節省相關的資源。

對于“多租戶”的架構來說,會引入一些系統設計的複雜度。一方面,如果完全隔離,資源使用上會比較浪費,如果共享,又會導緻程式設計的一些複雜度。

通常來說多租戶的做法有三種。

  1. 完全獨立的設計。每個租戶有自己完全獨立的服務和資料。
  2. 獨立的資料分區,共享的服務。多租戶的服務是共享的,但資料是分開隔離的。
  3. 共享的服務,共享的資料分區。每個租戶的資料和服務都是共享的。

一般來說,技術方案會使用折衷方案,也就是中間方案,服務是共享的,資料通過分區來隔離,而對于一些比較重要的租戶(需要好的隔離性),則使用完全獨立的方式。

隔離設計的重點

要能做好隔離設計,我們需要有如下的一些設計考量。

  1. 我們需要定義好隔離業務的大小和粒度,過大和過小都不好。這需要認真地做業務上的需求和系統分析。
  2. 無論是做系統版塊還是多租戶的隔離,你都需要考慮系統的複雜度、成本、性能、資源使用的問題,找到一個合适的均衡方案,或是分布實施的方案尤其重要,這其中需要你定義好要什麼和不要什麼。因為,我們不可能做出一個什麼都能滿足的系統。
  3. 隔離模式需要配置一些高可用、重試、異步、消息中間件,流控、熔斷等設計模式的方式配套使用。
  4. 不要忘記了分布式系統中的運維的複雜度的提升,要能駕馭得好的話,還需要很多自動化運維的工具,尤其是使用像容器或是虛拟機這樣的虛拟化技術可以幫助我們更友善地管理,和對比資源更好地利用。否則做出來了也管理不好。
  5. 最後,你需要一個非常完整的能夠看得到所有服務的監控系統,這點非常重要。

個人思考:故障隔離其實就是要保證在發生故障的時候,要做到影響最小。第一種按照服務隔離,目前大部分公司都是采用微服務架構,也就天然滿足了按照服務隔離。至于按照使用者隔離。我了解在資料量不大的時候,不用采用這種,畢竟開發成本比較大。而一旦資料量很大的時候,我們可以采用共享服務,然後資料獨立分區這種,做資料分片,減輕DB壓力。

繼續閱讀