分布式系统原理 之7 基于MVCC的分布式事务
分布式系統原理
基于MVCC的分布式事務
實現分布式事務除了使用類似“兩階段提交”協議等方式外,另一種簡單高效的方式就是使用MVCC(Multi-version Cocurrent Control,多版本并發控制)技術[3][5]。
1. MVCC簡介
顧名思義,MVCC 即多個不同版本的數據實現并發控制的技術,其基本思想是為每次事務生成一個新版本的數據,在讀數據時選擇不同版本的數據即可以實現對事務結果的完整性讀取。在使用MVCC 時,每個事務都是基于一個已生效的基礎版本進行更新,事務可以并行進行,從而可以產生一種圖狀結構。
MVCC 的流程過程非常類似于 SVN 等版本控制系統的流程,或者說 SVN 等版本控制系統就是使用的 MVCC 思想。
2. 分布式 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 的分布式事務的方法為:為每個事務分配一個遞增的事務編號,這個編號也代表了數據的版本號。當事務在各個節點上執行時,各個節點只需記錄更新操作及事務編號,當事務在各個節點都完成后,在全局元信息中記錄本次事務的編號。在讀取數據時,先讀取元信息中已成功的最大事務編號,再于各個節點上讀取數據,只讀取更新操作編號小于等于最后最大已成功提交事務編號的操作,并將這些操作應用到基礎數據形成讀取結果。
例 2.7.1:假設系統中有兩個節點 A、B。節點 A、節點 B 狀態如下表
| A | set var1 = 1 | 1 |
| A | set var2 = 2 | 1 |
| A | set var1 = var1 + 2 | 2 |
| B | set var3 = 2 | 1 |
| B | set var4 = 1 | 2 |
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.7.1 中事務序號小于等于 2 的操作進行合并,合并后的節點狀態如下表:
| A | set var1 = 3 | 2 |
| A | set var2 = 2 | 2 |
| B | set var3 = 2 | 2 |
| B | set var4 = 1 | 2 |
這里合并后事務序號設置為合并使用的事務序號。如果節點中存在序號大于 2 的操作,則需要保留這些操作不參與合并。
參考:《分布式系統原理介紹》 - 劉杰
總結
以上是生活随笔為你收集整理的分布式系统原理 之7 基于MVCC的分布式事务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式系统原理 之6 两阶段提交协议
- 下一篇: 分布式系统原理 之9 CAP 理论