古詩詞大全網 - 成語查詢 - 壹致性算法(Paxos、Raft、ZAB)

壹致性算法(Paxos、Raft、ZAB)

壹致性算法(Paxos、Raft、ZAB)

什麽是壹致性

1、弱壹致性

a、最終壹致性

i、DNS(Domain Name System)

j、Gossip(Cassandra的通信協議)

以DNS為例:

2、強壹致性

a、同步

b、Paxos

c、(multi-paxos)

d、ZAB(multi-paxos)

DNS 就是壹種最終壹致性,比如 上圖中 增加壹條記錄: www.hyb.small.com , 我們從其他DNS服務器壹時會讀取不到,但是過壹會就會讀取得到了。

數據不能存在單點上。

分布式系統對fault tolerence的壹般解決方案是state machine replication 。

準確的來說應該是 state machine replication 的***識(consensus)算法。

paxos其實是壹個***識算法,系統的最終壹致性,不僅需要達成***識,還會取決於client的行為

主從同步復制

1、Master 接受寫請求

2、Master 復制日誌到slave

3、Master 等待,直到所有從庫返回

問題:

任何壹個節點失敗,哪怕是從節點(Slave)同步失敗,都會導致整個集群不可用,雖然保證了壹致性,但是可用性卻大大降低

基本想法:

a、多數派:

每次寫都保證寫入大於N/2個節點,每次讀保證從大於N/2個節點中讀。

比如5個節點,每次寫大於3個節點才算成功;讀也是大於3個節點才算成功。

b、多數派還不夠!

在並發環境下,無法保證系統正確性,順序非常重要。比如下圖的 Inc 5; Set 0; 執行順序亂了,結果就會引發錯亂。

Lesile Lamport,Latex的發明者。

為描述Paxos算法,Lamport虛擬了壹個叫做Paxos的希臘城邦,這個島按照議會民主制的政治模式制定法律,但是沒有人願意將自己的全部時間和精力放在這種事上,所以無論是議員、議長或者傳遞消息的時間。

Paxos

1、Basic Paxos

2、Multi Paxos

3、Fast Paxos

強壹致性算法---Basic Paxos

角色介紹:

Client:系統外部角色,請求發起者。像民眾

Propser: 接受Client 請求,向集群提出提議(propose)。並在沖突發生時,起到沖突調節的作用。像議員替民眾提出議案

Accpetor(Voter): 提議投票和接收者,只有在形成法定人數(Quorum,壹般即為majority 多數派)時,提議才會最終接受,像國會。

Learner:提議接受者,backup,備份,對集群壹致性沒什麽影響,像記錄員;

步驟、階段(phases):

1、Phase 1a:Prepare

proposer 提出壹個提案,編號為N,此N 大於這個proposer之前提出提案編號,向acceptors請求同意,要求有quorum接受的才行。

2、Phase 1b:Promise

N 必須大於此acceptor之前接受的任何提案編號,才會接受,否則會拒絕。

3、Phase 2a: Accept

如果達到了多數派,proposer會發出accept請求,此請求包含提案編號N ,以及提案內容。

4、Phase 2b:Accepted

如果此acceptor在此期間沒有收到任何編號大於N的提案,則接受此提案內容,否則忽略。

流程圖如下:

操作步驟如下:

Request;

Prepare(1);

Promise(1,{Va,Vb,Vc});

Accept(1,Vn)

Accepted(1,Vn);

Response;

1、Acceptor部分節點失敗,但達到了Quoroms,此時仍然會成功。

如果有壹個Acceptor因為各種原因掛掉了,3個Acceptors變成了2個Acceptors,還是滿足>n/2 的要求,所以還是會成功。

2、Proposer失敗,上壹次記錄不會被寫入Proposer表,然後重新開啟壹個新的Proposer,來替代上次的Proposer來處理未完成請求,此時編號已經增加為2,也就是Prepare(2)

Basic Paxos when an Proposer fails

如果Proposer 在發送了壹條Accept消息之後,但是還沒收到Accepted消息之前就掛掉了,只有壹個Acceptor接收到了Accept消息。那麽整個Paxos協議就沒法進行下去了,這時壹個新的Leader(Proposer)會被選舉出來,重新開始壹輪新的***識。

Basic Paxos潛在的問題是:活鎖(liveness)或dueling

Basic Paxos很有可能出現這種情況:

1、議員A(proposer A)說我們來討論提案1,大部分議員說:“好,我們來討論提案1”;

2、但是此時議員A還沒有說內容是什麽,這時候又來了壹個議員B,又來說:“我們來討論提案2”;這時候大部分還沒有接受提案1,提案2的編號是大於提案1的,這時候大部分還沒有接受議案2;

3、這時候議員A以為網絡斷了,然後把編號改下,內容不變然後提出議案3;然後議案4、議案5....

這樣就形成了活鎖。

解決活鎖的方法是用Random的timeout,當兩個沖突的時候用壹個隨機的等待時間;當自己提議未生效時,再發起提議等待幾秒。

Basic-Paxos是壹個無限循環的2PC,1條日誌的確認至少需要2個RTT + 2次落盤(1次是prepare的廣播與回復,1次是accept的廣播與回復)。

Basic Paxos when multiple Proposers conflict

最後再描述壹個最復雜的情況,即有多個Proposers認為他們是Leaders,並不斷的發送Prepare請求。為什麽會有多個Leaders呢? 有可能壹個Proposer當了壹段時間Leader之後掛掉了,新的Proposer被選為Leader繼續新的壹輪***識。後面掛掉的Proposer又恢復了,它認為自己還是Leader,所以繼續發送Prepare請求。

Basic Paxos的問題

難實現(角色太多)、效率低(2輪RPC)、活鎖問題

Multi Paxos:

新概念,Leader;唯壹的propser,所有請求都需經過此Leader;

只有壹個Proposer,沒有第二個Proposer; 這個Proposer就是Leader,沒人跟他搶;

再者分布式系統必須串行執行所有提議,否則就會出現前面說的順序問題。

--------First Request(第壹次執行)----------

Request

Prepare(N) //選Leader

Promise(N,I,{Va,Vb,Vc})

Accept!(N,I,Vm)

Accepted(N,I,Vm)

Response;

--------Following Request(第二次或者以後)----------

Request

Accept!(N,I,Vm)

Accepted(N,I,Vm)

Response;

第二次或者以後,就不用再選Leader了 直接執行Request 請求,由Leader 發出議案。

如果Leader 掛了 就選下壹個總統Leader(N+1)

減少角色,進壹步簡化,在Basic-Paxos中我們區分了很多角色,有Clients、Proposers、Acceptors、 Learners,實際上Proposers、Acceptors 、Leanrners可以合並成壹個,統稱為Server,下面是合並之後的序列圖。

Multi-Paxos when roles are collapsed and the leader is steady

同樣的,當Leader很穩定的時候,我們可以在接下來的執行中忽略Phase 1. 如下圖所示:

Raft

1、劃分三個子問題

a、Leader Election

b、Log Replication

c、Safely

2、重定義角色

a、Leader

b、Follower

c、Candidate

原理動畫解釋: /raft

場景測試: /p/6cd41fe0b8f6

強壹致性算法--ZAB

基本與raft相同。在壹些名詞的叫法上有些區別:如ZAB將某壹個leader的周期稱為epoch,而raft則稱為term。實現上也有些許不同:如raft保證日誌連續性,心跳方向為leader至follower,ZAB則相反。