文章目錄
- 一、什麼是2PC?
- 二、兩階段執行過程
- (1)請求階段(Prepare Phase)
- (2)送出階段(Commit Phase)
- 1. 二階段送出算法的前提
- 2. 過程
- 三、兩階段送出協定可能面臨兩種故障:
- (1)事務參與者發生故障
- (2)協調者發生故障
- 四、總結
一、什麼是2PC?
兩階段送出(Two-phase Commit, 2PC)算法,經常用來實作分布式事務。
系統包含兩類節點:
- 協調者(coordinator)
- 事務參與者(participants,cohorts或workers)
每個節點都會記錄記錄檔并持久化到非易失性存儲媒體,即使節點發生故障日志也不會丢失。
二、兩階段執行過程
(1)請求階段(Prepare Phase)
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5COwADOzYDZ3QjNlRGM1ITNzYzX4EzN1UTMxIzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- 協調者通知事務參與者準備送出或者取消事務,然後進入表決階段
-
在表決過程中,參與者将告知協調者自己決策:
同意(事務參與者本地執行成功)
取消(事務參與者本地執行失敗)
(2)送出階段(Commit Phase)
1. 二階段送出算法的前提
(1)在分布式系統中,存在一個節點作為協調者(Coordinator), 其他節點作為參與者(Cohorts), 且節點之間可以進行網絡通信
(2)所有節點都采用 預寫式日志,且日志被寫入後即保持在可靠的儲存設備上,即使節點損壞,也不會導緻日志資料的消失
(2)所有節點不會永久性損壞,即使損壞,仍然可以恢複
2. 過程
-
協調者将基于第一個階段的投票結果進行決策:
送出 或者 取消
當且僅當所有的參與者同意送出事務,協調者才通知所有的參與者送出事務
- 參與者在接收到協調者發來的消息後将執行相應的操作
三、兩階段送出協定可能面臨兩種故障:
(1)事務參與者發生故障
給每個事務設定一個逾時時間,如果某個事務參與者一直不響應,到達逾時時間後整個事務失敗。
(2)協調者發生故障
協調者需要将事務相關資訊記錄到記錄檔并同步到備用協調者,假如協調者發生故障,備用協調者可以接替它完成後續的工作。
如果沒有備用協調者,協調者又發生了永久性故障,事務參與者将無法完成事務而一直等待下去。
四、總結
- 兩階段送出協定是阻塞協定
- 兩階段送出性能下降的主要原因:
- 為了防崩潰恢複而做的磁盤I/O(fsync)
- 額外的網絡往返開銷