引子
通過思考幾個(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是如何處理線性只讀請求的呢?