2PC協議在多數據中心,多路寫的情況下,保證數據一致性而設計的協議。
2PC思想比較簡單,是一個失敗,全體不成功;如果成功,就沒有一個失敗的簡單邏輯,實現簡單。
本文講述其大概流程,client提交數據到N個節點上,其中一個節點選爲協調員coordinator,其他作爲cohorts(partcipant)。2PC做了一些假設:
1、 每個節點都有穩定存儲(stable storage), 並且都會每次寫操作都有預寫日誌(write-ahead log);
2、 預寫日誌永遠不會丟失和破壞;
3、 任何節點之間都能互相通信;
4、每個參與者都是blocking的,有資源鎖存在。
實現表述畫一個時序流程圖來介紹吧,一目瞭然。
一個更詳細的狀態機實現
上圖中每個節點,每一步都有log記錄,以準備rollback,其中任何一步都有失敗的可能,收不到對方的消息。
在 phase 1階段,任何錯誤包括超時錯誤,都不會產生任何問題。
在 phase 2階段,如果是coordinator發出global commit後,有個或幾個cohorts失效。就發生了數據不一致的錯誤,存在一些cohorts更新數據,一些cohorts沒有更新數據。但是,coordinator沒有機會向所有cohorts發出global abort撤銷提交。
在實際生產環境中,2PC很少被使用。一般使用其改進版:如D2PC()