1. 程式人生 > >二階段提交和三階段提交演算法的理解

二階段提交和三階段提交演算法的理解

一、二階段提交演算法的描述:

二階段提交演算法的成立基於以下假設:

  1. 該分散式系統中,存在一個節點作為協調者(Coordinator),其他節點作為參與者(Cohorts)。且節點之間可以進行網路通訊。
  2. 所有節點都採用預寫式日誌,且日誌被寫入後即被保持在可靠的儲存裝置上,即使節點損壞不會導致日誌資料的消失。
  3. 所有節點不會永久性損壞,即使損壞後仍然可以恢復。

以下對二階段提交演算法分階段進行說明。

第一階段(提交請求階段)

  1. 協調者節點向所有參與者節點詢問是否可以執行提交操作,並開始等待各參與者節點的響應。
  2. 參與者節點執行詢問發起為止的所有事務操作,並將Undo資訊和寫入日誌。
  3. 各參與者節點響應協調者節點發起的詢問。如果參與者節點的事務操作實際執行成功,則它返回一個"同意"訊息;如果參與者節點的事務操作實際執行失敗,則它返回一個"中止"訊息。

有時候,第一階段也被稱作投票階段,即各參與者投票是否要繼續接下來的提交操作。

第二階段(提交執行階段)

成功

當協調者節點從所有參與者節點獲得的相應訊息都為"同意"時:

  1. 協調者節點向所有參與者節點發出"正式提交"的請求。
  2. 參與者節點正式完成操作,並釋放在整個事務期間內佔用的資源。
  3. 參與者節點向協調者節點發送"完成"訊息。
  4. 協調者節點受到所有參與者節點反饋的"完成"訊息後,完成事務。

失敗

如果任一參與者節點在第一階段返回的響應訊息為"中止",或者 協調者節點在第一階段的詢問超時之前無法獲取所有參與者節點的響應訊息時:

  1. 協調者節點向所有參與者節點發出"回滾操作"的請求。
  2. 參與者節點利用之前寫入的Undo資訊執行回滾,並釋放在整個事務期間內佔用的資源。
  3. 參與者節點向協調者節點發送"回滾完成"訊息。
  4. 協調者節點受到所有參與者節點反饋的"回滾完成"訊息後,取消事務。

有時候,第二階段也被稱作完成階段,因為無論結果怎樣,協調者都必須在此階段結束當前事務

以上的內容均來自於維基百科,可以參見:http://zh.wikipedia.org/wiki/%E4%BA%8C%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4

理解:

1、二階段提交的整個過程是比較容易理解的

2、二階段協議的理解必須建立在之前的假設之上,即日誌寫在可靠磁碟上,也就是說,基於日誌的事務提交是可靠的。

3、二階段演算法的最大缺陷是資源的阻塞,尤其是某個參與者在第一階段執行過程中發生故障的時候,資源會長久性的阻塞。

基於對二階段問題的解決,三階段提交在兩階段提交的第一階段與第二階段之間插入了一個準備階段,並且引入了超時機制,為什麼要加一個準備階段:

1、在投票階段可以不用阻塞資源

2、通常來講,投票通過以後,準備階段失敗的概率會比較低,並且即使失敗,也不影響資料的一致性。

注意:無論是第二階段提交還是第三階段提交,其實都沒有考慮事務提交階段的失敗情況,主要原因:1、基於之前的假設,日誌是可靠的。2、對於網路的故障,即使丟失了提交命令,也可以根據相關的日誌進行恢復,一般的分散式系統都會存在故障恢復的機制。

最後,二階段提交和三階段提交都只是分散式一致性演算法的基礎演算法,不是一種完全可靠的演算法(有理論證明:在分散式網路環境下,不存在完全可靠的演算法來保證資料的一致性,這部分理論下次分享),但是,通常的實現都會對這些演算法做一些容錯處理,以保證在發生故障的時候能夠恢復資料的一致性。