由於base理論需要在一致性和可用性方面做出權衡,因此湧現了很多關於一致性的演算法和協議。其中比較著名的有二階提交協議(2 phase commitment protocol),三階提交協議(3 phase commitment protocol)和paxos演算法。
本文要介紹的2pc協議,分為兩個階段提交乙個事務。並通過協調者和各個參與者的配合,實現分布式一致性。
兩個階段事務提交協議,由協調者和參與者共同完成。
角色xa概念
作用協調者
事務管理器
協調各個參與者,對分布式事務進行提交或回滾
參與者資源管理器
分布式集群中的節點
分布式事務是指會涉及到操作多個資料庫的事務,其實就是將對同一庫事務的概念擴大到了對多個庫的事務。目的是為了保證分布式系統中的資料一致性。
分布式事務處理的關鍵是:
需要記錄事務在任何節點所做的所有動作;
事務進行的所有操作要麼全部提交,要麼全部回滾。
xa規範是由 x/open組織(即現在的 open group )定義的分布式事務處理模型。 x/open dtp 模型( 1994 )包括:
xa規範定義了交易中介軟體與資料庫之間的介面規範(即介面函式),交易中介軟體用它來通知資料庫事務的開始、結束以及提交、回滾等。而xa介面函式由資料庫廠商提供。
二階提交協議和三階提交協議就是基於xa規範提出的其中,二階段提交就是實現xa分布式事務的關鍵。配置tm,給tm註冊rm作為資料來源。其中,乙個tm可以註冊多個rm。
ap向tm發起乙個全域性事務。這時,tm會傳送乙個xid(全域性事務id)通知各個rm。
ap從tm獲取資源管理器的**(例如:使用jta介面,從tm管理的上下文中,獲取出這個tm所管理的rm的jdbc連線或jms連線)。
ap通過從tm中獲取的連線,間接操作rm進行業務操作。tm在每次ap操作時把xid傳遞給rm,rm正是通過這個xid關聯來操作和事務的關係的。
ap結束全域性事務時,tm會通知rm全域性事務結束。開始二段提交,也就是prepare - commit的過程。
xa規範的流程,大致如圖所示:
二階段提交的演算法思路可以概括為:每個參與者將操作成敗通知協調者,再由協調者根據所有參與者的反饋情報,決定各參與者是否要提交操作還是中止操作。
所謂的兩個階段分別是:
3.1.1. 準備階段
準備階段分為三個步驟:
a. 事務詢問
協調者向所有的參與者詢問,是否準備好了執行事務,並開始等待各參與者的響應。b. 執行事務
各參與者節點執行事務操作。如果本地事務成功,將undo和redo資訊記入事務日誌中,但不提交;否則,直接返回失敗,退出執行。c. 各參與者向協調者反饋事務詢問的響應
如果參與者成功執行了事務操作,那麼就反饋給協調者 yes響應,表示事務可以執行提交;如果參與者沒有成功執行事務,就返回no給協調者,表示事務不可以執行提交。3.1.2. 提交階段
在提交階段中,會根據準備階段的投票結果執行2種操作:執行事務提交,中斷事務。
提交事務過程如下:
a. 傳送提交請求
協調者向所有參與者發出commit請求。b. 事務提交
參與者收到commit請求後,會正式執行事務提交操作,並在完成提交之後,釋放整個事務執行期間占用的事務資源。c. 反饋事務提交結果
參與者在完成事務提交之後,向協調者傳送ack資訊。d. 事務提交確認
協調者接收到所有參與者反饋的ack資訊後,完成事務。中斷事務過程如下:a. 傳送回滾請求
協調者向所有參與者發出rollback請求。b. 事務回滾
參與者接收到rollback請求後,會利用其在提交階段種記錄的undo資訊,來執行事務回滾操作。在完成回滾之後,釋放在整個事務執行期間占用的資源。c. 反饋事務回滾結果
參與者在完成事務回滾之後,想協調者傳送ack資訊。d. 事務中斷確認
協調者接收到所有參與者反饋的ack資訊後,完成事務中斷。同步阻塞
在二階段提交的過程中,所有的節點都在等待其他節點的響應,無法進行其他操作。這種同步阻塞極大的限制了分布式系統的效能。
單點問題
協調者在整個二階段提交過程中很重要,如果協調者在提交階段出現問題,那麼整個流程將無法運轉。更重要的是,其他參與者將會處於一直鎖定事務資源的狀態中,而無法繼續完成事務操作。
資料不一致
假設當協調者向所有的參與者傳送commit請求之後,發生了區域性網路異常,或者是協調者在尚未傳送完所有 commit請求之前自身發生了崩潰,導致最終只有部分參與者收到了commit請求。這將導致嚴重的資料不一致問題。
容錯性不好
如果在二階段提交的提交詢問階段中,參與者出現故障,導致協調者始終無法獲取到所有參與者的確認資訊,這時協調者只能依靠其自身的超時機制,判斷是否需要中斷事務。顯然,這種策略過於保守。換句話說,二階段提交協議沒有設計較為完善的容錯機制,任意乙個節點是失敗都會導致整個事務的失敗。
本帳號將持續分享後端技術乾貨,包括虛擬機器基礎,多執行緒程式設計,高效能框架,非同步、快取和訊息中介軟體,分布式和微服務,架構學習和高階等學習資料和文章。
分布式理論(三)2PC協議
2pc two phase commit二階段提交協議 2pc是在計算機網路以及資料庫領域內,為了使基於分布式系統架構下的所有節點在進行事務的提交時,保持一致性而設計的一種演算法。通常,二階段提交也被稱為是一種協議。在分布式系統中,每個節點雖然可以知曉自己的操作是否成功,但無法知道其他節點的操作是否...
分布式事務2PC協議
two phase commit protocol 在事務處理,資料庫,計算機網路中,兩階段提交 2pc 是一種原子提交協議。它是一種分布式演算法,協調參與分布式原子事務的所有程序,決定是提交事務還是中止 回滾 事務 它是一種協商一致性協議 該協議即使在許多臨時系統故障 包括程序 網路節點 通訊等故...
分布式理論(三) 一致性協議之 2PC
為了使系統盡量能夠達到 cap,於是有了 base 協議,而 base 協議是在可用性和一致性之間做的取捨和妥協。人們往往需要在系統的可用性和資料一致性之間反覆的權衡。於是呢,就產生我們標題中的一致性協議,而且還不止乙個呢。為了解決分布式問題,湧現了很多經典的演算法和協議,最著名的就是二階段提交協議...