TIPS Raft Committing entries from previous terms

本文是我對與Raft論文3.6.2節的理解。寫這篇文章的原因是因爲理解這段內容確實花了一些功夫。

面向對象:懂得Raft,同時也對3.6.2節有疑問,並且看了“參考”這裏面幾個之後還不是很清晰的同學。

NOTE: 3.6.2節是《CONSENSUS: BRIDGING THEORY AND PRACTICE》這篇論文的,對應《In Search of an Understandable Consensus Algorithm(Extended Version)》是5.4.2節。

看這篇文章之前先看一下Raft 5.4.2 Committing entries from previous terms的理解,如果看的懂得話,就不用再看這個了,否則再看看我的理解,是否能有幫助。

3.6.2這一節的正文和描述的問題就不再說一遍了,貼個圖幫助查看吧。

Committing entries from previous terms
首先,這個圖中描述的D1和D2都是可能存在的,它們都是“合法”存在的場景。
其次,這節內容的目的是想說明,Leader不能直接“提交”之前term(previous terms)的日誌,不能按照“大多數”應答的邏輯去提交之前term的日誌。只有當前term的日誌,複製後收到了大多數節點的應答,纔可以提交這個日誌。但是之前term的,是不能“提交”的。那麼,之前term的日誌怎麼提交呢?文中的說法是,follower節點的數據要保持跟leader節點一致。那麼當follower滿足接受當前最新日誌的條件,並且接受了最新的日誌,它的舊日誌也要保持跟leader一致。如果最新的日誌提交了,那麼最新的日誌之前的日誌也就提交了。
最後,這裏還描述了一個現象,就是大多數節點都有的日誌,也不一定就是“提交”狀態的日誌,只有當前leader term發起的,大多數節點都有的,纔可能是“提交”狀態的日誌。這裏說的就是“黃色”index=2的日誌。

另外,我翻閱了braft的代碼,發現並沒有對這種場景做特殊處理,更加印證了我的理解。

總結一下,很簡單,就是leader不會直接“提交”之前term的日誌,只會通過複製,提交當前term的日誌。之前term的日誌,都是通過Raft協議中描述的,新日誌提交了,舊日誌也一定提交了,這個順序要求。

參考

  1. Raft 5.4.2 Committing entries from previous terms的理解

  2. raft算法中,5.4.2節一疑問

  3. Does this cause a real problem when I adopt the Raft’s “never commits log entries from previous terms by counting replicas” rule in this situation?

  4. How does raft handle committing entries from previous one?

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