系列文章 -> 分佈式理論html
同前文,2PC也是縮寫,即Two-phase Commit,即二階段提交算法
用以保證在分佈式事務中,要麼全部參與進程都提交事務,要麼都取消事務,即實現ACID的原子性(A)。在數據一致中,它的含義是:要麼全部副本(備份數據)同時修改某個數值,要麼都不更改,以此來保證數據的強一致性。數據庫
在計算機科學中,預寫式日誌(Write-ahead logging,縮寫 WAL)是關係數據庫系統中用於提供原子性和持久性(ACID屬性中的兩個)的一系列技術
基本假設是有風險的segmentfault
第一階段也被稱做投票階段,即各參與者投票是否要繼續接下來的提交操做服務器
QUERY TO COMMIT
),並開始等待各參與者節點的響應。YES
)消息;若是參與者節點的事務操做實際執行失敗,則它返回一個"停止"(NO
)消息第二階段也被稱做完成階段,由於不管結果怎樣,協調者都必須在此階段結束當前事務。網絡
當協調者節點從全部參與者節點得到的相應消息都爲"贊成"時:分佈式
COMMIT
)的請求。ACKNOWLEDGMENT
)消息。若是任一參與者節點在第一階段返回的響應消息爲"終止",或者 協調者節點在第一階段的詢問超時以前沒法獲取全部參與者節點的響應消息時:post
ACKNOWLEDGMENT
)消息。咱們僅從理論上分析各類意外,由於實際的網絡生產中,各類狀況都有可能發生spa
狀況 | 分析及解決方案 |
---|---|
協調者掛了,參與者沒掛 | 只要找一個協調者的替代者,新的協調者詢問全部參與者它們最後那條事務的執行狀況,新協調者就知道該作什麼樣的操做了。這種狀況不會致使數據不一致 |
參與者掛了(沒法恢復),協調者沒掛 | 若是掛了以後沒有恢復,則不會致使數據不一致 |
參與者掛了(後來恢復),協調者沒掛 | 恢復後參與者若是發現有未執行完的事務操做,直接取消,而後再詢問協調者我應該怎麼作,協調者就會比對本身的事務執行記錄和該參與者的事務執行記錄,告訴他應該怎麼作來保持數據的一致 |
參與者掛了,協調者也掛了 | 須要再細分爲幾種類型來討論,以下 |
參與者掛了,協調者也掛了的狀況日誌
協調者和參與者在投票階段掛了
協調者和參與者在執行階段掛了,可是掛的這個參與者在掛以前尚未作相關操做
協調者詢問全部參與者的狀況。
roolback
操做或投票階段返回的信息是No
,那麼協調者指導參與者執行roolback
操做。commit
操做且其他參與者沒有abort
,那麼協調者就指導參與者執行commit
操做。由於掛掉的機器並無作 commit 或者 roolback 操做,而沒有掛掉的機器們和新的協調者又執行了一樣的操做,那麼這種狀況不會致使數據不一致現象協調者和參與者在第二階段掛了,掛的這個參與者在掛以前已經執行了操做
掛掉的參與者恢復了:因爲參與者在掛以前執行了操做,此時是沒有人知道它執行了什麼操做,它已經執行完了以前的事務
commit
:此時這個掛掉且恢復的參與者和其它參與者保持一致了roolback
:此時會致使數據的不一致,雖然這個時候能夠再經過手段讓他和協調者通訊,再想辦法把數據變成一致的,可是,這段時間內他的數據狀態已是不一致了2PC協議中,若是出現協調者和參與者都掛了的狀況,有可能致使數據不一致。爲了解決這個問題,衍生出了3PC,這是後話。
關於這幾個缺點,在實際應用中,都是對2PC 作了相應的改造:
在分佈式系統中,每一個節點能夠知道本身的操做是成功仍是失敗,但沒法知道其餘節點的操做狀態,爲了在跨多個節點的事務中保持事務的ACID特性,咱們會引入一個「協調者」的組件來統一掌握全部節點(參與者)的操做狀態,並指示這些節點(參與者)是否須要把操做結果進行真正的提交(好比將更新後的數據寫入磁盤等等)。
所以,二階段提交的算法思路能夠歸納爲:參與者將操做結果通知協調者,在由協調者根據全部參與者的反饋情報決定各參與者是否要提交操做仍是停止操做
The Two-Phase Commit Protocol
二階段提交
分佈式理論(三) - 2PC協議
分佈式系統的一致性協議之 2PC 和 3PC