天天看點

了解分布式一緻性:Paxos協定之Generalized Paxos & Byzantine Paxos

了解分布式一緻性:Paxos協定之Generalized Paxos & Byzantine Paxos

  • Generalized Paxos
  • Byzantine Paxos
    • Byzantine Multi-Paxos
    • Fast Byzantine Multi-Paxos

在前面一篇文章我們講到了了解分布式一緻性:Paxos協定之Cheap Paxos & Fast Paxos,本篇文章我會講解Paxos協定的另外兩個變種:Generalized Paxos和Byzantine Paxos。

我們大家都知道,分布式一緻性的最大問題就是資料同步的問題,而産生問題的原因就是沖突,按照之前講到的各種Paxos協定方案,發生了沖突之後就必須解決沖突然後重新發送請求,這樣就會提高資料同步的成本和時間,那麼有沒有更好的方式來解決這個問題呢?

答案肯定是有。在分布式系統中,沖突是不可避免的,遇到沖突的時候是不是每次都解決沖突然後重新發送請求呢?我們舉個例子:

如果Client1發送請求ReadA,Client2 發送請求ReadB,系統4個Acceptors,有2個接收ReadA,有2個接收ReadB,在共識層面來說,因為沒有達到最大的共識個數,達不成共識,需要重新發送。但是如果我們仔細觀察一下兩個請求,ReadA,ReadB這兩個指令是沒有任何聯系的,無論先執行哪一個都是同樣的效果。那麼我們可以認為這種情況是沒有沖突的,我們在執行層面自行安排兩個請求的順序,而不用再次共識。 這就叫做Generalized Paxos。

這種共識的前提就是不同指令的先後順序無關。下面以序列圖的形式更加詳細的介紹:

Client1Client2LeaderAcceptor1Acceptor2Acceptor3Learner

Accept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(ReadB)Accept!(ReadB)Accept!(ReadB)Accept!(ReadB)Leader and Acceptor1Accepted(N,<ReadA,ReadB>), Acceptor2and Acceptor3Accepted(N,<ReadB,ReadA>),順序無關,不沖突,最終值Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)Accepted(N,<ReadA,ReadB>)下面是沖突的情況,WriteA和ReadA同時發生,産生沖突時,Leader自行解決沖突,需要重發請求Accept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(ReadA)Accept!(WriteA)Accept!(WriteA)Accept!(WriteA)Accept!(WriteA)Accepted(N,<ReadA,WriteA>)Accepted(N,<ReadA,WriteA>)Accepted(N,<WriteA,ReadA>)Accepted(N,<WriteA,ReadA>)沖突産生,Leader根據協定自行決定執行順序,這裡是<ReadA,WriteA>,N+1Accept!(N+1,<ReadA,WriteA>)Accept!(N+1,<ReadA,WriteA>)Accept!(N+1,<ReadA,WriteA>)Accepted(N+1,<ReadA,WriteA>)Accepted(N+1,<ReadA,WriteA>)Accepted(N+1,<ReadA,WriteA>)Client1Client2LeaderAcceptor1Acceptor2Acceptor3Learner

最後一個我們要講的Paxos協定是Byzantine Paxos。熟悉虛拟貨币的人應該對拜占庭協定并不陌生,這裡我們也不多講拜占庭協定,後面我會用單獨的文章來詳細介紹拜占庭協定。

上面我們講到的所有的Paxos協定,隻講到了服務出錯的情況,并沒有考慮服務僞造篡改資訊的情況,即并沒有考慮到惡意節點。而拜占庭協定就是為了解決這個問題而産生的。

Byzantine Paxos比正常的Paxos協定多了一個消息驗證的過程,這個驗證使用了拜占庭協定。

下面是個Byzantine Multi-Paxos的序列圖:

ClientProposerAcceptor1Acceptor2Acceptor3Learner

RequestAccept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)驗證消息Verify(N,I,V) - BROADCASTVerify(N,I,V) - BROADCASTVerify(N,I,V) - BROADCASTVerify(N,I,V) - BROADCASTAccepted(N,V)Accepted(N,V)Accepted(N,V)Accepted(N,V)Accepted(N,V)Accepted(N,V)Response(V)ClientProposerAcceptor1Acceptor2Acceptor3Learner

同樣的也會有Fast Byzantine Multi-Paxos,為了更加Fast,本協定将Verify和Accepted進行融合,放在一步完成。

ClientAcceptor1Acceptor2Acceptor3Learner

Accept!(N,I,V)Accept!(N,I,V)Accept!(N,I,V)驗證消息,同時AcceptedAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTAccepted(N,I,V) - BROADCASTResponse(V)ClientAcceptor1Acceptor2Acceptor3Learner

更多教程請參考flydean的部落格

繼續閱讀