一、2PC
在上一節ZooKeeper-分布式架構中有講到,分布式系統架構設計中往往是在系統可用性和資料一緻性之間進行反複權衡,于是産生了系列一緻性協定
在分布式系統中,每個節點都能明确知道自身事務操作結果,但無法直接擷取到其他分布式節點的操作結果。是以當一個事務要橫跨多個節點時,為了保證事務處理的ACID特性而引入了協調者元件來統一排程所有分布式節點(參與者)的執行邏輯,協調者排程參與者的行為并最終決定是否把參與者的事務進行真正的送出
2PC(Two-Phase Commit 兩階段送出):完成參與者的協調,統一決定事務的送出或復原,使基于分布式系統架構下的所有節點在進行事務處理過程中能夠保持原子性和資料一緻性
1. 協定說明
二階段送出協定将事物的送出過程分為兩個階段處理
(1)送出事務請求
事務詢問:協調者向所有參與者發送事務内容,詢問是否可以執行事務送出操作,等待響應
執行事務:參與者節點執行事務操作,并記錄Undo和Redo資訊到事務日志
參與者響應:若參與者成功執行事務,則向協調者回報Yes響應,否則回報No響應
(2)執行事務送出-送出
如果所有參與者的回報都是Yes響應,那麼執行事務送出
發送送出請求:協調者向所有參與者發送Commit請求
事務送出:參與者接受到Commit請求後執行事務送出操作并釋放占用的事務資源
回報事務送出結果:參與者完成事務送出後向協調者發送Ack消息
完成事務:協調者收到所有參與者的Ack響應後,完成事務送出
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90EROp3aU9UNrpWTmZEWjZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jM2QTN0QTN1EzNxATM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
(3)執行事務送出-中斷
如果任何一個參與者傳回了N響應或者協調者等待逾時後就會中斷事務
發送復原請求:協調者向所有參與者發送Rollback請求
事務復原:參與者受到請求後通過Undo資訊執行事務復原操作并釋放占用的事務資源
回報事務復原結果:參與者復原事務後向協調者發送Ack消息
中斷事務:協調者接收到所有參與者的Ack響應後,完成事務中斷
2. 優缺點
(1)優點
原理簡單,實作友善
(2)缺點
同步阻塞:在階段二事務送出過程中,所有參與者的操作邏輯都處于阻塞狀态,等待其他參與者響應,協調者請求
單點問題:一旦協調者出現問題,階段二送出流程無法運轉,并且參與者會一直處于鎖定事務資源的狀态,無法繼續事務操作
資料不一緻:當協調者向所有參與者發送了Commit請求後局部網絡異常或協調者半路出錯導緻隻有部分參與者收到Commit請求,造成系統出現資料不一緻
太過保守:任何一個參與節點的失敗使得協調者無法擷取所有參與者的響應資訊都會導緻整個事務的失敗
二、3PC
3PC(Three-Phase Commit 三階段送出)将二階段送出的送出事務請求過程一分為二,形成CanCommit、PreCommit、doCommit三個階段
1.協定說明
(1)CanCommit
事務詢問:協調者向所有參與者發送包含事務内容的CanCommit請求,詢問是否可以執行事務送出操作,等待響應
參與者響應:參與者接收到CanCommit請求後判斷自身能夠順利執行事務,能則傳回Yes響應并進入預備狀态,否則傳回No響應
(2)PreCommit
-
執行事務預送出
如果所有參與者回報都為Yes響應,則執行事務預送出
發送預送出請求:協調者向所有參與者節點發出PreCommit請求,并進入Prepared階段
事務預送出:參與者接收到PreCommit請求後執行事務操作,并記錄Undo和Redo資訊到事務日志中
參與者響應事務執行結果:若參與者成功執行事務後則傳回Ack響應給協調者,等待最終指令
-
中斷事務
若任何一個參與者回報了No響應或者協調者等待逾時則中斷事務
發送中斷請求:協調者向所有參與者節點發出Abort請求
中斷事務:無論收到Abort請求或者等待協調者請求逾時,參與者都會中斷事務
(3)DoCommit
- 執行送出
發送送出請求:當協調者收到所有參與者回報的Ack響應,向所有參與者發送DoCommit請求,從預送出狀态轉到送出狀态
事務送出:參與者接收到DoCommit請求後,正式執行事務送出操作,并釋放占用的事務資源
回報事務送出結果:參與者完成事務送出後向協調者發送Ack消息
完成事務:協調者接受到所有參與者回報的Ack響應後,完成事務
- 中斷事務
發送中斷請求:協調者向所有參與者節點發出Abort請求
事務復原:參與者接收到Abort請求後,利用Undo資訊執行事務復原操作,并釋放占用的事務資源
回報事務復原結果:參與者完成事務復原後向協調者發送Ack消息
中斷事務:協調者接收到所有參與者回報的Ack響應後,中斷事務
第三階段中若參與者無法及時接收到協調者發送的DoCommit或者Abort請求都會在等待逾時後繼續進行事務送出
2. 優缺點
(1)優點
降低參與者的阻塞範圍,能夠在出現單點故障後繼續達成一緻
(2)缺點
接受者接收到PreCommit消息後,如果出現網絡分區導緻協調者和參與者無法正常通信,這時參與者仍會進行事務送出,造成資料的不一緻