1. 程式人生 > >分散式系統原理(8)基於 MVCC 的分散式事務

分散式系統原理(8)基於 MVCC 的分散式事務

基於 MVCC 的分散式事務

實現分散式事務除了使用類似“兩階段提交”協議等方式外,另一種簡單高效的方式就是使用MVCC(Multi-version Cocurrent Control,多版本併發控制)技術。MVCC 技術最初也是在資料庫系統中被提出,但這種思想並不侷限於單機的分散式系統,在分散式系統中同樣有效

MVCC 簡介

顧名思義,MVCC 即多個不同版本的資料實現併發控制的技術,其基本思想是為每次事務生成一個新版本的資料,在讀資料時選擇不同版本的資料即可以實現對事務結果的完整性讀取。在使用MVCC 時,每個事務都是基於一個已生效的基礎版本進行更新,事務可以並行進行,從而可以產生一種圖狀結構

如上圖所示,基礎資料的版本為 1,同時產生了兩個事務:事務 A 與事務 B。這兩個事務都各自對資料進行了一些本地修改(這些修改只有事務自己可見,不影響真正的資料),之後事務 A首先提交,生成資料版本 2;基於資料版本 2,又發起了事務 C,事務 C 繼續提交,生成了資料版本 3;最後事務 B 提交,此時事務 B 的結果需要與事務 C 的結果合併,如果資料沒有衝突,即事務B 沒有修改事務 A 與事務 C 修改過的變數,那麼事務 B 可以提交,否則事務 B 提交失敗

MVCC 的流程過程非常類似於 SVN 等版本控制系統的流程,或者說 SVN 等版本控制系統就是使用的 MVCC 思想

事務在基於基礎資料版本做本地修改時,為了不影響真正的資料,通常有兩種做法,一是將基礎資料版本中的資料完全拷貝出來再修改,SVN 即使用了這種方法,SVN check out 即是拷貝的過程;二是每個事務中只記錄更新操作,而不記錄完整的資料,讀取資料時再將更新操作應用到用基礎版本的資料從而計算出結果,這個過程也類似 SVN 的增量提交

分散式 MVCC

分散式 MVCC 的重點不在於併發控制,而在於實現分散式事務。這裡首先給出一個簡化的分散式事務的問題模型,之後對 MVCC 的討論基於該問題展開。假設在一個分散式系統中,更新操作以事務進行,每個事務包括若干個對不同節點的不同更新操作。更新事務必須具有原子性,即事務中的所有更新操作要麼同時在各個節點生效,要麼都不生效。假設不存在併發的事務,即上一個事務成功提交後才進行下一個事務

例如,用(site, k, op, oprd)表示在 site 節點上對變數 k 進行 op 操作,運算元為 oprd。那麼一個典型的事務可能是{(site_A, var1, add, 10), (site_B, var2, sub, 1), (site_A, var3, set, 2)},這事務在site_A 上將變數 var1 加 10,將變數 var3 設定為 2,在 site_B 上將變數 var2 減 1

基於 MVCC 的分散式事務的方法為:為每個事務分配一個遞增的事務編號,這個編號也代表了資料的版本號。當事務在各個節點上執行時,各個節點只需記錄更新操作及事務編號,當事務在各個節點都完成後,在全域性元資訊中記錄本次事務的編號。在讀取資料時,先讀取元資訊中已成功的最大事務編號,再於各個節點上讀取資料,只讀取更新操作編號小於等於最後最大已成功提交事務編號的操作,並將這些操作應用到基礎資料形成讀取結果

假設系統中有兩個節點 A、B。節點 A、節點 B 狀態如下表:

  1. 若此時全域性元資訊中的最大的生效事務序號為 1,則在節點 A 上:var1=1,var2=2,在節點 B上:var3 =2
  2. 若此時全域性元資訊中的最大的生效事務序號為 2,則在節點 A 上:var1= 1+2=3,var2=2,在節點 B 上:var3=2,var4=1

從這個例子可以看出,每個節點上儲存了對資料的更新操作,也就是資料的增量(delta),從而可以在讀取資料時將應用不同的更新操作得出不同的資料版本。上例中,計算編號小於等於 1 的事務操作得出的資料即為版本號為 1 的資料,計算編號小於等於 2 的事務操作得出的資料即為版本號為 2 的資料。在新事務執行過程中,雖然更新操作已經逐步記錄到各個節點,但只要全域性元資訊不修改,始終不會讀到沒有生效的事務資料,從而實現了全域性一致性。另外,由於資料具有多個版本,可以自然實現對歷史版本資料的讀取

上述方法的一個重要問題是,隨著執行的事務越來越多,各個站點儲存的更新操作會越來越多,讀取資料時需要應用的更新操作也越來越多。工程中可以對此週期性的啟動合併操作,將歷史上不再需要的版本合併為一個更新操作。例如,對事務序號小於等於 2 的操作進行合併,合併後的節點狀態如下表:

這裡合併後事務序號設定為合併使用的事務序號。如果節點中存在序號大於 2 的操作,則需要
保留這些操作不參與合併

工程投影

Megastore 中的 MVCC

Megastore 利用了 Big Table 中資料的多版本特性實現分散式的更新事務。每個事務更新的都是不同版本(timestamp)的 Big Table 資料,在讀取資料時利用 timestamp 過濾,從而不會讀到正在進行的尚未生效的事務資料。其原理與本節中介紹完全一致,不再贅述

Doris中的 MVCC

在 Doris系統中,資料按批量進行更新,每個批量的資料都可以認為是一個事務,必須同時原子性的生效。為此,Doris將每條資料附帶了一個匯入的版本號,在讀取資料時根據元資料中已生效的版本號與資料上的匯入版本號做過濾,從而不讀取正在更新的尚未生效的資料,實現了分散式事務更新。其詳細流量與本節中介紹的一致