「分佈式」 分佈式系統設計策略

分佈式系統本質是通過低廉的硬件攢在一起以獲得更好地吞吐量、性能以及可用性等。分佈式系統有一些通用的設計策略,也是在分佈式環境下普遍關心的幾個問題:

如何檢測你還活著?

如何保障高可用

容錯處理

重試機制

負載均衡

1. 心跳檢測

在分佈式環境中,一般會有多個節點來分擔任務的運行、計算或程序邏輯處理。通常採用 心跳檢測 來判斷節點是否可用。

「分佈式」 分佈式系統設計策略


如上圖所示,Client請求Server,Server轉發請求到具體的Node獲取請求結果。Server需要與三個Node節點保持心跳連接,確保Node可以正常工作。

若Server沒有收到Node3的心跳時,Server認為Node3失聯。失聯代表並不確定是否是Node3故障,有可能是Node3處於繁忙狀態,導致調用檢測超時;也有可能是Server與Node3之間鏈路出現故障或閃斷。所以心跳不是萬能的,收到心跳可以確認節點正常,但是收不到心跳卻不能認為該節點已經宣告“死亡”。此時,可以通過一些方法幫助Server做決定:週期檢測心跳機制、累計失效檢測機制。

週期檢測心跳機制

Server端每間隔 t 秒向Node集群發起監測請求,設定超時時間,如果超過超時時間,則判斷“死亡”。

累計失效檢測機制

在週期檢測心跳機制的基礎上,統計一定週期內節點的返回情況(包括超時及正確返回),以此計算節點的“死亡”概率。另外,對於宣告“瀕臨死亡”的節點可以發起有限次數的重試,以作進一步判斷。

通過週期檢測心跳機制、累計失效檢測機制可以幫助判斷節點是否“死亡”,如果判斷“死亡”,可以把該節點踢出集群。

2. 高可用設計

系統高可用性的常用設計模式包括三種:主備(Master-Slave)模式、互備(Active-Active)模式和集群(Cluster)模式。

1) 主備模式

主備模式就是Active-Standby模式,當主機宕機時,備機接管主機的一切工作,待主機恢復正常後,按使用者的設定以自動(熱備)或手動(冷備)方式將服務切換到主機上運行。在數據庫部分,習慣稱之為MS模式,即Master/Slave模式,這在數據庫高可用性方案中比較常用,但存在Master到Slave的數據延時風險,尤其是跨地域複製。如MySQL、Redis等就採用MS模式保證高可用。

「分佈式」 分佈式系統設計策略

2) 互備模式

互備模式指兩臺主機同時運行各自的服務工作且相互監測情況。在數據庫高可用部分,常見的互備是MM模式,即Multi-Master模式,指一個系統存在多個master,每個master都具有read-write能力,需根據時間戳或業務邏輯合併版本。比如分佈式版本管理系統Git,可以理解成Multi-Master的解決方案,具備最終一致性。

3) 集群模式

集群模式是指有多個節點在運行,同時可以通過主控節點分擔服務請求。如Zookeeper。集群模式需要解決主控節點本身的高可用問題,一般採用主備模式。

「分佈式」 分佈式系統設計策略

如TFS(Taobao File System),它涉及到NameServer、DataServer兩類節點。NameServer存放元數據,而具體的業務數據存放於DataServer。多個DataServer就是集群模式的運行狀態,NameServer作為主控節點。為了保障NameServer的高可用,通過Heart Agent機制做心跳檢測來負責NameServer的主備切換(主備模式)。

3. 容錯性

容錯就是IT系統對於錯誤的包容能力,確切地說是容故障而非錯誤。容錯的處理是保障分佈式環境下相應系統的高可用或者健壯性。

以TFS為例,TFS集群需要容錯(整個集群宕掉咋辦?)、NameServer需要容錯、DataServer也需要容錯。NameServer主要管理了DataServer和Block之間的關係。如每個DataServer擁有哪些Block,每個Block存放在哪些DataServer上等。同時,NameServer採用了主備模式,主NameServer上的操作會重放(同步)到備NameServer,如果主NameServer出現問題,可以實時切換到備NameServer。另外NameServer和DataServer之間也會有定時的心跳機制,DataServer會把自己擁有的Block發送給NameServer,NameServer會根據這些信息重建DataServer和Block的關係。

另外,緩存失效雪崩問題也可以進行一定的容錯處理,提升系統健壯性。比如,我們使用緩存通常都是先檢查緩存是否存在,如果存在則直接返回緩存內容,如果不存在就直接查詢數據庫然後再緩存查詢結果返回。因此,如果我們查詢的某一些數據實際上不存在,就會造成每一次請求都查詢DB,給數據庫造成較大的壓力。這種情況下,一個比較巧妙的方法是,將這個不存在的key預先設定一個值並存入緩存(過期時間不宜過長),避免大量請求透傳到DB中。

4. 負載均衡

負載均衡集群:其關鍵在於使用多臺集群服務器共同分擔計算任務,把網絡請求及計算分配到集群可用服務器上去,從而達到可用性及較好地用戶體驗。

「分佈式」 分佈式系統設計策略

負載均衡器有硬件解決方案,也有軟件解決方案。硬件解決方案有著名的F5,軟件有LVS、HAProxy、Nginx等。

以Nginx為例,負載均衡有如下幾種策略:

輪詢:即Round Robin,根據Nginx配置文件中的順序,依次把客戶端的Web請求分發到不同的後端服務器

最少鏈接:當前誰連接最少,分發給誰

基於權重:配置Nginx把請求更多地分發到高配置的後端服務器上,把相對較少的請求分發到低配服務器


分享到:


相關文章: