raft算法与paxos算法相比有什么优势,使用场景有什么差异?
Raft協(xié)議比paxos的優(yōu)點(diǎn)是 容易理解,容易實(shí)現(xiàn)。它強(qiáng)化了leader的地位,把整個(gè)協(xié)議可以清楚的分割成兩個(gè)部分,并利用日志的連續(xù)性做了一些簡(jiǎn)化:(1)Leader在時(shí)。由Leader向Follower同步日志(2)Leader掛掉了,選一個(gè)新Leader,Leader選舉算法。
但是本質(zhì)上來(lái)說(shuō),它容易的地方在于流程清晰,描述更清晰,關(guān)鍵之處都給出了偽代碼級(jí)別的描述,可以直接用于實(shí)現(xiàn),而paxos最初的描述是針對(duì)非常理論的一致性問(wèn)題,真正能應(yīng)用于工程實(shí)現(xiàn)的mulit-paxos,Lamport老爺爺就提了個(gè)大概,之后也有人嘗試對(duì)multi-paxos做出更為完整詳細(xì)的描述,但是每個(gè)人描述的都不大一樣。
Zookeeper的ZAB,Viewstamped Replication(VR),raft,multi-paxos,這些都可以被稱之為L(zhǎng)eader-based一致性協(xié)議。不同的是,multi-paxos leader是作為對(duì)經(jīng)典paxos的優(yōu)化而提出,通過(guò)選擇一個(gè)proposer作為leader降低多個(gè)proposer引起沖突的頻率,合并階段一從而將一次決議的平均消息代價(jià)縮小到最優(yōu)的兩次,實(shí)際上就算有多個(gè)leader存在,算法還是安全的,只是退化為經(jīng)典的paxos算法。而經(jīng)典的paxos,從一個(gè)提案被提出到被接受分為兩個(gè)階段,第一個(gè)階段去詢問(wèn)值,第二階段根據(jù)詢問(wèn)的結(jié)果提出值。這兩個(gè)階段是無(wú)法分割的,兩個(gè)階段的每個(gè)細(xì)節(jié)都是精心設(shè)計(jì)的,相互關(guān)聯(lián),共同保障了協(xié)議的一致性。而VR,ZAB,Raft這些強(qiáng)調(diào)合法leader的唯一性協(xié)議,它們直接從leader的角度描述協(xié)議的流程,也從leader的角度出發(fā)論證正確性。但是實(shí)際上它們使用了和Paxos完全一樣的原理來(lái)保證協(xié)議的安全性,當(dāng)同時(shí)存在多個(gè)節(jié)點(diǎn)同時(shí)嘗試成為leader或者不知一個(gè)節(jié)點(diǎn)認(rèn)為自己時(shí)leader時(shí),本質(zhì)上它們和經(jīng)典Paxos中多個(gè)proposer并存的情形沒(méi)什么不同。
Paxos和raft都是一旦一個(gè)entries(raft協(xié)議叫日志,paxos叫提案,叫法而已)得到多數(shù)派的贊成,這個(gè)entries就會(huì)定下來(lái),不丟失,值不更改,最終所有節(jié)點(diǎn)都會(huì)贊成它。Paxos中稱為提案被決定,Raft,ZAB,VR稱為日志被提交,這只是說(shuō)法問(wèn)題。一個(gè)日志一旦被提交(或者決定),就不會(huì)丟失,也不可能更改,這一點(diǎn)這4個(gè)協(xié)議都是一致的。Multi-paxos和Raft都用一個(gè)數(shù)字來(lái)標(biāo)識(shí)leader的合法性,multi-paxos中叫proposer-id,Raft叫term,意義是一樣的,multi-paxos proposer-id最大的Leader提出的決議才是有效的,raft協(xié)議中term最大的leader才是合法的。實(shí)際上raft協(xié)議在leader選舉階段,由于老leader可能也還存活,也會(huì)存在不只一個(gè)leader的情形,只是不存在term一樣的兩個(gè)leader,因?yàn)檫x舉算法要求leader得到同一個(gè)term的多數(shù)派的同意,同時(shí)贊同的成員會(huì)承諾不接受term更小的任何消息。這樣可以根據(jù)term大小來(lái)區(qū)分誰(shuí)是合法的leader。Multi-paxos的區(qū)分leader的合法性策略其實(shí)是一樣的,誰(shuí)的proproser-id大誰(shuí)合法,而proposer-id是唯一的。因此它們其實(shí)在同一個(gè)時(shí)刻,都只會(huì)存在一個(gè)合法的leader。同時(shí)raft協(xié)議的Leader選舉算法,新選舉出的Leader已經(jīng)擁有全部的可以被提交的日志,而multi-paxos擇不需要保證這一點(diǎn),這也意味multi-paxos需要額外的流程從其它節(jié)點(diǎn)獲取已經(jīng)被提交的日志。因此raft協(xié)議日志可以簡(jiǎn)單的只從leader流向follower在raft協(xié)議中,而multi-paxos則需要額外的流程補(bǔ)全已提交的日志。需要注意的是日志可以被提交和日志已經(jīng)被提交是兩個(gè)概念,它們的區(qū)別就像是我前方有塊石頭和我得知我前方有塊石頭。但是實(shí)際上,Raft和multi-Paxos一旦日志可以被提交,就能會(huì)保證不丟失,multi-paxos天然保證了這一點(diǎn),這也是為什么新leader對(duì)于尚未被確認(rèn)已經(jīng)提交的日志需要重新執(zhí)行經(jīng)典paxos的階段一,來(lái)補(bǔ)全可能缺失的已經(jīng)被提交的日志,Raft協(xié)議通過(guò)強(qiáng)制新Leader首先提交一個(gè)本term的no-op 日志,配合前面提到的Leader選舉算法所保證的性質(zhì),確保了這一點(diǎn)。一條日志一旦被多數(shù)派的節(jié)點(diǎn)寫入本地日志文件中,就可以被提交,但是leader只有得知這一點(diǎn)后,才會(huì)真正commit這條日志,此時(shí)日志才是已經(jīng)被提交的。
Raft協(xié)議強(qiáng)調(diào)日志的連續(xù)性,multi-paxos則允許日志有空洞。日志的連續(xù)性蘊(yùn)含了這樣一條性質(zhì):如果兩個(gè)不同節(jié)點(diǎn)上相同序號(hào)的日志,只要term相同,那么這兩條日志必然相同,且這和這之前的日志必然也相同的,這使得leader想follower同步日志時(shí),比對(duì)日志非常的快速和方便;同時(shí)Raft協(xié)議中日志的commit(提交)也是連續(xù)的,一條日志被提交,代表這條日志之前所有的日志都已被提交,一條日志可以被提交,代表之前所有的日志都可以被提交。日志的連續(xù)性使得Raft協(xié)議中,知道一個(gè)節(jié)點(diǎn)的日志情況非常簡(jiǎn)單,只需要獲取它最后一條日志的序號(hào)和term。可以舉個(gè)列子,A,B,C三臺(tái)機(jī)器,C是Leader,term是3,A告訴C它們最后一個(gè)日志的序列號(hào)都是4,term都是3,那么C就知道A肯定有序列號(hào)為1,2,3,4的日志,而且和C中的序列號(hào)為1,2,3,4的日志一樣,這是raft協(xié)議日志的連續(xù)性所強(qiáng)調(diào)的,好了那么Leader知道日志1,2,3,4已經(jīng)被多數(shù)派(A,C)擁有了,可以提交了。同時(shí),這也保證raft協(xié)議在leader選舉的時(shí)候,一個(gè)多數(shù)派里必然存在一個(gè)節(jié)點(diǎn)擁有全部的已提交的日志,這是由于最后一條被commit的日志,至少被多數(shù)派記錄,而由于日志的連續(xù)性,擁有最后一條commit的日志也就意味著擁有全部的commit日志,即至少有一個(gè)多數(shù)派擁有所有已commit的日志。并且只需要從一個(gè)多數(shù)集中選擇最后出最后一條日志term最大且序號(hào)最大的節(jié)點(diǎn)作為leader,新leader必定是擁有全部已commit的日志(關(guān)于這一點(diǎn)的論證,可以通過(guò)反證法思考一下,多數(shù)集中節(jié)點(diǎn)A擁有最后一條已commit的日志,但是B沒(méi)有,而B(niǎo)當(dāng)選leader。根據(jù)選主的法則只能有兩種可能(1)當(dāng)選而A最后一條日志的term小于B;(2)A最后一條日志的term等于B,但是A的日志少于B。1,2可能嘛?)而對(duì)于multi-paxos來(lái)說(shuō),日志是有空洞的,每個(gè)日志需要單獨(dú)被確認(rèn)是否可以commit,也可以單獨(dú)commit。因此當(dāng)新leader產(chǎn)生后,它只好重新對(duì)每個(gè)未提交的日志進(jìn)行確認(rèn),已確定它們是否可以被commit,甚至于新leader可能缺失可以被提交的日志,需要通過(guò)Paxos階段一向其它節(jié)點(diǎn)學(xué)習(xí)到缺失的可以被提交的日志,當(dāng)然這都可以通過(guò)向一個(gè)多數(shù)派詢問(wèn)完成(這個(gè)流程存在著很大的優(yōu)化空間,例如可以將這個(gè)流程合并到leader選舉階段,可以將所有日志的確認(rèn)和學(xué)習(xí)合并到一輪消息中,減少消息數(shù)目等)。但是無(wú)論是Raft還是multi-paxos,新leader對(duì)于那些未提交的日志,都需要重新提交,不能隨意覆寫,因?yàn)閮烧叨紵o(wú)法判定這些未提交的日志是否已經(jīng)被之前的leader提交了。所以本質(zhì)上,兩者是一樣的。一個(gè)日志被多數(shù)派擁有,那么它就可以被提交,但是Leader需要通過(guò)某種方式得知這一點(diǎn),同時(shí)為了已經(jīng)被提交的日志不被新leader覆寫,新leader需要擁有所有已經(jīng)被提交的日志(或者說(shuō)可以被提交,因?yàn)橛袝r(shí)候并沒(méi)有辦法得知一條可以被提交的日志是否已經(jīng)被提交,例如當(dāng)只有老leader提交了該日志,并返回客戶端成功,然而老leader掛了),之后才能正常工作,并且需要重新提交所有未commit的日志。兩者的區(qū)別在于Leader確認(rèn)提交和獲取所有可以被提交日志的方式上,而方式上的區(qū)別又是由于是日志是否連續(xù)造成的,Raft協(xié)議利用日志連續(xù)性,簡(jiǎn)化了這個(gè)過(guò)程。
在Raft和multi-paxos協(xié)議確保安全性的原理上,更進(jìn)一步的說(shuō),所有的凡是 滿足 集群中存活的節(jié)點(diǎn)數(shù)還能構(gòu)成一個(gè)多數(shù)派,一致性就能滿足的算法,raft協(xié)議,paxos,zab,viewstamp都是利用了同一個(gè)性質(zhì):兩個(gè)多數(shù)派集合之間存在一個(gè)公共成員。對(duì)于一致性協(xié)議來(lái)說(shuō),一旦一個(gè)變量的值被確定,那么這個(gè)變量的值應(yīng)該是唯一的,不再更改的。Raft,paoxos等協(xié)議,對(duì)于一個(gè)變量v來(lái)說(shuō),一個(gè)由節(jié)點(diǎn)n1提出的值a只有被一個(gè)多數(shù)集q1認(rèn)可并記錄后,才會(huì)正式令v=a,如果另一個(gè)節(jié)點(diǎn)n2想要修改變量v的值為b,也需要一個(gè)多數(shù)集q2的認(rèn)可,而q1和q2必然至少有一個(gè)共同的成員p,節(jié)點(diǎn)p已經(jīng)記錄了v=a。因此只需要通過(guò)增加一些約束,讓p能夠告訴節(jié)點(diǎn)n2這個(gè)事實(shí):v=a,使得n2放棄自己的提議,或者讓節(jié)點(diǎn)p拒絕節(jié)點(diǎn)n2想要賦予v的值為b這個(gè)行為,都可以確保變量v的一致性不被破壞。這個(gè)思想對(duì)于這個(gè)四個(gè)協(xié)議來(lái)說(shuō)都是一樣的,4個(gè)協(xié)議都使用一個(gè)唯一的整數(shù)作為標(biāo)識(shí)符來(lái)標(biāo)明leader的合法性,paxos叫做proposer-id,ZAB叫epoch,VR叫view,raft叫term。把leader看做是想要賦予變量v某個(gè)值的節(jié)點(diǎn)n1,n2,上面提到的情形中,如果n2是目前的合法leader,那么n2需要知道v=a這個(gè)事實(shí),對(duì)于raft來(lái)說(shuō)就是選擇n2是已經(jīng)記錄了v=a的節(jié)點(diǎn),對(duì)于multi-paxos來(lái)說(shuō),就是重新確認(rèn)下v的值。如果n1是目前的合法leader,n2是老的leader,p就會(huì)根據(jù)leader的標(biāo)識(shí)符拒絕掉n2的提案,n2的提案會(huì)由于得不到一個(gè)多數(shù)派的接受而失效。最直接的從理論上闡明這個(gè)原理的是經(jīng)典的paxos算法,關(guān)于這個(gè)原理更具體的闡述可以看看我在如何淺顯易懂地解說(shuō) Paxos 的算法?下的回答。所以確實(shí)在一定程度上可以視r(shí)aft,ZAB,VR都是paxos算法的一種改進(jìn),一種簡(jiǎn)化,一種優(yōu)化,一種具象化。Lamport老人家還是最具思想和代表的,不過(guò)值得一提的是,ZAB和raft作者確實(shí)是受了paxos很多啟發(fā),VR是幾乎同時(shí)獨(dú)立于paxos提出的。
Raft容易實(shí)現(xiàn)在于它的描述是非常規(guī)范的,包括了所有的實(shí)現(xiàn)細(xì)節(jié)。如上面的人說(shuō)的有如偽代碼。而paxos的描述側(cè)重于理論,工程實(shí)現(xiàn)按照谷歌chubby論文中的說(shuō)話,大家從paxos出現(xiàn),寫著寫著,處理了n多實(shí)際中的細(xì)節(jié)之后,已經(jīng)變成另外一個(gè)算法了,這時(shí)候正確性已經(jīng)無(wú)法得到理論的保證。所以它的實(shí)現(xiàn)非常難,因?yàn)橐恢滦詤f(xié)議實(shí)非常精妙的。小細(xì)節(jié)上沒(méi)考慮好,整個(gè)協(xié)議的一致性就崩潰了,而發(fā)現(xiàn)并更正細(xì)節(jié)上的錯(cuò)誤在沒(méi)有詳盡的現(xiàn)成的參考的情況下是困難的,這需要對(duì)協(xié)議很深的理解。而且在Raft協(xié)議的博士論文CONSENSUS: BRIDGING THEORY AND PRACTICE,兩位作者手把手事無(wú)巨細(xì)的教你如何用raft協(xié)議構(gòu)建一個(gè)復(fù)制狀態(tài)機(jī)。我表示智商正常的大學(xué)生,都能看懂。我相信在未來(lái)一致性現(xiàn)在被提起來(lái),肯定不是現(xiàn)在這樣,大部分人覺(jué)得好難啊,實(shí)現(xiàn)更難。但是未來(lái)其應(yīng)該會(huì)成為一種常用技術(shù)。
總結(jié)
以上是生活随笔為你收集整理的raft算法与paxos算法相比有什么优势,使用场景有什么差异?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Flash 3.6如何利用遮罩打造照片焦
- 下一篇: session 和cookie的理解