分佈式技術架構原理解析之協調與同步(一)

分佈式互斥

通過**《分佈式技術架構原理解析之序篇》**,對分佈式系統有了一個初步瞭解。今天,和大家一起分享:分佈式協調與同步。學習如何讓分佈在不同計算機上的程序具有“團隊精神”,換句話說就是如何讓程序通過協作共同去達成一個業務目標。首先我們來看一下分佈式互斥呢。
在分佈式系統裏,對於同一共享資源,在同一時刻只能被一個程序訪問,叫作分佈式互斥(Distributed Mutual Exclusion),而這種被互斥訪問的共享資源就叫作臨界資源(Critical Resource)

1分佈式互斥實現

1.1 集中式算法

舉一個例子你正在一家餐廳使用自助咖啡機泡製咖啡,突然有個人過來挪走了你的杯子,開始泡製他自己的咖啡。就像我們使用自助咖啡機時不希望被打擾一樣,對於同一共享資源,一個程序正在使用的時候也不希望被其他程序打擾。對於這個咖啡機,我們首先想到的就是,增加一個“協調者”來約束大家使用自助咖啡機,解決強行插入打斷別人的問題。
類似地,我們引入一個協調者程序:

  • 每個程序在需要訪問臨界資源時,先給協調者發送一個請求。如果當前沒有程序使用這個資源,協調者直接授權請求程序訪問;
  • 否則,按照先來後到的順序爲請求程序“排一個號”在隊列中等待;
  • 如果有程序使用完資源,則通知協調者,協調者從“排號”的隊列裏取出排在最前面的請求,並給它發送授權消息;
  • 拿到授權消息的程序,可以直接去訪問臨界資源。
    這個互斥算法,就是我們所說的集中式算法,也可以叫做中央服務器算法。之所以這麼稱呼,是因爲協調者代表着集中程序或中央服務器。
    集中式算法的示意圖如下所示:
    集中式算法示意圖
    上圖中有程序1、程序2、程序3、程序4四個普通程序,另一個程序爲協調者。按照集中式算法程序的請求流程如下:
    1、當程序 2 和程序 4 需要使用臨界資源時,它們會向協調者發起申請,請求協調者授權,但是程序 3正在使用臨界資源。2、這時,協調者根據程序 2 和 4 的申請時間順序,依次將它們放入等待隊列。(在這個案例裏,程序 4 的申請時間早於程序2,因此排在程序 2 的前面);
    3、程序 3 使用完臨界資源後,通知協調者釋放授權。
    4、協調者從等待隊列中取出程序4,並給它發放授權。程序 4 就可以使用臨界資源了。
    從上述流程可以看出,一個程序完成一次臨界資源訪問,需要如下幾個流程和消息交互
  • 向協調者發送請求授權信息,1 次消息交互;
  • 協調者向程序發放授權信息,1 次消息交互;
  • 程序使用完臨界資源後,向協調者發送釋放授權,1
    次消息交互。
    因此,每個程序完成一次臨界資源訪問,需要進行 3 次消息交互

集中算法特點

集中式算法具有簡單易於實現的特點,但可用性、性能易受協調者影響。在實際應用場景中選擇集中式算法的時候,一定要選擇性能好、可靠性高的服務器來運行協調者,同時要做好主備備份,主故障後備可以立馬升爲主。

1.2 分佈式算法

