天天看點

10 一緻性協定 2PC與3PC一緻性協定1 2PC與3PC

一緻性協定

  • 一緻性協定
  • 1 2PC與3PC
    • 1.1 2PC 二階段送出協定
      • 階段一:送出事務請求 投票階段
      • 階段二:執行事務送出
    • 1.2 3PC 三階段送出協定 2PC的改進版
    • 階段一:CanCommit
      • 階段二:PreCommit
      • 階段三:DoCommit

一緻性協定

為了解決分布式一緻性問題,出現了一些一緻性協定和算法,二階段送出協定、三階段送出協定和Paxos算法。

1 2PC與3PC

分布式系統中,每個機器節點都能明确知道自己在執行事務操作過程中的結果是成功還是失敗,但無法知道其他節點的結果。當一個事務操作需要跨越多個節點的時候,為了保證事務處理的ACID特性。引入一個成為 “協調者”的元件來統一排程所有分布式節點的執行邏輯,被排程的節點稱為參與者。協調者負責排程參與者的行為,并最終決定這些參與者是否把事務真正執行完畢。衍生出二階段送出和三階段送出兩種協定。

1.1 2PC 二階段送出協定

絕大多數關系型資料庫都是采用二階段送出協定來完成分布式事務處理的。

階段一:送出事務請求 投票階段

  • 事務詢問:協調者向所有參者發送事務内容,詢問是否可以執行事務送出操作,并開始等待各位參與者響應。
  • 執行事務:各參與者節點執行事務操作,并将Undo和Redo資訊記錄入事務日志中。
  • 參與者向協調者回報事務詢問的響應:參與者執行了事務操作,響應Yes,表示事務可以執行,相反No則不可以執行。

階段二:執行事務送出

  • 執行送出事務:所有參與者都回報Yes,則執行事務送出。
  • 發送送出請求:協調者向所有參與節點發出Commit請求。
  • 事務送出:接受到Commit請求後,正式執行事務送出操作,完成送出後,釋放執行事務期間占用的資源。
  • 回報事務送出結果:參與者完成事務送出後,向協調者發送Ack消息。
  • 完成事務。協調者接受參與者的Ack消息,完成事務。
  • 中斷事務:任何一個參與者回報No響應,或者等待逾時。就會中斷事務。
  • 發送復原請求。協調者向發送者發出RollBack請求。
  • 事務復原。參與者利用記錄的Undo資訊執行事務復原操作,完成後釋放資源。
  • 回報事務復原結果。事務復原後,向協調者發送Ack消息。
  • 事務中斷。協調者接受Ack消息 ,完成事務中斷。

優點:原理簡單,實作友善。

缺點:同步堵塞,單點問題,腦裂,太過保守。

  • 同步堵塞:二階段,參與者在等待其他參與者響應的過程,無法進行其他操作。
  • 單點問題:協調者在送出協定中太過重要,一旦出問題,将無法運轉,參與者将一直處于鎖定資源的狀态中,無法繼續完成事務操作。
  • 資料不一緻性:參與者因腦裂部分收到Commit請求,部分沒有收到,導緻資料不一緻。
  • 太過保守:逾時隻能中斷,沒有容錯機制。

1.2 3PC 三階段送出協定 2PC的改進版

階段一:CanCommit

事務詢問

各參與者向協調者回報事務詢問的響應。

階段二:PreCommit

協調者根據參與者回報的情況來決定是否執行事務的PreCommit操作

  • 執行事務預送出:參與者回報都是Yes響應,執行事務預送出
  • 發送預送出請求:發送preCommit請求,進入Prepared階段。
  • 事務預送出:參與者接收preCommit請求,執行操作,記錄Undo和Redo資訊記錄日志中。
  • 各參與者向協調者回報事務執行的響應:成功執行事務,回報給協調者Ack響應,同時等待指令:commit 或 中止 abort
  • 中斷事務:任何一個參與者回報No,或等待逾時,就會中斷事務
  • 發送中斷請求。 abort請求
  • 中斷事務。

階段三:DoCommit

該階段将真正送出事務,兩種情況:

執行送出

  • 發送送出請求。發送doCommit請求
  • 事務送出。執行送出操作,釋放資源。
  • 回報事務送出結果。向協調者發送Ack消息。
  • 完成事務,回報Ack消息,完成事務。

中斷事務

  • 發送中斷請求,發送abort請求
  • 事務復原。通過Undo資訊來執行復原操作,并釋放資源。
  • 回報事務復原結果。 發送Ack消息
  • 中斷事務。

在3PC可能出現的故障:協調者出現問題;網絡出現故障。

較2PC,3PC能夠降低參與者的阻塞範圍,能夠在出現單點故障後繼續達成一緻。

3PC在參與者接收到PreCommit消息後,如果網絡分區,協調者和參與者無法網絡通信。參與者依然進行實物送出,必然造成資料不一緻性。