raft算法-順帶處理前任的事-看似隨心卻是精心

今天在跑raft算法的時候,突然發現一個有意思的細節:如何處理前任未提交的日誌。
我們都知道raft選舉的時候會綜合考慮任期(term)和日誌索引(index),優先選擇具備最新的數據的節點成爲master,這個其實非常容易理解,這是爲了最大化保持數據。
但這裏面有個小細節就是,如下圖所示,S3在任期7的時候提交了一個日誌,但它還沒來得及複製就掛了。

在這裏插入圖片描述
之後master切換到其他節點。如果此時其他節點再重新寫數據的時候,會覆蓋S3中index爲4的日誌,這點相信大家都很容易理解,畢竟它是一個未被提交的日誌。那如果在這段時間內集羣沒有新數據提交,然後S3在任期12的時候又重新回到master位置,這時會raft會怎樣處理呢?
這裏回到文章的標題,raft的做法是:順帶處理前任的事。當成爲master後他會將數據複製到其他節點但並不會立刻提交,而且在它提交本任期的日誌的時候,順帶提交之前任期的日誌。大家可能覺得這個好像沒有差別啊,貌似沒有差別啊。
其實這裏充滿設計者的智慧,設想一下,如果S3在啓動的時候複製完日誌立刻就提交的話,會存在一個問題:它複製的日誌存在被覆蓋的風險。還是看圖說話吧
在這裏插入圖片描述
在任期2內黃色的被提交的日誌,很有可能被任期3的所覆蓋,爲了避免這個問題,只有在e圖中,任期4提交數據的時候順帶提交之前的日誌,纔是正確的打開方式。因爲此時如果S1掛了,也沒事,重新選舉的時候,由於S1/S2/S3都是任期4,即便重新選舉也是在他們三個中間,任期2黃色的數據就可以保證“已提交的日誌不會丟失”這個規則。

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