1. 程式人生 > >分散式系統一致性演算法

分散式系統一致性演算法

CAP理論

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分割槽容錯性(網路分割槽)Partition tolerance

CAP理論的特點,就是CAP只能滿足其中2條

CA(放棄P):將所有的資料放在一個節點。滿足一致性、可用性。

AP(放棄C):放棄強一致性,用最終一致性來保證。

CP(放棄A):一旦系統遇見故障,受到影響的伺服器需要等待一段時間,在恢復期間無法對外提供服務。

2P理論(two phase commit)

二段提交(RDBMS(傳統關係型資料庫)經常就這種機制,保證強一致性

提交步驟:

階段1:提交事務請求(投票階段,任何一個結點失敗,不能繼續進行提交

階段2:執行事務提交(commit、rollback。任何一個結點失敗 rollback

3P理論(three phase commit)

階段1:是否可以進行事務提交

階段2: 提交事務請求

階段3:執行事務提交

怎麼保證事務一定提交?

事務管理器將,所有資料結點list儲存,迴圈執行操作,設立flag標記狀態。

根據flag狀態,執行操作或回滾。

BASE理論

  • 基本可用(bascially available):在分散式系統出現,允許損失部分可用性(服務降級、頁面降級)
  • 軟狀態(soft state):允許分散式系統出現中間狀態。而且中間狀態不影響系統的可用性。
  • 最終一致性(Eventually consistent):data replications經過一段時間達到一致性。

Paxos演算法

       Paxos演算法是萊斯利·蘭伯特(英語:Leslie Lamport,LaTeX中的“La”)於1990年提出的一種基於訊息傳遞且具有高度容錯特性的一致性演算法。

      Google Chubby的作者Mike Burrows說過這個世界上只有一種一致性演算法,那就是Paxos,其它的演算法都是殘次品。

基於拜占庭將軍問題解析:

分為以下兩種角色:

  • proposer:參謀1,參謀2(提交者)
  • acceptor: 將軍1,將軍2,將軍3(決策者)

1、先後提議的場景

  1. 參謀1發起提議,派通訊兵帶信給3個將軍,內容為(編號1)
  2. 3個將軍收到參謀1的提議,由於之前還沒有儲存任何編號,因此把(編號1)儲存下來,避免遺忘;同時讓通訊兵帶信回去,內容為(ok)
  3. 參謀1收到至少2個將軍的回覆,再次派通訊兵帶信給3個將軍,內容為(編號1,進攻時間1)
  4. 3個將軍收到參謀1的時間,把(編號1,進攻時間1)儲存下來,避免遺忘;同時讓通訊兵帶信回去,內容為(Accepted)
  5. 參謀1收到至少2個將軍的(Accepted)內容,確認進攻時間已經被大家接收;
  6. 參謀2發起提議,派通訊兵帶信給3個將軍,內容為(編號2)
  7. 3個將軍收到參謀2的提議,由於(編號2)比(編號1)大,因此把(編號2)儲存下來,避免遺忘;又由於之前已經接受參謀1的提議,因此讓通訊兵帶信回去,內容為(編號1,進攻時間1)
  8. 參謀2收到至少2個將軍的回覆,由於回覆中帶來了已接受的參謀1的提議內容,參謀2因此不再提出新的進攻時間,接受參謀1提出的時間

2、交叉提交場景

1.參謀1發起提議,派通訊兵帶信給3個將軍,內容為(編號1);
2.3個將軍的情況如下
       a)將軍1和將軍2收到參謀1的提議,將軍1和將軍2把(編號1)記錄下來,如果有其他參謀提出更小的編號,將被拒絕;同時讓通訊兵帶信回去,內容為(ok)
        b)負責通知將軍3的通訊兵被抓,因此將軍3沒收到參謀1的提議
3.參謀2在同一時間也發起了提議,派通訊兵帶信給3個將軍,內容為(編號2)
4.3個將軍的情況如下
        a)將軍2和將軍3收到參謀2的提議,將軍2和將軍3把(編號2)記錄下來,如果有其他參謀提出更小的編號,將被拒絕;同時讓通訊兵帶信回去,內容為(ok)
        b)負責通知將軍1的通訊兵被抓,因此將軍1沒收到參謀2的提議
5.參謀1收到至少2個將軍的回覆,再次派通訊兵帶信給有答覆的2個將軍,內容為(編號1,進攻時間1)
6.2個將軍的情況如下
        a)將軍1收到了(編號1,進攻時間1),和自己儲存的編號相同,因此把(編號1,進攻時間1)儲存下來;同時讓通訊兵帶信回去,內容為(Accepted)
       b)將軍2收到了(編號1,進攻時間1),由於(編號1)小於已經儲存的(編號2),因此讓通訊兵帶信回去,內容為(Rejected,編號2)
7.參謀2收到至少2個將軍的回覆,再次派通訊兵帶信給有答覆的2個將軍,內容為(編號2,進攻時間2)
8.將軍2和將軍3收到了(編號2,進攻時間2),和自己儲存的編號相同,因此把(編號2,進攻時間2)儲存下來,同時讓通訊兵帶信回去,內容為(Accepted)
9.參謀2收到至少2個將軍的(Accepted)內容,確認進攻時間已經被多數派接受
10.參謀1只收到了1個將軍的(Accepted)內容,同時收到一個(Rejected,編號2)
參謀1重新發起提議,派通訊兵帶信給3個將軍,內容為(編號3)
11.3個將軍的情況如下
       a)將軍1收到參謀1的提議,由於(編號3)大於之前儲存的(編號1),因此把(編號3)儲存下來;由於將軍1已經接受參謀1前一次的提議,因此讓通訊兵帶信回去,內容為(編號1,進攻時間1)
       b)將軍2收到參謀1的提議,由於(編號3)大於之前儲存的(編號2),因此把(編號3)儲存下來;由於將軍2已經接受參謀2的提議,因此讓通訊兵帶信回去,內容為(編號2,進攻時間2)
        c)負責通知將軍3的通訊兵被抓,因此將軍3沒收到參謀1的提議
12.參謀1收到了至少2個將軍的回覆,比較兩個回覆的編號大小,選擇大編號對應的進攻時間作為最新的提議;參謀1再次派通訊兵帶信給有答覆的2個將軍,內容為(編號3,進攻時間2)
13.將軍1和將軍2收到了(編號3,進攻時間2),和自己儲存的編號相同,因此儲存(編號3,進攻時間2),同時讓通訊兵帶信回去,內容為(Accepted)
14.參謀1收到了至少2個將軍的(accepted)內容,確認進攻時間已經被多數派接受。