raft是paxso家族中一員。
paxso的前提是 無作惡節點、存在網路磁區, 在此情形下,確保一致性,在過半節點能互通的情況下具有可用性, 在過半節點不可用(死或網路磁區) 的情況下 無法產生多數派、或 多數派代理人(主節點)死 導致不可用。

圓區域表示集群中全部節點,藍色點表示主節點,綠色區域表示當次的多數派,
w1,w2,w3是來自集群外用戶的寫請求,這是一般正常情況下,raft集群中發生的情況。
在t3時刻后,狀態機結果是執行w1 w2 w3序列后的樣子。
集群節點數2f+1。這個數目是節省資源的形式,同時也是方便書寫。實際上,集群節點數可以是任意的大于2的數目。
確保只有一個寫請求序列存在,是一致性協議的目標。
如果可以將集群虛化為一個唯一邏輯節點,則該邏輯節點產生的寫請求序列也是唯一的。
多數派就是此邏輯節點,每一個寫請求都對應一個多數派。 一次訊息傳遞,回復超過f+1,即為一個多數派。 可見,多數派是變動的。
對多數派的唯一要求是排他性(唯一性),當集群中產生一個多數派時,無法再產生另一個多數派。 上圖中圓,切割成任意多塊,最多只有一塊面積過半。 任意兩次切割產生的過半區域必有重疊。
圖上紅色部分中的節點,通過傳播訊息,可以知道自己無法形成多數派。集群中每個節點事先知道集群節點總數。raft支持動態增減節點。
主節點僅僅是多數派的一個代理,為了方便向多數派發送寫請求。(主節點顯然必須要是唯一的,因為多數派是唯一的,多數派的代理必然也被要求唯一)
理論上說,多數派存在,并且可向多數派發寫請求,即可用(具有可用性)。多數派不存在,則無法可用。
所以 可用性 需要 多數派存在、且有入口將請求帶入多數派。 這個入口在raft中就是主節點:多數派的代理人。
如果多數派不存在,則無法可用,必須等到多數派出現才能可用。 但入口死了,可以換一個入口后,依然可用。 這是這兩種不可用。
由此可知,主節點并沒有特殊性,要求是主節點是唯一的。 快速找出一個唯一節點(主節點),raft用的是多次隨機計數器最先到0者(不考慮網路傳輸差異的話)。
網路傳輸不可靠, 存盤在記憶體中不可靠, 這兩個不可靠對應了兩階段。 ( 寫到磁盤可靠,對應完成或叫已提交)
由多數派完成每個階段(每個階段落實到多數派中,才算該階段完成)。 理論上 這兩個階段 可以合成為一個大階段,但存在只進行完第一階段的情況,所以就需要回退到第一階段的動作,更加復雜。 由此可見上面的兩個步驟是最小步驟。
請求wi進入主節點(多數派的代理人),主節點為wi發起第一階段、第二階段,假設主節點在wi的兩個階段都是活著的,則只要階段一進入多數派、接著 階段二進入多數派,寫請求w2就完成了。
任意階段如果由于無法出現多數派,則只能等到多數派出現才能結束。這是犧牲可用性的地方。 多個網路磁區 、 過多的死節點 會導致無法出現多數派。
假設 主節點在wi的第一階段進行中死去,若干次 隨機計數器到0后 會再次出現勝出者 (這里只需要能得到唯一節點的辦法,并不一定非要這種辦法) 約定 勝出者為心主節點, 此種情況下 丟棄wi 無副作用。
假設 主節點在wi的第一階段完成后 第二階段進行中 死去, 隨后依然會有新主節點出現,此種情況下 丟棄wi 無副作用(實際上短時內可能可以從多數派中撈出wi的階段一已完成,此時在記憶體中,并從這里繼續。但意義不大)。
假設 主節點在wi的第一階段完成后 第二階段完成后 還沒有給客戶端回應 而死去,隨后依然會有新主節點出現,此種情況下 wi已經進入了多數派的磁盤(故wi實際上可以從多數派中撈出來) , 如果選擇丟棄wi 則必須要多數派做回退wi,為了簡單,應該選擇不動作,以后從wi繼續即可。 客戶端此次沒有收到回應,但實際已經做了wi。客戶端后面可以獲知此wi成功。
新主節點,實際上僅僅具有唯一性而已,其存盤的寫請求序列未必是多數派此時存盤的序列,所以新主節點在能干活之前 依然要從多數派中撈出多數派存盤的寫請求序列 。
上一個多數派持有了最新的寫請求序列, 本次的多數派無法剔除上次多數派中所有節點而成為多數派,因此本次多數派中必然擁有上次多數派中的請求序列 (規則是:最新請求序列號(term輪次+請求序號) ) 。
這里隱含了,本次多數派中每個節點都是誠實的前提(忠誠執行協議內容)。
term號 是對一次不變的主節點 做的編號, 一個主節點正常干活期間 可能產生了多個寫請求 , term號 標記的是 處在這些寫請求中, 作用是快速比較兩個完整寫請求序列不同:若term不同,則肯定兩個寫序列肯定不同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/33291.html
標籤:區塊鏈技術
上一篇:想用零知識證明實作隱私保護,有用過libsnark庫的給個教程
下一篇:有關raft的疑問
