天天看點

分布式系統閱讀筆記(十七)-----分布式事務

介紹

分布式事務和上篇中說到的普通事務的差别在于他所涉及到的伺服器超過1個。分布式事務可能是1層的也可能是嵌套多層的。為了協調分布式事務的,就出現了原子送出協定,比較著名的2pc協定就是其中的一個例子。之前的3種并發控制的方法鎖控制,樂觀并發控制,時間戳序列方法,經過一定的擴充也可以運用在分布式的事務上面。在分布式的事務上,還提供了恢複管理器用來進行對象,操作的恢複。之前已經讨論過在單一的伺服器上面實作對象的通路,但是在一個分離的伺服器上,這時候就需要一個協調者

來進行事務的一個協調。

單層和多層嵌套分布式事務

在單層的事務中,一個用戶端向一個服務端送出請求,服務端可以通過鎖來控制對象的通路在某短時間之中,在多層嵌套的分布式事務中,就可以以做上層的部分作為協調器,對子事務進行協調。每個協調者中維護了一個參與者的清單,每個參與者裡面也存有協調者的引用。

原子送出協定

1、一階段送出協定

事務的原子屬性同樣要求分布式事務的執行要麼全部執行完畢要麼全部不執行。最簡單的原子協定的實作就是讓協調者與所有的參與者進行溝通通訊,直到擷取到每個參與者的恢複判斷他們是否已經執行完畢,這個叫做一階段送出協定。一階段送出協定的缺點是協調者不知道服務端是否已經崩潰或者死鎖的一些情況,造成協調者會一直等待請求的回複。

2、2階段送出協定

為了蓋上上面協定的缺陷,就有了這個2pc協定,2階段送出協定,是以當然是分成2個階段做的事情了。第一階段形象的說是在收集參與者投票的階段,協定者會問參與者是否能夠送出事務,等待協調者擷取到了所有參與者的回複後,知道了下一步怎麼做了就來到了第二階段。2、第二階段協調者發出doCommit()或者是doAbort()指令給每個參與者,每個參與者執行完操作,傳回操作值代表操作完成,自此2pc整個過程結束。

3、2pc協定的性能

很顯然在協調者收集參與者投票的階段必然會有一定的消息延遲,因為要等那麼多的參與者的回複,其次,2個階段中頻繁的消息傳送也會消耗很大的時間和帶寬。

分布式事務中的并發控制

在分布式的環境中,每個伺服器管理着一系列的對象集合,并且他們有責任使這些對象保持一緻的狀态當他們被分布式的事務通路的時候,

1、鎖模式

鎖模式在分布式的事務中同樣還是可能會出現問題,造成分布式的死鎖。

2、時間戳序列

時間戳序列的并發控制手段在分布式中的一個難點在于如何確定全局時間戳的唯一性,每個協調者又他自己的時間戳,這就要求協調者之間需要一定的同步,來配置設定唯一的時間戳序列号。

3、樂觀并發控制

分布式中的樂觀并發控制的核心在于全局的validation檢測,而不再是本地的單純的檢測了。

分布式死鎖

1、wait-for graph等待圖

分布式死鎖在分布式事務中也是極有可能出現的,分布式死鎖的檢測手段可以通過逾時機制(時間間隔的控制也是一個難點)還有一個是循環引用的尋找在各個事務的等待圖中。本地等待圖(wait-for graph)可以通過本地伺服器上的鎖管理器建構,如果在等待圖中發現了循環,說明出現了死鎖。

2、邊緣追蹤

edge chasing方法是一種分布式的檢測死鎖的辦法,他通過每個節點發送消息給下一個節點,發送的消息為此節點正在等待的節點,如果最後消息中出現了一個循環,那麼說明也出現了死鎖,消息的格式為<T->U>,代表事務T等待事務U釋放鎖,如果發送U,U正好在等待W,則這個消息就會被改為<T->U->W>,以此類推。整體上說是一種消息建構的模式。

事務的恢複

事務的失敗處理在整個事務的過程中是非常重要的,你要保證所有的狀态又能夠恢複到事務之前發生的樣子。這裡面的主要原理是靠記錄在永久存儲中的記錄來進行資料的恢複的。事務的管理可以通過一個簡單的機理實作----recovery manager事務管理器。

1、recovery manager

事務管理器有後面一些功能:(1)、對于送出好的事務,儲存對象到永久存儲中。(2)、在伺服器當機之後,能夠還原這些對象。(3)、能夠重新組織恢複檔案提高恢複的性能。(4)、重新配置設定存儲空間在恢複檔案中。

2、recovery file

恢複檔案中主要包含了3個東西:1、Object,對象的值。2、Transaction status事務的狀态。3、Intentions list,儲存了事務在執行的過程中儲存的一個個的臨時,格式為<objectID, Pi>,Pi為對象在恢複檔案中的位置。借此可以完成對于對象的恢複。

3、logging

日志技術在恢複事務的過程中起到一個記錄事務曆史記錄的作用。通過事務的送出完成,不斷在恢複檔案的尾部追加内容,以此完成記錄,要做恢複操作的時候,就從後往前恢複。

4、shadow versions