既然引入協調者會有單點故障、性能等問題,那麼是否可換一個思路,來實現對臨界資源的互斥訪問呢?
當一個程序要訪問臨界資源時,先向系統中的其他程序發送一條請求消息,在接收到所有程序返回的同意消息後,纔可以訪問臨界資源。其中,請求消息需要包含所請求的資源請求者的 ID,以及發起請求的時間
這就是民主協商法。在分佈式領域中,我們稱之爲分佈式算法,或者使用組播和邏輯時鐘的算法。
如下圖所示程序 1、2、3 需要訪問共享資源 A。在時間戳爲 8 的時刻,程序 1 想要使用資源 A,於是向程序 2 和 3 發起使用資源 A 的申請,希望得到它們的同意。在時間戳爲 12 的時刻,程序 3 想要使用資源 A,於是向程序 1 和 2 發起訪問資源 A 的請求。
程序1和程序3差不多同一時間要訪問共享資源A
如圖所示,此時程序 2 暫時不訪問資源 A,因此同意了程序 1 和 3 的資源訪問請求。對於程序 3 來說,由於程序 1 提出請求的時間更早,因此同意程序 1 先使用資源,並等待程序 1 返回同意消息。
程序1的請求時間比程序3更早,獲得所有授權,訪問資源A
如圖所示,程序 1 接收到其他所有程序的同意消息之後,開始使用資源 A。當程序 1 使用完資源 A 後,釋放使用權限,向請求隊列中需要使用資源 A 的程序 3 發送同意使用資源的消息,並將程序 3 從請求隊列中刪除。此時,程序 3 收到了其他所有程序的同意消息,獲得了使用資源 A 的權限,開始使用臨界資源 A 的旅程。
程序1釋放資源A,程序3獲得所有授權,訪問資源A
從上述流程可以看出,一個程序完成一次臨界資源的訪問,需要進行如下的信息交互:

  • 向其他 n-1 個程序發送訪問臨界資源的請求,總共需要 n-1 次消息交互;
  • 需要接收到其他 n-1個程序回覆的同意消息,方可訪問資源,總共需要 n-1 次消息交互。
    可以看出,一個程序要成功訪問臨界資源,至少需要 2*(n-1) 次消息交互。假設,現在系統中的 n 個程序都要訪問臨界資源,則會同時產生 2n(n-1) 條消息。
    總結來說,在大型系統中使用分佈式算法,消息數量會隨着需要訪問臨界資源的程序數量呈指數級增加,容易導致高昂的“溝通成本”。

分佈式算法特點

分佈式算法是一個“先到先得”和“投票全票通過”的公平訪問機制,但通信成本較高,可用性也比集中式算法低,適用於臨界資源使用頻度較低,且系統規模較小的場景。

1.3 令牌環算法

除了集中式算法、分佈式算法以外,其實還有其他方法可以實現分佈式互斥。 如下圖所示,所有程序構成一個環結構,令牌按照順時針(或逆時針)方向在程序之間傳遞,收到令牌的程序有權訪問臨界資源,訪問完成後將令牌傳送到下一個程序;若該程序不需要訪問臨界資源,則直接把令牌傳送給下一個程序。在分佈式領域,這個算法叫作令牌環算法,也可以叫作基於環的算法。
令牌環算法示意圖
因爲在使用臨界資源前,不需要像分佈式算法那樣挨個徵求其他程序的意見了,所以相對而言,在令牌環算法裏單個程序具有更高的通信效率。同時,在一個週期內,每個程序都能訪問到臨界資源,因此令牌環算法的公平性很好
但是,不管環中的程序是否想要訪問資源,都需要接收並傳遞令牌,所以也會帶來一些無效通信。假設系統中有 100 個程序,那麼程序 1 訪問完資源後,即使其它 99 個程序不需要訪問,也必須要等令牌在其他 99 個程序傳遞完後,才能重新訪問資源,這就降低了系統的實時性。
綜上,令牌環算法非常適合通信模式爲令牌環方式的分佈式系統,例如移動自組織網絡系統。
對於集中式和分佈式算法都存在的單點故障問題,在令牌環中,若某一個程序出現故障,則直接將令牌傳遞給故障程序的下一個程序,從而很好地解決單點故障問題,提高系統的健壯性,帶來更好的可用性。但,這就要求每個程序都要記住環中的參與者信息,這樣才能知道在跳過一個參與者後令牌應該傳遞給誰。

令牌環算法特點

令牌環算法的公平性高,在改進單點故障後,穩定性也很高,適用於系統規模較小,並且系統中每個程序使用臨界資源的頻率高且使用時間比較短的場景。

2 總結

本文講解了什麼是分佈式互斥,以及爲什麼需要分佈式互斥。然後,介紹了 3 類典型的分佈式互斥方法,即:集中式算法、分佈式算法,以及令牌環算法。後面一篇繼續介紹分佈式系統協調與同步的相關內容-分佈式選舉

3 分佈式互斥方法思維導圖

分佈式互斥方法思維導圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章