paxos算法中master有效期與續約依賴機器時間的解決辦法

對於paxos算法,一般工程化時,爲了提高paxos算法效率,會引入master角色,並且要遵循在同一時刻,paxos集羣有且只有一個節點是master角色,或者沒有master角色;且只有master角色的節點可以發起propose,這兩個原則。

這就涉及到了maste的選舉與續約。一般的master選舉如下圖所示:

 

那麼master節點認爲master的任期爲從beMaster操作的paxos算法開始前T1時刻開始的timeout時間,即T3之前有效。其他節點認爲master的任期爲beMaster操作的paxos算法結束後的timeout時間,即圖中T2‘之前有效。這就保證了master節點一定會認爲自己的過期時間要提前與其他節點認爲master過期的時候。因此,保證了在master的任期內,其他節點不會錯誤的發起beMaster操作,導致master漂移。

對於master續約,如下圖所示:

只需要在master有消息內,有master節點週期性的發起beMaster操作,對過期時間進行續約即可。在穩定的情況下,master角色會一直迭代下去。

如上是,一般的master選舉與續約算法過程。但是我們可以看到,master的有效時間極其依賴了機器時間。一般在分佈式算法中,不推薦對機器時間的依賴。因爲機器時間是一個很不穩定的因素,比如時間的回退或者跳躍,都會導致分佈式算法的未知狀態與錯誤。

在master選舉與續約中,有同樣的問題,比如slave節點的機器時間跳躍,導致了slave節點認爲master提前過期,slave節點就會錯誤的發起beMaster請求,會導致master的漂移,甚至出現腦裂現象。

而且paxos算法中,instanceId是隨着每次propose請求順序遞增的,並且由paxos算法保證,每個節點instanceId的強一致性與順序性。那麼我們可以利用instanceId的變化來代替機器時間。把master有效期timeout時間,替換爲n個instanceId的增長有內效。把週期時間的master續約,替換爲m個instanceId的增加週期續約。如此便可以去除master選舉與續約對於機器時間的依賴。

我們對於master有效的instanceId增長數量的選取極爲重要。因爲考慮到空集羣,即沒有任何propose請求的集羣,中instanceId不會增長或增長的過於緩慢,會導致master永遠不過期或有效期時間過長,導致master節點宕機,其他節點很久無法感知到。或者併發量過高的集羣,instanceId增長過快,導致master有效期過短,beMaster操作過於頻繁。

我們可以單獨設置一種propose請求,專門用來做master有效期的instanceId的增長,我們稱爲master任期計數propose。該propose次數即爲master的有效任期。比如,我們選取50ms進行一次master任期計數propose,假設原來master有效期爲10秒,我們可以設置master有效期的instanceId增長數量爲200,即進行200次master任期計數propose後,master過期。並且master續約,可以設置爲50到60次master任期計數propose,續約一次。

同時,爲了滿足以時間爲任期的master特性,即master節點認爲自己過期時間一定早於其他節點認爲master過期時間,我們可以設置master節點任期的instanceId增長數量爲200,slave認爲master節點任期的instanceId增長數量爲220。

如此,我們用instanceId的增長替換了機器時間,是的master的選舉與續約,不再依賴機器時間,因爲對於機器時間的回退與跳躍不會產生任何影響。

總結,利用paxos算法自身的強一致性,我們單獨增加一種master任期計數propose,週期性的進行改propose請求,假設週期間隔時間爲s毫秒,master有效期爲t毫秒,我們可以得到master任期的instanceId增長數量num=t/s。並且需要設置master的任期instanceId增長數量>slave節點的任期instanceId增長數量。並且在num/4+rand(num/8)個instanceId增長後,master進行續約。這裏所說的instanceId增長均爲master任期計數propose的instanceId增長。

如此我們達到了與依賴時間功能完全一致的master選舉與續約算法,並且不再依賴機器時間。

 

 

 

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