天天看點

建構高可用可伸縮系統設計的一些方法論 二、服務高可用設計

本文提供一些方法論,希望這些方法論能夠指導設計一個高可用的系統架構。後面有新的思考會持續更新

一、服務高并發設計

我們通常說的高并發是通過一定的設計提高系統可以并行處理很多很多請求。

常用用來衡量的名額包括幾類:

  1. 響應時間
  2. 吞吐量(QPS)
  3. 并發使用者數

高并發系統設計的方法論上可以從兩個方面入手:垂直擴充(Scale Up)和水準擴充(Scale Out)。垂直是提升單機的處理能力,水準擴充可以線性提升系統性能

1、應用層原則

1、無狀态

應用設計應該是無狀态,那麼應用的擴容就比較容易,應用就可以無限擴容。

2、拆分

系統設計根據業務不同的次元對系統進行拆分。一般可以按照下面幾個次元拆分

業務次元:以一個完整的業務系統作為拆分次元。比如收銀系統、訂單系統、賬号系統、優惠券系統

功能次元:一個完整的業務系統作為基礎,對業務系統進行功能次元的拆分。比如優惠券系統,有發券服務、券認領服務、券核銷服務等

讀寫次元:按資料的讀寫次元對系統進行拆分,可以以業務次元的讀寫,也可以以功能次元的讀寫。比如按照訂單系統,對訂單系統進行訂單讀系統、訂單寫系統;優惠券的券認領服務,可以拆分為券認領寫服務、券認領讀服務

切面次元:與業務功能不耦合的系統可以獨立出來,形成一個切面。例如權限系統

3、服務化

不用業務體量,發展到一定程度後可以選擇不同的服務部署方案。

服務化程度:程序内部服務、單機遠端服務、叢集遠端服務。服務程度程度不同,複雜程度不同,需要不同程度的服務治理。如重試、路由、限流、隔離、熔斷、降級、故障轉移、復原等。

4、并行化

系統初始階段,為快速完成功能疊代。一般會将系統按流程一步一步串行執行。當業務發展到一定程度後,可以将一些任務從串行化轉向并行執行。

2、資料層原則

1、資料異構

這裡的資料異構指的是不同次元的資料查詢請求,需要聚合多個表,可提前生成。對于異構資料的采集可以采用監聽MQ或者監聽Mysql等方式要擷取。

在設計資料庫表時,盡量單表查詢,可以在服務層做依賴。

資料一緻性設計為強一緻性還是弱一緻性

2、緩存

緩存可以說是解決讀服務的萬能鑰匙。從用戶端緩存、CDN緩存、接入層緩存(如Nginx proxy_cache等)、應用緩存(如Tomcat内的程序緩存等)、資料層緩存(如Redis之類)

3、MQ

解耦應用。複雜的業務流程一定會出問題,可以利用MQ将部分複雜的流程異步化,簡化同步的流程。消息隊列還可以當做流量緩存,做流量削峰。

二、服務高可用設計

高可用服務設計是服務可以7*24h不間斷的提供服務。比如我們常說的服務可以用性99.99%。

例如系統每運作100個時間機關,會有1個時間機關無法提供服務,我們說系統的可用性是99%。再如一些服務高可用目标是4個9,也就是99.99%,這就意味着,系統的年停機時間為8.76個小時。

高可用設計方法論上可以從兩個方面入手:一是避免單點;二是故障恢複

1、降級

降級的最大原則是保證核心服務可以用,即使服務處于亞健康的狀态、服務有損,核心服務也能正常運作。

  1. 開關降級:一是自動開關,這種降級方式要設立好降級預案,采集各類降級名額,包括業務名額和系統運作環境名額(例如:CPU、記憶體、某個支付通道的成功率等);二是手工開關,這類降級要做的是設立好精準的告警。
  2. 讀服務降級:出問題後一個接口從資料庫讀改成讀緩存,或者讀一些靜态資料,前提是業務上可以容忍這類降級。
  3. 寫服務降級:寫服務大多數場景比較難做降級。可以控制寫流量、寫資料庫改寫成MQ或者緩存之類。
  4. 系統降級:業務中非核心的系統,流量大後可以關掉此類系統,将最好的資源留給最核心的服務。

2、熔斷

熔斷本質上也是一種降級,當某個服務不可用時,切斷與其連接配接的鍊路,保證核心流程正常服務。

3、隔離

隔離主要通過将資源隔離開,其目的是某個系統發生問題後,避免事故傳播擴散,以大小。

上述說的資源泛指以下幾類:

  1. 線程
  2. 程序
  3. 叢集
  4. 機房
  5. 業務
  6. ......

在高并發設計中也談到了服務拆分,其實也是服務隔離的一類。是以通過線程隔離、程序隔離、叢集隔離、機房隔離、業務系統(讀寫服務、按功能拆分)等進行隔離,防止某個服務擴散故障。

4、限流

限流通過對請求通路限速,在一定的時間窗内限定通過的請求來保護系統。

限流的算法有令牌桶算法和漏桶算法。計數器也可以

跟緩存一樣,可以從用戶端、CND、接入層、應用層、業務接口級别限流、資料層進行限流等。

5、容災

容災與隔離的方法有點類似,但兩者的目的不同。容災目的是當多個系統或者機房down集後,仍然保證系統還是可用。

接入層、應用層、資料層各個服務進行處理,異地多活,同城雙機房或多機房,等

6、快速復原

在解決系統故障層面,最快速最有利的解決辦法是将程式運作復原動上一個穩定的版本。

參考資料:

  1. http://www.csdn.net/article/2015-10-27/2826042========================================================
  2. 張開濤《億級流量網站架構核心技術》
  3. https://blog.coding.net/blog/architecture-concept-and-practice-from-Google
  4. http://ifeve.com/%E5%A6%82%E4%BD%95%E5%BB%BA%E8%AE%BE%E9%AB%98%E5%8F%AF%E7%94%A8%E7%B3%BB%E7%BB%9F/

繼續閱讀