前面提到的Paxos:
這是Lamport為了解決分散式系統,而一系列提出我們現在看到的Lamport Logical Clock
、BASE理念
同時發展出為了來保證Consistency的Paxos Consensus Algorithm
。
但是就像在介紹CAP/ACID時說得,其實分散式系統的演化跟資料庫的演化是相輔相成的,因此在資料庫領域也有針對ACID與多個資料庫共同參與的Transaction保持Atomic與一致性,而設計出另一種一致性演算法,也就是 2 Phase Commitment,簡稱 2PC 。
我們前面提到資料庫的Transaction一般必須滿足ACID特性
ACID:
而常見的Web系統串接資料庫時,一般常見都是下面的架構
beginTransaction()
-> Action on DB
-> commit()
來修改資料庫內容。當業務變得複雜時,可能改動到的不只一個資料庫,比方說下面的情境。
一個購物過程:
此時如果中間因為網路掉封包或是延遲甚至斷線,導致只有一個資料庫執行了動作,另一個資料庫沒有更新到,那數據最終將會不合理。
(這邊就類似前面提到的分散式儲存的一致性特性)
為了保證ACID特性:
而這個情境下大部分是不允許Weak Consistency的,
因此2 Phase Commitment就是在這邊運作來達到Strong Consistency,
保證兩個DB都可以 commit actions或是abort actions。
一樣分成兩個Phase
Ready:
完成資料複製後回覆完成Abort:
如果資料無法複製,原因可能為
Note:
- 如果Participants失效或是網路延遲,Coordinator有timeout機制。
- 原本那一份備用作為rollbacks時用
- 副本在確定2PC完成後就會commit到DB中
Ready
訊息。
Ready:
向所有的Participants發送Commit
訊息
Done
訊息給Coordinator
Abort:
只要有收到一個或是發生Timeout
Abort
給所有的Participants
1a). Coordinator向所有的Participants發送Prepare
1b). Participants複製資料後,回覆Ready
或是Abort
或是直接Timeout
2). 如果有任一個回覆Abort
或是Timeout
,就宣告Distributed Transaction 失敗。否則Distributed Transaction 完成
2). 成功,Coordinator發送Commit
。失敗,Coordinator發送Abort
。
2PC的優缺點非常直觀,因為本身的演算法可以說很簡單。
Timeout機制
。但是如果是Coordinator失效則Participants會因為每一個步驟是同步操作,在沒有收到回覆的情況下將會永久Block住,必須另外實作來對這種情況傳送Rollbacks或是Abort的訊息給Participants。因此明天我們將來看另一個演算法 - 3PC,如何解決2PC的問題。