Paxos、Raft不是一致性算法/協(xié)議?
作為互聯(lián)網(wǎng)中的一員,我們時(shí)常沉浸在“分布式”的氛圍當(dāng)中——高可用、高可靠、高性能等等詞匯隨處可見,CAP、BASE、2PC、Paxos、Raft等等名詞也能信手捏來(lái)。不過,有些詞在我們“并不嚴(yán)謹(jǐn)”的傳播中逐漸被誤用了,或者說含糊不清了。今天,我們來(lái)簡(jiǎn)單聊聊“Consistency”這個(gè)詞,即一致性。
Paxos、Raft等通常被誤稱為“一致性算法”。但是“一致性(Consistency)”和“共識(shí)(Consensus)”并不是同一個(gè)概念。Paxos、Raft等其實(shí)都是共識(shí)(Consensus)算法。
Leslie Lamport于1998年在ACM Transactions on Computer Systems上發(fā)表了一篇《The Part-Time Parliament》[1]的文章,這是Paxos算法第一次公開發(fā)表。但是發(fā)表之后,很多人還是覺得原來(lái)那篇太難理解了,之后Lamport又寫了一篇《Paxos Made Simple》[2],當(dāng)我們想要學(xué)習(xí)一下Paxos的時(shí)候,可以直接看看這篇。
回到正題,我們?cè)凇禤axos Made Simple》中搜索“Consistency”一詞,如下圖所示,其實(shí)是毫無(wú)匹配結(jié)果的。
反觀,我們搜索“Consensus”一詞的時(shí)候,卻出現(xiàn)了很多匹配項(xiàng)。
也就是說,Paxos論文通篇提都沒提Consistency一詞,何來(lái)的“Paxos is a consistency algorithm”的說法。
與此類似的是,在Raft論文《In Search of an Understandable Consensus Algorithm (Extended Version)》[3]中開頭就對(duì)Raft給出了明確的定義:Raft is a consensus algorithm....,注意這里是consensus,而不是consistency。
這時(shí)候我們不妨再打開字典。乍眼一看,字典中Consistency和Consenus譯意接近,都有“一致”的含義,但是仔細(xì)深究又有所不同:Consistency:一致性,Consensus:共識(shí)、一致的意見。
從專業(yè)的角度來(lái)講,我們通常所說的一致性(Consistency)在分布式系統(tǒng)中指的是對(duì)于同一個(gè)數(shù)據(jù)的多個(gè)副本,其對(duì)外表現(xiàn)的數(shù)據(jù)一致性,如強(qiáng)一致性、順序一致性、最終一致性等,都是用來(lái)描述副本問題中的一致性的。而共識(shí)(Consensus)則不同,簡(jiǎn)單來(lái)說,共識(shí)問題是要經(jīng)過某種算法使多個(gè)節(jié)點(diǎn)達(dá)成相同狀態(tài)的一個(gè)過程。一致性強(qiáng)調(diào)結(jié)果,共識(shí)強(qiáng)調(diào)過程。
《分布式系統(tǒng)概念與設(shè)計(jì)》一書中對(duì)共識(shí)問題進(jìn)行了如下定義:為達(dá)到共識(shí),每個(gè)進(jìn)程 pi 最初處于未決(undecided)狀態(tài),并且提議集合D中的一個(gè)值 vi 。進(jìn)程之間互相通信,交換值。然后,每個(gè)進(jìn)程設(shè)置一個(gè)決定變量(decision variable)di 的值。在這種情況下,它進(jìn)入決定(decided)狀態(tài)。在此狀態(tài)下,他不再改變di。
下圖中給出了參與一個(gè)共識(shí)算法的3個(gè)進(jìn)程。兩個(gè)進(jìn)程提議“繼續(xù)”, 第三個(gè)進(jìn)程提議“放棄”但隨后崩潰。保持正確的兩個(gè)進(jìn)程都決定“繼續(xù)”。(其中i = 1, 2, ……, N; j = 1, 2, ……, N。)
共識(shí)算法的要求是在每次執(zhí)行中滿足以下條件:
- 終止性:每個(gè)正確進(jìn)程最終設(shè)置它的決定變量。
- 協(xié)定性:所有正確進(jìn)程的決定值都相同,即如果 pi 和 pj 是正確的并且已進(jìn)入決定狀態(tài),那么 di = dj。
- 完整性:如果正確的進(jìn)程都提議同一個(gè)值,那么處于決定狀態(tài)的任何正確進(jìn)程已選擇了該值。
共識(shí)問題中所有的節(jié)點(diǎn)要最終達(dá)成共識(shí),由于最終目標(biāo)是所有節(jié)點(diǎn)都要達(dá)成一致,所以根本不存在一致性強(qiáng)弱之分。所以,以后我們看到“Paxos是一個(gè)強(qiáng)一致性算法”、“Raft是一個(gè)強(qiáng)一致性協(xié)議”等類似說法的時(shí)候,我們更要以一種“審視”的眼光去看待后面的內(nèi)容。
在我們大多數(shù)人的大多數(shù)工作內(nèi)容中,一致性(Consistency)與共識(shí)(Consensus)的差別其實(shí)無(wú)關(guān)痛癢。但是如果我們想抬高一個(gè)維度,深入的去研究一下分布式領(lǐng)域的內(nèi)容,那么這些最基礎(chǔ)的概念如果區(qū)分不清楚的話,會(huì)對(duì)后面的學(xué)習(xí)過程產(chǎn)生很大的阻礙。
越是相近的詞匯,越要清楚的區(qū)分。就算是同一個(gè)單詞,也會(huì)有不同的含義解析,比如CAP和ACID中的C都是Consistency的縮寫,但這兩者在各自場(chǎng)景下的含義也并不相同。
- ACID的C指的是事務(wù)中的一致性,在一系列對(duì)數(shù)據(jù)修改的操作中,保證數(shù)據(jù)的正確性。即數(shù)據(jù)在事務(wù)期間的多個(gè)操作中,數(shù)據(jù)不會(huì)憑空的消失或增加,數(shù)據(jù)的每一個(gè)增刪改操作都是有因果關(guān)系的。比如用戶A向用戶B轉(zhuǎn)了200塊錢,不會(huì)出現(xiàn)用戶A扣了款,而用戶B沒有收到的情況。
- 在分布式環(huán)境中,多服務(wù)之間的復(fù)制是異步,需要一定耗時(shí),不會(huì)瞬間完成。在某個(gè)服務(wù)節(jié)點(diǎn)的數(shù)據(jù)修改之后,到同步到其它服務(wù)節(jié)點(diǎn)之間存在一定的時(shí)間間隔,如果在這個(gè)間隔內(nèi)有并發(fā)讀請(qǐng)求過來(lái),而這些請(qǐng)求又負(fù)載均衡到多個(gè)節(jié)點(diǎn),可能會(huì)出現(xiàn)從多個(gè)節(jié)點(diǎn)數(shù)據(jù)不一致的情況,因?yàn)檎?qǐng)求有可能會(huì)落到還沒完成數(shù)據(jù)同步的節(jié)點(diǎn)上。CAP中的C就是為了做到在分布式環(huán)境中讀取的數(shù)據(jù)是一致的。
總的來(lái)說,ACID的C著重強(qiáng)調(diào)單數(shù)據(jù)庫(kù)事務(wù)操作時(shí),要保證數(shù)據(jù)的完整和正確性,而CAP理論中的C強(qiáng)調(diào)的是對(duì)一個(gè)數(shù)據(jù)多個(gè)備份的讀寫一致性。
對(duì)于今天的知識(shí)點(diǎn)有什么想說的嘛?不妨在留言區(qū)留下你的想法。
參考資料http://lamport.azurewebsites.net/pubs/lamport-paxos.pdf
http://lamport.azurewebsites.net/pubs/paxos-simple.pdf
https://raft.github.io/raft.pdf
淺談 CAP 和 Paxos 共識(shí)算法
被誤用的“一致性”
分布式共識(shí)(Consensus):Viewstamped Replication、Raft以及Paxos