兩階段提交

在一次原子操作中更新多個節點上的資源

問題

當資料需要在多個叢集節點上以原子方式儲存時,在其他叢集節點的決定已知之前,節點無法讓客戶端存取資料。每個節點都需要知道其他節點是否成功儲存資料,或者是否失敗。

解決方案

毫不意外地,兩階段提交的精髓在於它分兩個階段執行更新

  1. 準備階段詢問每個節點是否可以承諾執行更新。
  2. 提交階段實際執行更新。

作為準備階段的一部分,參與交易的每個節點都會取得必要的資源,以確保它能夠在第二階段進行提交,例如,任何需要的鎖定。一旦每個節點都能夠確保它可以在第二階段提交,它就會讓協調器知道,承諾協調器它可以在第二階段提交,而且一定會提交。如果任何節點無法做出該承諾,則協調器會告訴所有節點回滾,釋放它們擁有的任何鎖定,並且交易會中斷。只有當所有參與者都同意繼續進行時,第二階段才會開始,屆時預計它們都會成功更新。對每個參與者來說,使用類似 寫入前記錄 的模式來確保其決策的持久性至關重要。這表示即使節點崩潰並隨後重新啟動,它也應該能夠毫無問題地完成協定。

更多詳細資訊,請參閱 oreilly.com 上線上電子書的 第 21 章

此模式是 分散式系統模式 的一部分

2023 年 11 月 23 日