2016-04-21 79 views
0

我有一個抽象的問題。故障轉移的分佈式單例服務

我需要一個具有容錯功能的服務。該服務一次只能在一個節點上運行。這是關鍵。

有兩個連接節點:A和B.

  • 如果A是運行的服務,B必須等待。
  • 如果A關閉,B應檢測到並啓動服務。
  • 如果A再次打開,則A應該等待並且不要運行該服務。
  • 等(如果B被關斷,A開始,如果A被關閉B開始)

我想心跳協議同步的節點的狀態和檢測超時,但有一個很多比賽條件。

我可以添加一個全局鎖的第三個節點,但我不知道如何做到這一點。

任何人都知道任何知名的算法來做到這一點?還是更好有沒有任何開源軟件可以讓我控制這種事情?

感謝

+0

告訴我們你的服務做得多一點。什麼是獨家資源?它是輸入還是輸出必須是獨佔的?爲什麼不以冗餘方式平行運行? – stefan

+0

有幾十個獨佔資源的示例:每個客戶端僅支持單個連接的外部服務,票據服務,處理某些IoT(硬件)的服務...... – Garet

回答

1

如果你能提供某種節點之間的共享存儲器的,再有就是經典的算法,解決了這個問題,稱Peterson's algorithm

它基於兩個附加變量,稱爲flagturnTurn是一個整型變量,其值表示此時允許處於活動狀態的節點的索引。換句話說,turn=1表示節點no 1有權活動,其他節點應該等待。換句話說,輪到他活躍起來 - 這就是名字的來源。

Flag是一個布爾數組,其中flag[i]指示第i個節點聲明自己已準備好進行服務。在您的設置中,flag[i]=false表示第i個節點關閉。算法的關鍵部分是準備好服務的節點(即flag[i] = true)必須等到他獲得turn

算法最初被開發用於解決執行問題沒有衝突。但是,在您的情況下,關鍵部分僅僅是運行該服務。您必須確保在第i個節點關閉之前,它將flag[i]設置爲false。這絕對是一個棘手的部分,因爲如果一個節點崩潰,它顯然不能設置任何值。我會帶着某種心跳去這裏。

關於解決類似問題的開源軟件,請嘗試搜索「羣集故障轉移」。閱讀關於Google's PaxosGoogle FileSystem。有很多解決方案,但是如果你想自己實現一些東西,我會嘗試Peterson的算法。