![](/img/trans.png)
[英]How raft algorithm maintains strong read consistency in case of a node become leader and it have an uncommitted log entry
[英]In RAFT is it possible to have a majority consensus on a log entry but the entry is not committed?
在官方筏網頁上考慮這種模擬
盡管S2 (leader)
, S3
和S4
同意日志,為什么第term 2 index 1
沒有提交? 我運行這幾分鍾以確保所有通信都已發生。
奇怪的是,如果我再添加一個日志條目term 6 index 2
那么將提交term 2 index 1
。
有誰知道什么是阻止term 2 index 1
被提交的規則?
您的領導者在第6學期,但沒有一個日志條目來自第6學期; 這在Raft中引用了一個特殊規則。 領導者不會自動提交前一個詞條,因為在某些情況下這樣做是不安全的。 第5.3和5.4節詳細討論了這一點(另見圖8)。
從第5.4.2節:
為了消除類似於圖8中的問題,Raft從不通過計算副本來提交先前術語的日志條目。 通過計算副本,只提供領導者當前術語的日志條目; 一旦以這種方式提交了當前術語的條目,則由於日志匹配屬性而間接提交所有先前條目。 在某些情況下,領導者可以安全地斷定提交了較舊的日志條目(例如,如果該條目存儲在每個服務器上),但是Raft采用更保守的方法來簡化
您的示例完美地設置為顯示為什么這是不安全的。 讓我們假設S2 確實提交 ,然后我們通過將兩個東西提交到同一個槽中來打破它。
AppendEntries(commitIndex=1, [])
。 AppendEntries(commitIndex=1)
。
2
現在在兩台主機上提交。 AppendEntries([4])
。
AppendEntries([4])
。
2
。 AppendEntries([4])
。 4
AppendEntries([4])
。
發生了什么? 實質上,我們為同一個時段選出了兩個不同的領導者。 (當S1更新時,S2當選為領導者。)
那么為什么領導者在沒有等待后續請求的情況下提交自己的條款是否安全呢? 因為不可能進入上述情況。 讓我們考慮兩個節點(S2,S1)分別認為它們在第2和第3項中同時是領導者的情況。 如果S2准備好將2
提交到插槽1,那么大多數在那里具有相同的值。 這意味着沒有多數人投票支持在插槽1中有更高期限的任何其他任何東西。這意味着S1,在第3階段當選為領導者,在第1個插槽中必須有2
個。
(順便說一句,我花了一分鍾才弄清楚你是如何進入這種情況的。)
另外,Raft被稱為“Paxos更易理解的版本”。 我不同意:它似乎有這么多(如果不是更多)角落案例。 但是,Raft的作者非常善於讓工程師輕松地正確實現某些實用的東西。 這與作者如何撰寫筏紙有關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.