這篇文章主要討論分散式系統中的網路分區問題,網路分區是指在分散式集群中,節點之間由於網路不通,導致集群中的節點形成不同的子集,子集中的節點可以相互通信,子集之間的網路是不通的。 ...
網路分區問題
什麼是網路分區?
網路分區只在分散式集群中,節點之間由於網路不通,導致集群中節點形成不同的子集,子集中節點之間網路互通,而子集與子集之間網路不通。
如何判斷是否發生了網路分區?
不同的集群架構網路分區的形態會有不同,可以從集中式架構和非集中式架構兩方面考慮。
集中式架構下的網路分區
集中式架構中,Master節點通常以一主多備的形式部署,Slave和Master節點相連接,Master節點的主和備之間會通過心跳互相通信。
集中式架構中的網路分區主要是主節點與備節點之間網路不通,且一部分Slave節點只能與主Master節點聯通,另一部分只能與備Master節點聯通。
非集中式架構下的網路分區
非集中式架構中,節點是對稱的,網路分區的形態是形成不同子集,子集內節點間可以互相通信,而子集之間不能通信。
上述兩種架構中,要判斷是否形成了網路分區,最朴素的方式就是判斷節點之間心跳是否超時,然後將心跳可達的節點歸屬到一個子集中。
網路分區問題的處理方法
在檢測到網路分區後,我們可以有不同的解決辦法。
- 激進的辦法,一旦發現節點不可達,則將節點從集群中刪掉,併在新集群中選出新的主。
- 保守的辦法,一旦發現某些節點不可達,則直接停止自己的服務,這樣可以避免雙主問題,但是使用這種方式,容易導致系統中所有的節點都停止服務,真個系統完全不可用。
Static Quorum方法
Static Quorum是一種固定票數的策略,在系統啟動前,先設置一個固定票數,當發生網路分區後,如果一個分區中節點數大於等於這個固定的票數,則該分區為活動分區。
為了保證分區分區後,不會出現多個活動分區,引發雙主或者多主問題,需要對固定票數的取值做一些約束,即:固定票數≤ 總節點數≤2* 固定票數 - 1。
這種方法的優點是簡單易實現,缺點是:
- 分區數較少時,該方法工作得很好,但是當活動分區特別多時,由於各個分區的票數分散,不容易找出一個滿足條件的分區,沒有活動分區也就意味著集群不可用了。
- 由於票數是固定不變的,所以不適用於集群中有動態節點加入的場景。
Keep Majority方法
Keep Majority是指保留具有大多數節點的子集群。由於不限定每個分區的節點數超過一個固定的票數,所以可以應用於動態節點加入的場景。
這種方法不適用於生產多分區的場景,隨著分區數量增加,節點分散,也很難在眾多分區中出現1個節點數 w≥n/2 的分區。
仲裁機制方法
設置仲裁機制的核心是引入一個第三方組件或者節點作為仲裁者,該仲裁者和集群中的所有節點相連,集群中所有節點都將自己的心跳信息報這個這個中心節點。因此該中心節點用於全局心跳信息,可以根據全局心跳情況信息判斷出有多少個分區。
基於共用資源的方法
基於共用資源方法的核心,就類似於分散式鎖機制。即哪個子集群獲得共用資源鎖,就保留這個子集。
作者:李潘 出處:http://wing011203.cnblogs.com/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。