interesting analogy主要是後面提到的marriage vows描述,2PC (two phase commit 兩階段提交) 是在transaction processing裡的一種protocol,主要是為了要保證atomic operation,在transaction或database裡的atomic指的是 all occur, or nothing occurs. 在transaction裡一系列的操作生效 或是 當作沒發生過。2PC是在分布式系統中,需要transaction時的基本做法,有一些算法也是基於2PC所遇到的問題進行改良(如3PC)
2PC主要是提供在分布式環境多節點的atomic演算法,這邊的節點有可能是不同主機或process
舉例來說,銀行的轉帳,A帳戶的錢轉到B帳戶所需要的操作是
1. A扣掉轉的錢(&手續費)
2. B帳戶的錢增加
(這兩個操作可能是發生在不同地方的主機)
這兩個操作應當是視為一整體,也就是當使用者按下確認轉帳後 因為某些原因如網路或設備故障造成交易無法完成時,系統必須回復到交易前的狀態(就如同沒發生過),否則可能會造成A帳戶的錢扣了,而B帳戶的錢沒增加。
因為假設操作節點有可能故障,這樣的設計必須是可以failure recovery的,當失敗時可以回復狀態(無論是多節點中其他節點的失敗或是自己本身的故障如斷電),要能夠進行這樣的recovery 必須要有durability來紀錄操作歷史以便復原。所以一般會用redo log, undo log紀錄操作在非揮發性的儲存上面。
另外因為牽涉多節點的協調,所以很自然會有一個協調者的角色。這個協調者通知與蒐集所有節點的回報來確認操作是否成功或失敗。(commit or abort)
這個演算法分成兩階段
1. commit-request phase / voting phase:
- coordinator 對 所有的節點發出transaction operation request,並等待回應 (以上面的例子來說 對A帳戶的銀行主機發出扣款,B帳戶的主機發出新增款項的操作,可以有先後順序-causality而非并行)
- 節點要執行request的操作,並且記錄undo/redo log
- 回覆成功或失敗 (譬如說 A帳戶餘額不足)
2. commit phase 分成兩種case:
success
- 全部的節點在phase 1都說OK, coordinator再發出commit要求到每個節點
- 節點完成commit後釋放資源回覆ACK
- 當coordinator收到所有ACK後,transaction完成
failure
- 有節點在phase 1說NOT OK 或是coordinator沒收到全部回應(timeout)
- 送出rollback要求給每個節點
- 節點完成rollback(undo)後後釋放資源回覆ACK
- 當coordinator收到所有ACK後,transaction取消
2PC的缺點:
- 過程是blocking的: 當節點回應OK後 等待commit or rollback的期間,資源會占住(以銀行的例子就是該帳戶的餘額是被鎖定的,所以無法再處理會更動金額的要求)
- 當coordinator fails可能會造成 節點的無限等待
- phase 2如果節點沒有ACK的error handling
關於2PC有一個生動的例子可以描述:
結婚儀式作為一個transaction:
要嘛結婚儀式完成(commit->已結婚狀態) 要嘛取消(abort->回到原來未婚的狀態)
coordinator: 神父或牧師
participants: 一對新人
phase 1:
coordinator發出request:
A先生,無論貧窮、疾病、困難、痛苦,富有、健康、快樂、幸福,你都願意對B小姐不離不棄,一生一世愛護她嗎?
B小姐,無論貧窮、疾病、痛苦、富有、健康、快樂、幸福,你都願意對A先生不離不棄,一生一世愛護他嗎?
phase 2:
收集A, B response
如果A B 皆回答I do. (OK) 那就宣告成為夫妻 (send commit)
接下來雙方交換信物戒指 可視為commit成功的ACK
可是以上是success的情況 可以想一想:
- 如果有一方說No 那應該如何處理…神父或牧師就會發出rollback request~~
- 如果有一方想很久 一直沒回應I do….宣布timeout, rollback
- 但還有一種情況是coordinator出現異常…譬如說神父或牧師突然昏倒了…在2PC的流程裡 沒有處理這種case,
所以可能會讓台上的人陷入等待…(leader election Paxos算法有處理,選出下一位coordinator來接手,配合participant的狀態繼續request處理,但整體來說無法類比到這個情境..)
上面的例子主要是要說明 transaction的應用其實在生活中也能夠找到蹤影!
上面這個例子是在在找Paxos演算法的相關資料時,看到
https://www.quora.com/In-distributed-systems-what-is-a-simple-explanation-of-the-Paxos-algorithm
其中提出來的marriage vows的描述,並加以延伸。
參考:
https://en.wikipedia.org/wiki/Two-phase_commit_protocol