分布式中 幽靈復現是指在不同的時間點讀取同乙份資料可能出現前後不一致的問題,其本質還是分布式一致性沒有得到保障
現象
有三颱節點 a b c,初始日誌複製如下[數值表示term 數值下標表示index]
a 1 1
b 1 1
c 1 1
假設 a寫入日誌
a 1 1 1 三條term為1 ,index為0,1,2
假設日誌內容是 add [x=1] [y=2] [z=3]
b 1 1
c 1 1
此時a掛掉,b成為leader
b 1 1
c 1 1
此時讀取資料為x=1 y=2 z 的日誌由於a掛掉讀取不到
假設此時b掛掉 a再次選舉 a的index和term決定a可以成為leader
此時讀取資料為x=1 y=2 z=3
出現幽靈復現 即在第二輪沒有讀到的資料在第三輪讀到
raft解決方案
不同的一致性演算法有不同的解決方案
raft如下解決
1 每次選舉term++,隨後追加當前term的noop日誌
2 commitindex 只有term相同的時候才可以提交
3 日誌服從leader節點可以回退
假設初始a,b,c如下,【假設a是leader】
a 1 2
b 1 2
c 1 2
a 以下情形 【不可以存在,index=2 ,term=3 的日誌如果沒有過半 a無法提交commitindex 就不會出現
index=3,term=3的日誌】
a 1 2 3 3
b 1 2
c 1 2
b1a 1 2 (3) (3)
b 1 2 3
c 1 2
b2 a掛掉b 此時只能是b選擇leader 日誌一致
a 1 2
b 1 2 3
c 1 2
b11a 1 2 (2) (2)
b 1 2 2
c 1 2
b2 a掛掉 c選擇leader 追加noop,b的index=2 term 不同於leader 開始backoff 最終日誌一致
假設沒有term約束 那麼b,c在index = 2 的term則會不一致
a 1 2
b 1 2 2
c 1 2 noop
案例多多,最終相關結論如下
新leader必須追加noop日誌解決幽靈復現,同時新leader認為所有follower的節點nextindex和noop之前相同,但還沒有感知到matchindex matchindex全部為0
追加日誌必須 previndex >= last prevterm 和lastterm相同
commitindex leader 必須term相同 newcommitindex> commitindex
如果日誌匹配不上follower需要回退,leader會回退nextindex重新發起日誌直到匹配成功後確定backoffsetindex
分布式一致性演算法Raft
我們先來看乙個例子 我們有乙個單節點node,這個節點可以是資料庫,也可以是一台伺服器,當client向node傳送data時,x節點收到data,記錄下來 由此可見對於單個節點,一致性是很容易實現的。然而對於多個節點,我們如何來實現一致性,這就是分布式一致性的問題。raft就是乙個實現分布式一致性...
分布式一致性
分布式一致性是指在分布式環境中對某個副本資料進行更新操作時,必須確保其他副本也會更新,避免不同副本資料不一致。分布式系統乙個重要的問題時解決資料複製,一是為了增加系統的可用性防止單點故障,二是提高系統可用性,通過負載聚恆,使分布在不同位置的資料副本能夠提供服務。理想狀態下,當然希望分布式系統能夠實現...
分布式一致性
分布式系統的乙個重要問題是資料的複製。對資料的複製一般有兩個原因 資料複製的主要難題是保持各個副本的一致性。即在更新乙個副本時,必須確保同時更新其他的副本,否則資料的各個副本將不再相同。一致性模型實質上是程序和資料儲存之間的乙個約定。正常情況下,乙個資料項上執行讀操作時,它期待該操作返回的是該資料在...