分布式架構(gòu)中的共識(shí)機(jī)制——Redis-RAFT

在RAFT算法中,有三個(gè)角色

  • follower(跟隨者)
  • candidate(候選人)
  • leader(領(lǐng)導(dǎo)者)
    這類共識(shí)算法的核心點(diǎn)在于少數(shù)服從多數(shù),當(dāng)集群中不存在leader的時(shí)候,可以用上面說到的最簡(jiǎn)單的辦法隨機(jī)指定。在RAFT算法中,每個(gè)redis節(jié)點(diǎn)上都有一個(gè)計(jì)時(shí)器,它們的計(jì)時(shí)時(shí)間就是隨機(jī)生成的(50ms-150ms),集群中的redis nodes各自生成一個(gè)計(jì)時(shí)器。
    初始狀態(tài)

    開始倒計(jì)時(shí),第一個(gè)到期的redis從follower變成candidate,開始像其他節(jié)點(diǎn)發(fā)送競(jìng)選消息,先到先得,第一任leader就這樣產(chǎn)生了。每個(gè)redis節(jié)點(diǎn)都維護(hù)了一個(gè)變量term,但一個(gè)redis從follower變成candidate后,它會(huì)將自己本地的term+1,同時(shí)把+1后的term發(fā)給其他節(jié)點(diǎn)。
    candidate發(fā)送競(jìng)選消息

    當(dāng)follower收到了一個(gè)競(jìng)選消息,它會(huì)拿自己的term和message中的term進(jìn)行比較,如果自身term小于message的term,則接受candidate為leader。follower會(huì)以response的形式告訴candidate,競(jìng)選成功的消息。當(dāng)投票過半數(shù)(包括candidate自己的一票),candidate正式競(jìng)選成功。一旦第一輪競(jìng)選完成,意味著系統(tǒng)達(dá)到穩(wěn)態(tài)。
followers返回競(jìng)選結(jié)果

接下來在集群運(yùn)行過程中,leader會(huì)在cluster-node-timeout(?)時(shí)間內(nèi)發(fā)送心跳檢測(cè)到各個(gè)followers,表明自己仍然存活。如果leader因?yàn)榫W(wǎng)絡(luò)原因或內(nèi)部原因掛了。此時(shí)余下followers會(huì)再次發(fā)起選舉。選舉過程和上面描述的一樣。


重新發(fā)生選舉

看到這里可能出現(xiàn)一個(gè)問題,如果新一次選舉完成,但是原始的leader又恢復(fù)了,對(duì)于整個(gè)集群來說,豈不是出現(xiàn)了兩個(gè)leader。這就是通常所說的腦裂現(xiàn)象。對(duì)于這種情況redis提供了兩個(gè)配置:

min-slaves-to-write:主節(jié)點(diǎn)可以寫入的最少從節(jié)點(diǎn)數(shù)
min-slaves-max-lag:主從進(jìn)行數(shù)據(jù)復(fù)制時(shí),從庫給主庫發(fā)送ACK消息的最大延遲秒數(shù)。

它意味著一旦leader可以寫入的followers數(shù)目小于min-slaves-to-write或者follower返回給leader復(fù)制的ack消息超過了min-slaves-max-lag時(shí),當(dāng)前l(fā)eader不能寫入。這樣即便原始leader還能功能,也無法繼續(xù)接收客戶端的寫入請(qǐng)求,對(duì)于整個(gè)集群來說,還是只有一個(gè)leader在對(duì)外工作。

?著作權(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ù)。

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

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