分布式Raft算法介紹

? ? ?高可用性,高穩(wěn)定性以及數(shù)據(jù)一致性是衡量服務(wù)的三個(gè)基本要素。其中數(shù)據(jù)一致性在分布式服務(wù)中是根基----不管是強(qiáng)一致性還是最終一致性等都需要保證其數(shù)據(jù)的一致性,不然高可用和高穩(wěn)定沒(méi)有任何意義(即便服務(wù)容忍一定時(shí)延的不一致)。

? ? ?分布式一致性的保證:

? ? ?數(shù)據(jù)保證一致性主要是這兩種形式:一種是集群只有一個(gè)節(jié)點(diǎn)能進(jìn)行數(shù)據(jù)的增刪改,然后其它節(jié)點(diǎn)和單前節(jié)點(diǎn)進(jìn)行同步數(shù)據(jù)。第二種就是集群節(jié)點(diǎn)通過(guò)溝通下在合適的時(shí)間大家一起進(jìn)行數(shù)據(jù)的增刪改數(shù)據(jù)來(lái)達(dá)到數(shù)據(jù)一致性。這兩種方式細(xì)想下它們都需要有一個(gè)發(fā)起人,由發(fā)起人開(kāi)個(gè)頭然后集群開(kāi)始數(shù)據(jù)的同步操作,這個(gè)發(fā)起人也就成為leader。

? ? ?如何選leader比如:

? ? ?方式一 :大家都讀數(shù)據(jù)庫(kù)然后讀取時(shí)增加讀鎖,誰(shuí)獲取了值就是leader,這種方式在獲取鎖時(shí)需要連接數(shù)據(jù)庫(kù),執(zhí)行查詢操作,增加鎖,執(zhí)行完操作后釋放鎖,同時(shí)還有單點(diǎn)問(wèn)題,性能瓶頸,通過(guò)這種方式提供的鎖服務(wù)無(wú)法滿足需求,同時(shí)獲取了鎖的節(jié)點(diǎn)如果掛了呢? 或者獲取鎖的節(jié)點(diǎn)在腦裂網(wǎng)絡(luò)區(qū)間呢?? ?這種方式選取leader不合適。

? ? ?方式二:由一臺(tái)服務(wù)器與所有機(jī)器保持心跳,當(dāng)需要選擇leader時(shí) 就在其中隨機(jī)選擇一臺(tái),同時(shí)通知所有的,如果超過(guò)半數(shù)同意就成功了。問(wèn)題關(guān)鍵是一臺(tái)服務(wù)器和所有機(jī)器保持心跳,為了提高高可用性增加備用機(jī)器,在這臺(tái)機(jī)器掛掉后,備用機(jī)器需要和所有機(jī)器建立連接,為了提高速度,使用熱備,master和熱備也用心跳保持關(guān)系,一旦掛掉,就接過(guò)master的權(quán)限,執(zhí)行其職能,同時(shí)客戶機(jī)的配置中需要增加關(guān)于這兩臺(tái)機(jī)器的配置,方便為其創(chuàng)建連接,同時(shí)檢測(cè)連接是否正常,這種方式就算出現(xiàn)腦裂問(wèn)題也不影響,一切以連接到master機(jī)器上的所有節(jié)點(diǎn)為準(zhǔn)。

? ? 方式三:集群中每個(gè)節(jié)點(diǎn)與其余所有節(jié)點(diǎn)共同商量誰(shuí)來(lái)當(dāng)leader。

? ? 目前業(yè)界使用的不管是Paxos還是Raft算法以及它們的變種算法都是采用方式三來(lái)進(jìn)行l(wèi)eader選舉。方式二有點(diǎn)資源浪費(fèi),但是按照常理來(lái)講參與決策方越多效率越低,方式二卻是避免了這種方式(暫時(shí)用不上)。

? ? ?Raft算法由于其容易理解和實(shí)現(xiàn)等原因開(kāi)始在后期大受歡迎比如:etcd就是基于此實(shí)現(xiàn)的,而大名鼎鼎的Kubernetes是基于etcd實(shí)現(xiàn)的(間接基于Raft),以及百度的braft(raft變種)。

? ? ?Raft算法實(shí)現(xiàn)一致性通過(guò)實(shí)現(xiàn)下面:

? ? ? 》選擇leader----這個(gè)是用來(lái)保證其是第一個(gè)執(zhí)行操作的,保證獨(dú)立性,不會(huì)在別的節(jié)點(diǎn)同時(shí)出現(xiàn)別的操作。

? ? ? 》日志復(fù)制----這是leader節(jié)點(diǎn)執(zhí)行操作產(chǎn)生的操作日志,用來(lái)和leader節(jié)點(diǎn)保存一致,這是選舉leader的原因,然后把日志復(fù)制到其余節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)執(zhí)行成功以后就可以保證和leader節(jié)點(diǎn)保證一致了,這和傳統(tǒng)的2pc(2 phase commit 2階段提交) 優(yōu)勢(shì)在于---2pc在整個(gè)過(guò)程中是hold全部資源的,需要全部節(jié)點(diǎn)執(zhí)行成功后才能釋放而這個(gè)只需要leader節(jié)點(diǎn)執(zhí)行成功,然后保存到日志并復(fù)制到別的節(jié)點(diǎn)后就可以了,其余節(jié)點(diǎn)什么時(shí)候執(zhí)行,自有各個(gè)節(jié)點(diǎn)來(lái)保證日志的執(zhí)行, 在leader任期內(nèi)執(zhí)行別的操作時(shí)必須 上一個(gè)執(zhí)行的操作的log的日志已經(jīng)分發(fā)到別的所有大部分節(jié)點(diǎn)了,不需要執(zhí)行,只需要保存,后期執(zhí)行就可以。

? ? ?Raft這種算法選舉時(shí)對(duì)性能有一定影響,不僅是Raft,其余的選舉算法,隨著節(jié)點(diǎn)的增加,選舉的效率就越低,比如etcd就是建議部署3或5個(gè)節(jié)點(diǎn)就可以。如果需要大規(guī)模選舉可以采用上面的方式二。(這就好比股票的撮合交易競(jìng)價(jià)或者是區(qū)塊鏈中有比特幣的公共鏈到聯(lián)盟鏈等轉(zhuǎn)換)。

? ? ?問(wèn)題:

? ? ? 選舉時(shí)如何得知其獲得了大多數(shù)選票,節(jié)點(diǎn)是會(huì)掛的,會(huì)隨時(shí)變化:

? ? ? 當(dāng)前節(jié)點(diǎn)參加選舉時(shí)會(huì)和其余節(jié)點(diǎn)通訊,如果在通訊的大多數(shù)節(jié)點(diǎn)都同意,那就ok,那問(wèn)題又來(lái)了,如何保障能和其它節(jié)點(diǎn)都能通訊? 這個(gè)除非節(jié)點(diǎn)掛掉,如果在投后節(jié)點(diǎn)掛掉了也不影響,因?yàn)橹荒芡督o一個(gè)節(jié)點(diǎn)不能再投別的節(jié)點(diǎn),投票前掛掉不沒(méi)有影響。還有一種就是腦裂問(wèn)題,這可能會(huì)在不同區(qū)域都選舉一個(gè)區(qū)域的leader,對(duì)于腦裂問(wèn)題 可以人工干預(yù)或者定時(shí)檢查,對(duì)于腦裂區(qū)域是否不提供服務(wù)或者提供部分服務(wù)這個(gè)依據(jù)具體業(yè)務(wù)場(chǎng)景來(lái)。

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

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