本文是我對與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這一節的正文和描述的問題就不再說一遍了,貼個圖幫助查看吧。
首先,這個圖中描述的D1和D2都是可能存在的,它們都是“合法”存在的場景。
其次,這節內容的目的是想說明,Leader不能直接“提交”之前term(previous terms)的日誌,不能按照“大多數”應答的邏輯去提交之前term的日誌。只有當前term的日誌,複製後收到了大多數節點的應答,纔可以提交這個日誌。但是之前term的,是不能“提交”的。那麼,之前term的日誌怎麼提交呢?文中的說法是,follower節點的數據要保持跟leader節點一致。那麼當follower滿足接受當前最新日誌的條件,並且接受了最新的日誌,它的舊日誌也要保持跟leader一致。如果最新的日誌提交了,那麼最新的日誌之前的日誌也就提交了。
最後,這裏還描述了一個現象,就是大多數節點都有的日誌,也不一定就是“提交”狀態的日誌,只有當前leader term發起的,大多數節點都有的,纔可能是“提交”狀態的日誌。這裏說的就是“黃色”index=2的日誌。
另外,我翻閱了braft的代碼,發現並沒有對這種場景做特殊處理,更加印證了我的理解。
總結一下,很簡單,就是leader不會直接“提交”之前term的日誌,只會通過複製,提交當前term的日誌。之前term的日誌,都是通過Raft協議中描述的,新日誌提交了,舊日誌也一定提交了,這個順序要求。