分佈式一致性算法2PC和3PC

  爲了解決分佈式一致性問題,產生了很多經典的分佈式一致性算法,本文將介紹其中的2PC和3PC。2PC即Two-Phase Commit,譯爲二階段提交協議。3PC即Three-Phase Commit,譯爲三階段提交協議。
 算法

分佈式系統和分佈式一致性問題

 
  分佈式系統,即運行在多臺不一樣的網絡計算機上的軟硬件系統,而且僅經過消息傳遞來進行通訊和協調。
  分佈式一致性問題,即相互獨立的節點之間如何就一項決議達成一致的問題。
 網絡

2PC

 
  2PC,二階段提交協議,即將事務的提交過程分爲兩個階段來進行處理:準備階段和提交階段。事務的發起者稱協調者,事務的執行者稱參與者。
 
  階段1:準備階段
  一、協調者向全部參與者發送事務內容,詢問是否能夠提交事務,並等待全部參與者答覆。
  二、各參與者執行事務操做,將Undo和Redo信息記入事務日誌中(但不提交事務)。
  三、如參與者執行成功,給協調者反饋YES,便可以提交;如執行失敗,給協調者反饋NO,即不可提交。
 
  階段2:提交階段
 
  此階段分兩種狀況:全部參與者均反饋YES、或任何一個參與者反饋NO。
  全部參與者均反饋YES時,即提交事務。
  任何一個參與者反饋NO時,即中斷事務。
 
  提交事務:(全部參與者均反饋YES)
  一、協調者向全部參與者發出正式提交事務的請求(即Commit請求)。
  二、參與者執行Commit請求,並釋放整個事務期間佔用的資源。
  三、各參與者向協調者反饋Ack完成的消息。
  四、協調者收到全部參與者反饋的Ack消息後,即完成事務提交。
 
  附以下示意圖:
 
分佈式一致性算法2PC和3PC
 
  中斷事務:(任何一個參與者反饋NO)
  一、協調者向全部參與者發出回滾請求(即Rollback請求)。
  二、參與者使用階段1中的Undo信息執行回滾操做,並釋放整個事務期間佔用的資源。
  三、各參與者向協調者反饋Ack完成的消息。
  四、協調者收到全部參與者反饋的Ack消息後,即完成事務中斷。
 
  附以下示意圖:
 
分佈式一致性算法2PC和3PC
 分佈式

2PC的缺陷

 
  一、同步阻塞:最大的問題即同步阻塞,即:全部參與事務的邏輯均處於阻塞狀態。
  二、單點:協調者存在單點問題,若是協調者出現故障,參與者將一直處於鎖定狀態。
  三、腦裂:在階段2中,若是隻有部分參與者接收並執行了Commit請求,會致使節點數據不一致。
 
  因爲2PC存在如上同步阻塞、單點、腦裂問題,所以又出現了2PC的改進方案,即3PC。
 ide

3PC

 
  3PC,三階段提交協議,是2PC的改進版本,即將事務的提交過程分爲CanCommit、PreCommit、do Commit三個階段來進行處理。
 
  階段1:CanCommit
  一、協調者向全部參與者發出包含事務內容的CanCommit請求,詢問是否能夠提交事務,並等待全部參與者答覆。
  二、參與者收到CanCommit請求後,若是認爲能夠執行事務操做,則反饋YES並進入預備狀態,不然反饋NO。
 
  階段2:PreCommit
 
  此階段分兩種狀況:
  一、全部參與者均反饋YES,即執行事務預提交。
  二、任何一個參與者反饋NO,或者等待超時後協調者尚沒法收到全部參與者的反饋,即中斷事務。
 
  事務預提交:(全部參與者均反饋YES時)
  一、協調者向全部參與者發出PreCommit請求,進入準備階段。
  二、參與者收到PreCommit請求後,執行事務操做,將Undo和Redo信息記入事務日誌中(但不提交事務)。
  三、各參與者向協調者反饋Ack響應或No響應,並等待最終指令。
 
  中斷事務:(任何一個參與者反饋NO,或者等待超時後協調者尚沒法收到全部參與者的反饋時)
  一、協調者向全部參與者發出abort請求。
  二、不管收到協調者發出的abort請求,或者在等待協調者請求過程當中出現超時,參與者均會中斷事務。
 
  階段3:do Commit
 
  此階段也存在兩種狀況:
  一、全部參與者均反饋Ack響應,即執行真正的事務提交。
  二、任何一個參與者反饋NO,或者等待超時後協調者尚沒法收到全部參與者的反饋,即中斷事務。
 
  提交事務:(全部參與者均反饋Ack響應時)
  一、若是協調者處於工做狀態,則向全部參與者發出do Commit請求。
  二、參與者收到do Commit請求後,會正式執行事務提交,並釋放整個事務期間佔用的資源。
  三、各參與者向協調者反饋Ack完成的消息。
  四、協調者收到全部參與者反饋的Ack消息後,即完成事務提交。
 
  中斷事務:(任何一個參與者反饋NO,或者等待超時後協調者尚沒法收到全部參與者的反饋時)
  一、若是協調者處於工做狀態,向全部參與者發出abort請求。
  二、參與者使用階段1中的Undo信息執行回滾操做,並釋放整個事務期間佔用的資源。
  三、各參與者向協調者反饋Ack完成的消息。
  四、協調者收到全部參與者反饋的Ack消息後,即完成事務中斷。
 
  注意:進入階段三後,不管協調者出現問題,或者協調者與參與者網絡出現問題,都會致使參與者沒法接收到協調者發出的do Commit請求或abort請求。此時,參與者都會在等待超時以後,繼續執行事務提交。
 
  附示意圖以下:
 
分佈式一致性算法2PC和3PC
 日誌

3PC的優勢和缺陷

 
  優勢:下降了阻塞範圍,在等待超時後協調者或參與者會中斷事務。避免了協調者單點問題,階段3中協調者出現問題時,參與者會繼續提交事務。
 
  缺陷:腦裂問題依然存在,即在參與者收到PreCommit請求後等待最終指令,若是此時協調者沒法與參與者正常通訊,會致使參與者繼續提交事務,形成數據不一致。
 blog

後記

 
  不管2PC或3PC,均沒法完全解決分佈式一致性問題。
  解決一致性問題,惟有Paxos,後續將單獨總結。事務

相關文章
相關標籤/搜索