兩階段提交

兩階段提交協議(two phase commit protocol,2PC)可以保證數據的強一致性,許多分佈式關係型數據管理系統採用此協議來完成分佈式事務。它是協調所有分佈式原子事務參與者,並決定提交或取消(回滾)的分佈式算法。同時也是解決一致性問題的一致性算法。該算法能夠解決很多的臨時性系統故障(包括進程、網絡節點、通信等故障),被廣泛地使用。但是,它並不能夠通過配置來解決所有的故障,在某些情況下它還需要人爲的參與才能解決問題。參與者爲了能夠從故障中恢復,它們都使用日誌來記錄協議的狀態,雖然使用日誌降低了性能但是節點能夠從故障中恢復。

在兩階段提交協議中,系統一般包含兩類機器(或節點):一類爲協調者(coordinator),通常一個系統中只有一個;另一類爲事務參與者(participants,cohorts或workers),一般包含多個,在數據存儲系統中可以理解爲數據副本的個數。協議中假設每個節點都會記錄寫前日誌(write-ahead log)並持久性存儲,即使節點發生故障日誌也不會丟失。協議中同時假設節點不會發生永久性故障而且任意兩個節點都可以互相通信。

當事務的最後一步完成之後,協調器執行協議,參與者根據本地事務能夠成功完成回覆同意提交事務或者回滾事務。

顧名思義,兩階段提交協議由兩個階段組成。在正常的執行下,這兩個階段的執行過程如下所述:

階段1:請求階段(commit-request phase,或稱表決階段,voting phase)

在請求階段,協調者將通知事務參與者準備提交或取消事務,然後進入表決過程。在表決過程中,參與者將告知協調者自己的決策:同意(事務參與者本地作業執行成功)或取消(本地作業執行故障)。

階段2:提交階段(commit phase)

在該階段,協調者將基於第一個階段的投票結果進行決策:提交或取消。當且僅當所有的參與者同意提交事務協調者才通知所有的參與者提交事務,否則協調者將通知所有的參與者取消事務。參與者在接收到協調者發來的消息後將執行響應的操作。

 

注意  兩階段提交協議與兩階段鎖協議不同,兩階段鎖協議爲一致性控制協議。

 

該協議的執行過程可以通過下圖X-X來描述:


               (a)成功                                   (b)失敗

圖X-X:兩階段提交

 

兩階段提交協議最大的劣勢是其通過阻塞完成的協議,在節點等待消息的時候處於阻塞狀態,節點中其他進程則需要等待阻塞進程釋放資源才能使用。如果協調器發生了故障,那麼參與者將無法完成事務則一直等待下去。以下情況可能會導致節點發生永久阻塞:

如果參與者發送同意提交消息給協調者,進程將阻塞直至收到協調器的提交或回滾的消息。如果協調器發生永久故障,參與者將一直等待,這裏可以採用備份的協調器,所有參與者將回復發給備份協調器,由它承擔協調器的功能。

如果協調器發送“請求提交”消息給參與者,它將被阻塞直到所有參與者回覆了,如果某個參與者發生永久故障,那麼協調器也不會一直阻塞,因爲協調器在某一時間內還未收到某參與者的消息,那麼它將通知其他參與者回滾事務。

同時兩階段提交協議沒有容錯機制,一個節點發生故障整個事務都要回滾,代價比較大。

下面我們通過一個例子來說明兩階段提交協議的工作過程:

A組織B、C和D三個人去爬長城:如果所有人都同意去爬長城,那麼活動將舉行;如果有一人不同意去爬長城,那麼活動將取消。用2PC算法解決該問題的過程如下:

首先A將成爲該活動的協調者,B、C和D將成爲該活動的參與者。

階段1:

A發郵件給B、C和D,提出下週三去爬山,問是否同意。那麼此時A需要等待B、C和D的郵件。

B、C和D分別查看自己的日程安排表。B、C發現自己在當日沒有活動安排,則發郵件告訴A它們同意下週三去爬長城。由於某種原因,D白天沒有查看郵件。那麼此時A、B和C均需要等待。到晚上的時候,D發現了A的郵件,然後查看日程安排,發現週三當天已經有別的安排,那麼D回覆A說活動取消吧。

階段2:

此時A收到了所有活動參與者的郵件,並且A發現D下週三不能去爬山。那麼A將發郵件通知B、C和D,下週三爬長城活動取消。

此時B、C回覆A“太可惜了”,D回覆A“不好意思”。至此該事務終止。

 

通過該例子可以發現,2PC協議存在明顯的問題。假如D一直不能回覆郵件,那麼A、B和C將不得不處於一直等待的狀態。並且B和C所持有的資源,即下週三不能安排其它活動,一直不能釋放。其它等待該資源釋放的活動也將不得不處於等待狀態。

基於此,後來有人提出了三階段提交協議,在其中引入超時的機制,將階段1分解爲兩個階段:在超時發生以前,系統處於不確定階段;在超市發生以後,系統則轉入確定階段。

2PC協議包含協調者和參與者,並且二者都有發生問題的可能性。假如協調者發生問題,我們可以選出另一個協調者來提交事務。例如,班長組織活動,如果班長生病了,我們可以請副班長來組織。如果協調者出問題,那麼事務將不會取消。例如,班級活動希望每個人都能去,假如有一位同學不能去了,那麼直接取消活動即可。或者,如果大多數人去的話那麼活動如期舉行(2PC變種)。爲了能夠更好地解決實際的問題,2PC協議存在很多的變種,例如:樹形2PC協議(或稱遞歸2PC協議)、動態2階段提交協議(D2PC)等。


參考文獻:

維基百科:http://en.wikipedia.org/wiki/Two-phase_commit_protocol

兩階段提交協議與三階段提交協議之比較:http://my.oschina.net/digerl/blog/34139

NoSQL數據庫筆談:http://sebug.net/paper/databases/nosql/Nosql.html#_08464202471077442_91161458194


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章