Raft一致性協(xié)議

引子

通過思考幾個(gè)問題來深入理解raft協(xié)議

Quorum

Q1:假設(shè)我們允許2個(gè)錯(cuò)誤節(jié)點(diǎn)的話,最少需要部署幾個(gè)節(jié)點(diǎn)?為什么4個(gè)節(jié)點(diǎn)不可以?

假設(shè)容忍2個(gè)錯(cuò)誤,部署4個(gè)地方,因?yàn)槟闳萑?個(gè)錯(cuò)誤,所以至少需要確認(rèn)3個(gè)地方已經(jīng)記錄了一筆交易,我們就假設(shè)A B C D四個(gè)地方吧,A B C都記錄了這筆交易,D也許落后一些,沒關(guān)系。然后A B發(fā)生錯(cuò)誤掛掉了,此時(shí)沒有關(guān)系,因?yàn)镃還保持正確的記錄,系統(tǒng)還是可以工作的。過了一會A B都重新起來了,注意這個(gè)時(shí)候C D需要把記錄同步到A和B,但是此時(shí)如果C和D都發(fā)生錯(cuò)誤掛掉了(系統(tǒng)還是容忍兩個(gè)錯(cuò)誤,因?yàn)锳 B已經(jīng)起來了),A和B拿不到正確的記錄,所以整個(gè)系統(tǒng)是不能工作的。

所以這個(gè)時(shí)候我們需要E,并且C D E都必須保持正確的記錄,這樣即使他們其中的兩個(gè)掛掉了,我們也可以確保正確的記錄不會丟掉,所以容忍兩個(gè)錯(cuò)誤需要5個(gè)地方,并且最少有3個(gè)地方確認(rèn)一筆交易就OK。

安全性

Q2:raft的日志復(fù)制是單向的(從leader到followers),那么如何保證新選出來的leader擁有所有已經(jīng)committed的log?

競選者想要當(dāng)選leader的話必須聯(lián)系集群中的大多數(shù)節(jié)點(diǎn),以便能獲得大多數(shù)的選票,那么就意味著這些節(jié)點(diǎn)(大多數(shù)節(jié)點(diǎn))中必然至少有一個(gè)節(jié)點(diǎn)擁有最新的已經(jīng)committed的log。這樣只要保證競選者的log至少和,所有這些節(jié)點(diǎn)的每一個(gè)log,都up-to-date,那么競選者肯定就擁有已經(jīng)committed的所有l(wèi)og。raft通過在投票的過程中限定只有你的log至少比我新,我才投票給你,這樣就能達(dá)到上述的要求。

工程化

Q3:raft是如何處理線性只讀請求的呢?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容