最新开源:3TS腾讯事务处理技术验证系统(下)
作者:李海翔,騰訊TEG數(shù)據(jù)庫技術(shù)專家
近日,中國人民大學(xué)-騰訊協(xié)同創(chuàng)新實(shí)驗(yàn)室正式舉行揭牌儀式。據(jù)了解,雙方已聚焦在數(shù)據(jù)庫基礎(chǔ)研究領(lǐng)域進(jìn)行了多年的前沿產(chǎn)學(xué)研合作,以及數(shù)據(jù)庫人才合作培養(yǎng)計(jì)劃,在推進(jìn)數(shù)據(jù)庫安全可控的同時(shí)面向未來大規(guī)模多場景數(shù)字化時(shí)代進(jìn)行前沿創(chuàng)新研究儲(chǔ)備,其中實(shí)驗(yàn)室輸出的包括“全時(shí)態(tài)數(shù)據(jù)庫系統(tǒng)”等多項(xiàng)成果相繼被VLDB等國際頂會(huì)收錄,同時(shí)申請獲得了多項(xiàng)國家技術(shù)專利。
在本次實(shí)驗(yàn)室揭牌亮相的同時(shí),騰訊與中國人民大學(xué)研究團(tuán)隊(duì)還開源公布了一項(xiàng)最新合作研究成果——3TS騰訊事務(wù)處理技術(shù)驗(yàn)證系統(tǒng)。
Tencent Transaction ProcessingTestbed System(簡稱3TS),是騰訊公司TDSQL團(tuán)隊(duì)與中國人民大學(xué)數(shù)據(jù)工程與知識(shí)工程教育部重點(diǎn)實(shí)驗(yàn)室,聯(lián)合研制的面向數(shù)據(jù)庫事務(wù)處理的驗(yàn)證系統(tǒng)。該系統(tǒng)旨在通過設(shè)計(jì)和構(gòu)建事務(wù)(包括分布式事務(wù))處理統(tǒng)一框架,并通過框架提供的訪問接口,方便使用者快速構(gòu)建新的并發(fā)控制算法;通過驗(yàn)證系統(tǒng)提供的測試床,可以方便用戶根據(jù)應(yīng)用場景的需要,對(duì)目前主流的并發(fā)控制算法在相同的測試環(huán)境下進(jìn)行公平的性能比較,選擇一種最佳的并發(fā)控制算法。目前,驗(yàn)證系統(tǒng)已集成13種主流的并發(fā)控制算法,提供了TPC-C、Sysbench、YCSB等常見基準(zhǔn)測試。3TS還進(jìn)一步提供了一致性級(jí)別的測試基準(zhǔn),針對(duì)現(xiàn)階段分布式數(shù)據(jù)庫系統(tǒng)的井噴式發(fā)展而造成的系統(tǒng)選擇難問題,提供一致性級(jí)別判別與性能測試比較。
3TS系統(tǒng)旨在深度探索數(shù)據(jù)庫事務(wù)處理相關(guān)理論與實(shí)現(xiàn)技術(shù),其核心理念是:開放、深度、進(jìn)化。開放,秉承開源之心,共享知識(shí)、共享技術(shù);深度,踐行系統(tǒng)化鉆研之精神,對(duì)于事務(wù)處理技術(shù)的本質(zhì)問題進(jìn)行研究,不破樓蘭終不還;進(jìn)化,路漫漫其修遠(yuǎn)兮,吾將上下而求索,不斷前行,不斷推進(jìn)。
?
在上一個(gè)章節(jié)文章中,我們介紹了3TS的框架和基礎(chǔ)內(nèi)容(詳情訪問《騰訊與中國人民大學(xué)開源最新研究成果:3TS騰訊事務(wù)處理技術(shù)驗(yàn)證系統(tǒng)》),本章節(jié)繼續(xù)深入介紹多種并發(fā)訪問控制算法。
?
5、3TS 提供的并發(fā)訪問控制算法
5.4?樂觀并發(fā)控制協(xié)議(OCC、FOCC、BOCC)
在樂觀并發(fā)控制協(xié)議下,事務(wù)的執(zhí)行流程被分成三個(gè)階段:讀取、驗(yàn)證、寫入階段[5],如圖5所示。
圖5 OCC算法的三個(gè)階段圖
這三個(gè)階段的劃分,帶來的優(yōu)勢非常明顯:
事務(wù)處理性能高:事務(wù)的效率的提升主要是依靠第一階段通過讀寫互不阻塞來保證的,這極大提高了讀寫、寫讀這兩種情況的并發(fā)度,多核的硬件資源能夠得到充分利用;并且對(duì)于只讀事務(wù)因不被阻塞而倍顯友好。
可避免死鎖問題:OCC可以在第一階段通過對(duì)讀寫對(duì)象排序、第二階段按序加鎖可避免死鎖。這在與封鎖并發(fā)訪問控制算法對(duì)死鎖問題解決的對(duì)比下獲勝。這兩點(diǎn)優(yōu)勢使得OCC在處理分布式事務(wù)、高數(shù)據(jù)熱點(diǎn)、高通信延時(shí)等場景下依然能夠支持高事務(wù)吞吐率,在高并發(fā)場景下沒有明顯的系統(tǒng)性能抖動(dòng)現(xiàn)象(文獻(xiàn)[169]通過實(shí)驗(yàn)表明高競爭下OCC算法性能不高)。
數(shù)據(jù)一致性的正確性得到保證:正確性是在第二階段驗(yàn)證階段保證的,其原理是通過事務(wù)沖突關(guān)系構(gòu)造有向圖檢測是否存在有環(huán)的情況而通過回滾某個(gè)事務(wù)破除環(huán)的存在,達(dá)到解決事務(wù)沖突的目的;而寫寫沖突是在驗(yàn)證階段通常通過封鎖機(jī)制保證。但工程實(shí)現(xiàn),有不同的方式,如文獻(xiàn)[9]改進(jìn)了OCC算法,在驗(yàn)證階段檢查本事務(wù)的讀集如果被其他并發(fā)事務(wù)寫過即觸發(fā)回滾以避免數(shù)據(jù)不一致,從而不用構(gòu)造有向圖檢測是否存在有環(huán)存在。
3TS中,根據(jù)驗(yàn)證機(jī)制的不同,實(shí)現(xiàn)了三個(gè)不同的樂觀并發(fā)控制協(xié)議:(1)OCC:對(duì)[5]中的ParallelValidation算法的實(shí)現(xiàn);(2)BOCC:對(duì)[6]中的Backward Validation算法的實(shí)現(xiàn);(3)FOCC:對(duì)[6]中的Forward Validation算法的實(shí)現(xiàn)。需要注意的是,3TS中,由于沒有全局時(shí)間戳機(jī)制(后續(xù)計(jì)劃會(huì)增加全局時(shí)鐘),驗(yàn)證階段需要對(duì)比的讀寫集大小可能由于時(shí)鐘不同步產(chǎn)生偏差,因此可能會(huì)對(duì)不同算法的效率產(chǎn)生不同程度的影響。
1. 三個(gè)協(xié)議對(duì)讀取階段的處理是相同的,主要為:
a)?讀操作時(shí),先把讀操作存入讀集,并按要求讀到所需要的數(shù)據(jù);
b) 寫操作時(shí),把寫操作寫入寫集
2. 驗(yàn)證階段,三個(gè)協(xié)議的主要思想都是保證事務(wù)按照進(jìn)入驗(yàn)證的順序進(jìn)行排序,通過檢查讀寫集保證事務(wù)的操作結(jié)果滿足進(jìn)入驗(yàn)證的先后順序。不同協(xié)議的檢查讀寫集的方法存在不同。
5.4.1 OCC
驗(yàn)證操作的主要流程為(當(dāng)前待驗(yàn)證事務(wù)的開始時(shí)間戳記為start_ts,進(jìn)入驗(yàn)證的時(shí)間戳記為finish_ts):
a)?獲取在(start_ts,finish_ts]這一時(shí)間段內(nèi)的提交的事務(wù)集合,記為History,遍歷History中事務(wù)的寫集,如果與當(dāng)前事務(wù)的讀集存在交集,則當(dāng)前事務(wù)驗(yàn)證失敗;
b)?獲取處在驗(yàn)證階段的事務(wù)集合,記為Active,檢查集合中事務(wù)的寫集和當(dāng)前事務(wù)的讀集是否存在交集,如果存在,則驗(yàn)證失敗;
5.4.2 BOCC
要求驗(yàn)證階段和寫入階段在同一個(gè)臨界區(qū)中執(zhí)行,流程為獲取在(start_ts,finish_ts]這一時(shí)間段內(nèi)的提交的事務(wù)集合,記為History,遍歷History中事務(wù)的寫集,如果與當(dāng)前事務(wù)的讀集存在交集,則當(dāng)前事務(wù)驗(yàn)證失敗。BOCC具有比較明顯的缺點(diǎn),包括只讀事務(wù)也需要進(jìn)行驗(yàn)證、待驗(yàn)證事務(wù)的讀集較大時(shí)對(duì)驗(yàn)證效率影響較大,對(duì)于長事務(wù)需要保留大量期間已提交事務(wù)的寫集等。
5.4.3 FOCC
要求驗(yàn)證階段和寫入階段在同一個(gè)臨界區(qū)中執(zhí)行,檢查待驗(yàn)證事務(wù)的寫集是否與當(dāng)前活躍(正在讀寫階段)事務(wù)的讀集如果存在有交集,則當(dāng)前事務(wù)驗(yàn)證階段。FOCC較BOCC具有只讀事務(wù)可以跳過驗(yàn)證階段,與活躍事務(wù)進(jìn)行驗(yàn)證開銷較小的優(yōu)點(diǎn)。
3. 三個(gè)協(xié)議對(duì)寫入階段的處理是相同的,主要為:獲取提交時(shí)間戳,將寫集中數(shù)據(jù)寫入數(shù)據(jù)庫,并設(shè)置數(shù)據(jù)的提交時(shí)間戳為獲取到的提交時(shí)間戳。
?
5.5 優(yōu)化的樂觀并發(fā)控制協(xié)議(MaaT、Sundial、Silo)
傳統(tǒng)的樂觀并發(fā)控制協(xié)議依照進(jìn)入驗(yàn)證的順序來確定事務(wù)是否可以提交,與傳統(tǒng)的OCC相比,一些優(yōu)化的樂觀并發(fā)控制協(xié)議通過放寬這一要求,減少了不必要回滾。現(xiàn)在,基于OCC的改進(jìn)版本有很多,如ROCC[20]、自適應(yīng)OCC[21]等。
在3TS中,我們集成了三種較新的樂觀并發(fā)控制算法,包括MaaT、Sunidal和Silo。期待有更多的并發(fā)算法集成到3TS中。
5.5.1 MaaT
MaaT[6]采用了動(dòng)態(tài)時(shí)間戳范圍調(diào)整的方式來降低事務(wù)回滾率。其主要思想是通過事務(wù)間的讀寫操作之間形成的關(guān)系,確定事務(wù)的先后順序,從而確定可串行化要求的等價(jià)串行序列中事務(wù)的先后順序。例如,Ti事務(wù)讀x之后,Tj事務(wù)需要更新x,則在等價(jià)串行序列中,Ti需要排在Tj的前面。
MaaT需要在每個(gè)數(shù)據(jù)項(xiàng)上額外維護(hù)元數(shù)據(jù),包括:(1)記錄讀了該數(shù)據(jù)項(xiàng)但仍未提交的事務(wù)ID,稱為讀事務(wù)列表readers;(2)記錄要寫該數(shù)據(jù)項(xiàng)但仍未提交的事務(wù)ID,稱為寫事務(wù)列表writers;(3)讀過該數(shù)據(jù)項(xiàng)的事務(wù)中最大的提交時(shí)間戳,記為Rts;(4)寫過該數(shù)據(jù)項(xiàng)的事務(wù)中最大的提交時(shí)間戳,記為wts。每個(gè)事務(wù)會(huì)有一個(gè)時(shí)間戳范圍[lower,upper),并初始化為[0,+)。事務(wù)中的各個(gè)操作的流程主要包括:
1. 讀操作
a)?將數(shù)據(jù)項(xiàng)的寫事務(wù)列表存入事務(wù)的uncommitted_writes;
b)?更新當(dāng)前事務(wù)的greatest_write_timestamp=Max{greatest_write_timestamp,wts};
c)?將當(dāng)前事務(wù)ID寫入所讀數(shù)據(jù)項(xiàng)的讀事務(wù)列表;
d)?讀對(duì)應(yīng)數(shù)據(jù)項(xiàng),并將讀到的數(shù)據(jù)存入讀集。
2.?寫操作
a)?將數(shù)據(jù)項(xiàng)的寫事務(wù)列表存入事務(wù)的uncommitted_writes_y。
b)?將數(shù)據(jù)項(xiàng)的讀事務(wù)列表存入事務(wù)的uncommitted_reads。
c)?更新當(dāng)前事務(wù)的greatest_write_timestamp=Max{greatest_write_timestamp,wts},greatest_read_timestamp=Max{greatest_red_timestamp,rts};
d) 將當(dāng)前事務(wù)ID寫入要寫數(shù)據(jù)項(xiàng)的寫事務(wù)列表;
e)?將要寫的數(shù)據(jù)項(xiàng)新值存入寫集;
3.?驗(yàn)證階段(事務(wù)協(xié)調(diào)者根據(jù)所有參與者返回的lower和upper取交集確定lower和upper,如下操作均在參與者上執(zhí)行):
a)?更新lower=Max{greatest_write_timestamp+1,lower};
b)?保證uncommitted_writes(未提交寫事務(wù)列表)中事務(wù)的lower大于當(dāng)前事務(wù)的upper;
如果uncommitted_writes中的事務(wù)已經(jīng)驗(yàn)證通過,修改當(dāng)前事務(wù)的upper;
否則將uncommitted_writes中的事務(wù)放進(jìn)當(dāng)前事務(wù)的after隊(duì)列(隊(duì)列中的事務(wù)需要在當(dāng)前事務(wù)之后提交);
c)?更新lower=Max{greatest_read_timestamp+1,lower};
d) 保證uncommitted_reads(未提交讀事務(wù)列表)中事務(wù)的upper小于當(dāng)前事務(wù)的lower;
如果uncommitted_reads中的事務(wù)已經(jīng)驗(yàn)證通過,修改當(dāng)前事務(wù)的lower;
否則將列表中的事務(wù)放進(jìn)當(dāng)前事務(wù)的before隊(duì)列(隊(duì)列中的事務(wù)需要在當(dāng)前事務(wù)之前提交);
e) 調(diào)整uncommitted_writes_y(存在寫寫沖突的未提交事務(wù)列表)和當(dāng)前事務(wù)的先后關(guān)系;
如果uncommitted_writes_y中的事務(wù)已經(jīng)驗(yàn)證通過,修改當(dāng)前事務(wù)的lower大于列表中已驗(yàn)證通過事務(wù)的upper;
否則將列表中的事務(wù)事務(wù)放進(jìn)當(dāng)前事務(wù)after隊(duì)列;
f) 檢查lower<upper是否成立,不成立則回滾當(dāng)前事務(wù);
g) 協(xié)調(diào)調(diào)整當(dāng)前事務(wù)的lower和before隊(duì)列中事務(wù)的upper,保證當(dāng)前事務(wù)的lower大于before隊(duì)列事務(wù)的upper;
h)?協(xié)調(diào)調(diào)整當(dāng)前事務(wù)的upper和after隊(duì)列中事務(wù)的lower,保證當(dāng)前事務(wù)的upper小于after隊(duì)列中事務(wù)的lower;
4.?寫入階段(首先在協(xié)調(diào)者上確定提交時(shí)間戳(commit_ts)為最終時(shí)間戳區(qū)間的lower,然后在參與者上執(zhí)行如下操作)
a)?對(duì)于讀集中的每個(gè)元素,將當(dāng)前事務(wù)從對(duì)應(yīng)數(shù)據(jù)項(xiàng)的讀事務(wù)列表中清除,并進(jìn)行如下操作:
保證寫事務(wù)列表中事務(wù)的lower大于當(dāng)前事務(wù)的commit_ts;
更新Rts=Max{commit_ts,Rts};
b)?對(duì)于寫集中的每個(gè)元素,將當(dāng)前事務(wù)從對(duì)應(yīng)數(shù)據(jù)項(xiàng)的寫事務(wù)列表中清除,并進(jìn)行如下操作:
保證寫事務(wù)列表中事務(wù)的upper小于當(dāng)前事務(wù)的commit_ts。
保證讀事務(wù)列表中事務(wù)的upper小于當(dāng)前事務(wù)的commit_ts。
更新Wts=Max{commit_ts,Wts}。
5.5.2 Sundial
Sundial[8]通過動(dòng)態(tài)計(jì)算提交時(shí)間戳以減少回滾率。同時(shí)在數(shù)據(jù)項(xiàng)上維護(hù)租約(即數(shù)據(jù)項(xiàng)的可以被訪問到的邏輯時(shí)間范圍),便于在發(fā)生沖突時(shí)快速確定事務(wù)的先后順序。此外Sundial在樂觀并發(fā)控制的基礎(chǔ)上,結(jié)合了悲觀并發(fā)控制的思路,讀寫/寫讀沖突用OCC、寫寫沖突用2PL鎖的方式來減少分布式事務(wù)協(xié)調(diào)調(diào)度的開銷。
Sundial在數(shù)據(jù)項(xiàng)上維護(hù)租約(wts,rts),分別代表了數(shù)據(jù)項(xiàng)最后被寫入的時(shí)間和數(shù)據(jù)項(xiàng)可以被讀到的最晚時(shí)間。在事務(wù)上維護(hù)commit_ts,代表事務(wù)的提交時(shí)間戳。在讀寫集中額外維護(hù)orig.rts和orig.wts,代表訪問數(shù)據(jù)項(xiàng)當(dāng)時(shí)的rts和wts。我們對(duì)Sundial的主要操作的執(zhí)行流程介紹如下:
1.?讀操作
a)?首先從讀寫集中讀取所需要的數(shù)據(jù)項(xiàng),如果讀寫集中不存在所需數(shù)據(jù)項(xiàng)
則需要訪問數(shù)據(jù)存儲(chǔ),找到對(duì)應(yīng)數(shù)據(jù)項(xiàng)并讀取,并記錄此時(shí)數(shù)據(jù)項(xiàng)的wts和rts,記為orig.wts和orig.rts;
更新當(dāng)前事務(wù)的commit_ts=max{orig.wts,commit_ts};
b)?? 如果讀寫集中存在所需數(shù)據(jù),直接返回對(duì)應(yīng)數(shù)據(jù);
2. 寫操作
a)?首先從寫集中找到所要修改的數(shù)據(jù)項(xiàng),如果寫集中不存在所需數(shù)據(jù)項(xiàng)
對(duì)元組加鎖,若加鎖失敗,存入等待隊(duì)列waiting_set;
否則,直接返回?cái)?shù)據(jù)項(xiàng),以及對(duì)應(yīng)的wts和rts,記為orig.wts和orig.rts;
b)?如果讀寫集中存在當(dāng)前待更新的數(shù)據(jù)項(xiàng)對(duì)應(yīng)元素,則在寫集中對(duì)其進(jìn)行更新;
c)?更新當(dāng)前事務(wù)的commit_ts=max{orig.rts,commit_ts};
3. 驗(yàn)證階段
a)?首先計(jì)算出提交時(shí)間戳commit_ts,主要通過如下兩步(該步驟為3TS中實(shí)現(xiàn)新增,由于讀寫操作在參與者上進(jìn)行,協(xié)調(diào)者在進(jìn)入驗(yàn)證前需要匯總所有參與者的信息得到commit_ts):
遍歷寫集,更新commit_ts大于等于寫集中所有元素的orig.rts;
遍歷讀集,更新commit_ts大于等于讀集的orig.wts;
b)?驗(yàn)證讀集中的每一個(gè)元素:
如果提交時(shí)間戳commit_ts小于rts,跳過當(dāng)前元素;
嘗試更新元組租約:(1)如果orig.wts!=wts,即當(dāng)時(shí)讀取的wts和元組現(xiàn)在的wts不同,當(dāng)前事務(wù)需要回滾;(2)如果當(dāng)前元組被加了鎖,當(dāng)前事務(wù)回滾;(3)否則更新元組的rts=Max{rts,commit_ts};
4.?寫入階段
a)?提交操作,對(duì)寫集中元素對(duì)應(yīng)的數(shù)據(jù)項(xiàng)更新并解鎖;
b)?回滾操作,對(duì)寫集中元素對(duì)應(yīng)的數(shù)據(jù)項(xiàng)解鎖。
?
5.5.3 Silo
Silo[9]與傳統(tǒng)樂觀并發(fā)控制協(xié)議的主要區(qū)別在驗(yàn)證階段。其主要思想是驗(yàn)證自己讀到的數(shù)據(jù)是否被其他事務(wù)修改。因此,事務(wù)的驗(yàn)證流程為:
為所有寫集中的元素對(duì)應(yīng)的數(shù)據(jù)項(xiàng)加鎖;
驗(yàn)證讀集中的數(shù)據(jù):(1)被別的事務(wù)修改或(2)由別的事務(wù)加鎖。如果存在兩種情況中的一種,則當(dāng)前事務(wù)回滾;
獲得提交時(shí)間戳并進(jìn)入寫入階段。
?
5.6 確定性并發(fā)控制協(xié)議(Calvin)
Calvin[10]的主要思想是提前確定好事務(wù)的順序,之后事務(wù)則會(huì)嚴(yán)格按照確定的順序進(jìn)行執(zhí)行。避免了其他并發(fā)控制協(xié)議所需的分布式協(xié)調(diào)開銷。
Calvin算法需要增加兩個(gè)模塊:定序器(Sequencer)和調(diào)度器(Scheduler)。其中定序器用于攔截事務(wù)并且為這些事務(wù)規(guī)定順序(順序就是事務(wù)進(jìn)入定序器的順序),調(diào)度器負(fù)責(zé)按照定序器給定的順序執(zhí)行事務(wù)。
Calvin事務(wù)執(zhí)行流程主要包括(假設(shè)事務(wù)需要使用到Server1和Server2的數(shù)據(jù)):
Client將事務(wù)發(fā)送給Server1節(jié)點(diǎn);
Server1的定序器接受到事務(wù),將事務(wù)放入一個(gè)batch中;
經(jīng)過batch規(guī)定的時(shí)間后,定序器將包含事務(wù)的batch發(fā)送給事務(wù)對(duì)應(yīng)的兩個(gè)參與者節(jié)點(diǎn)Server1和Server2的調(diào)度器上;
Server1和Server2的調(diào)度器接收到batch,根據(jù)batch事先規(guī)定的順序進(jìn)行加鎖。之后將batch中的事務(wù)放入WorkThread(工作線程)中執(zhí)行;
Server1和Server2執(zhí)行完畢batch中的所有事務(wù)后,將返回消息發(fā)送給Server1;
Server1向Client返回事務(wù)執(zhí)行完畢。
事務(wù)執(zhí)行時(shí)的加鎖機(jī)制依然遵循2PL的邏輯,主要包括:
1. ?讀操作:
a)? 檢查數(shù)據(jù)項(xiàng)上是否存在排它鎖,檢查數(shù)據(jù)項(xiàng)的waiters列表是否為空。若不存在排他鎖且waiters列表為空,則讀取對(duì)應(yīng)數(shù)據(jù)項(xiàng),并將當(dāng)前事務(wù)放入owner;
b)??否則,加鎖存在沖突,將當(dāng)前事務(wù)存入waiters等待事務(wù)列表;
2. ?寫操作:
a)??檢查數(shù)據(jù)項(xiàng)上是否存在鎖,檢查數(shù)據(jù)項(xiàng)的waiters事務(wù)是否存在。若不存在排他鎖且waiters列表為空,將當(dāng)前事務(wù)放入owner;
b)??否則,加鎖存在沖突,將當(dāng)前事務(wù)存入waiters等待事務(wù)列表。
?
5.7基于快照隔離的并發(fā)控制協(xié)議(SSI、WSI)
快照隔離(Snapshot Isolation, SI)[11]主要對(duì)同一數(shù)據(jù)項(xiàng)上的寫寫沖突和寫讀沖突進(jìn)行了約束。對(duì)于寫寫沖突,其規(guī)定,數(shù)據(jù)項(xiàng)不能同時(shí)被兩個(gè)事務(wù)并發(fā)修改,另外遵循“先提交者獲勝策略”,先提交的寫事務(wù)將會(huì)成功,另一個(gè)事務(wù)將會(huì)回滾。對(duì)于寫讀沖突,其規(guī)定事務(wù)只能讀取最新已提交的數(shù)據(jù)項(xiàng)版本,即讀取事務(wù)開始時(shí)符合一致性狀態(tài)的數(shù)據(jù)。因此,其具有讀寫互不阻塞的事務(wù)處理特性。SI機(jī)制本身不能做到可串行化,因此在SI基礎(chǔ)上實(shí)現(xiàn)可串行化,需要引入額外的操作。在3TS中,實(shí)現(xiàn)了兩種主流的可串行化快照隔離機(jī)制:(1)SSI:Serializable Snapshot Isolation;(2)WSI:Write SnapshotIsolation。
5.7.1 SSI
如果事務(wù)Ti讀了x,事務(wù)Tj寫入了一個(gè)x的新版本,那么我們稱Ti讀寫依賴于Tj。SSI[12,13]通過理論證明,發(fā)現(xiàn)要在SI基礎(chǔ)上做到可串行化,只需要禁止Ti讀寫依賴于Tj,且Tk讀寫依賴于Ti這種情況即可。算法的核心就在于動(dòng)態(tài)檢測出這種情況,因此會(huì)在每個(gè)事務(wù)記錄inConflict和outConflict兩個(gè)字段:inConflict記錄了讀寫依賴于當(dāng)前事務(wù)的事務(wù),outConflict記錄了當(dāng)前事務(wù)讀寫依賴的事務(wù)。當(dāng)發(fā)現(xiàn)當(dāng)前事務(wù)這兩個(gè)字段都不為空時(shí),則立刻回滾當(dāng)前事務(wù),從而保證了可串行化。
5.7.2 WSI
WSI[14]通過將寫寫沖突的檢測轉(zhuǎn)化為讀寫沖突的檢測,并避免讀寫沖突來做到可串行化。
對(duì)于每個(gè)事務(wù),WSI需要維護(hù)它的讀集和寫集。為了避免幻象,對(duì)于范圍查詢讀集里放的是查詢謂詞。對(duì)于每一個(gè)記錄需要維護(hù)last commit時(shí)間戳,每當(dāng)事務(wù)提交會(huì)更新所有修改過的行的last commit時(shí)間戳為事務(wù)的提交時(shí)間戳。事務(wù)提交前的檢查如下:檢查所有讀集中元素對(duì)應(yīng)的數(shù)據(jù)項(xiàng),如果它的last commit時(shí)間戳大于當(dāng)前事務(wù)的start timestamp(消除了讀寫沖突),就回滾當(dāng)前事務(wù)。
?
5.8 基于動(dòng)態(tài)時(shí)間戳的并發(fā)訪問控制算法
第五點(diǎn),我們介紹了一些OCC的改進(jìn)算法,其中提及的MaaT、Sundial,是在利用了OCC的框架,結(jié)合TO算法進(jìn)行改進(jìn)的一種方式。但是,他們又不只是基于TO,傳統(tǒng)的TO算法是一種靜態(tài)的算法,時(shí)間戳是確定的、剛性的。而MaaT、Sundial以及Tictoc[22]等,采用的是動(dòng)態(tài)時(shí)間戳分配算法。這樣把OCC框架(策略)的優(yōu)勢、動(dòng)態(tài)時(shí)間戳的優(yōu)勢結(jié)合起來。
動(dòng)態(tài)時(shí)間戳分配(dynamictimestamp allocation,簡稱DTA),最先在文獻(xiàn)[23]中提出,之后被多篇文獻(xiàn)引用和應(yīng)用。此算法的核心思想:是不依賴中心化的時(shí)間戳機(jī)制、根據(jù)數(shù)據(jù)項(xiàng)上的并發(fā)事務(wù)沖突關(guān)系、通過動(dòng)態(tài)調(diào)整數(shù)據(jù)項(xiàng)上的事務(wù)的執(zhí)行時(shí)間段,來實(shí)現(xiàn)全局事務(wù)的可串行化。該算法避免一些在非動(dòng)態(tài)時(shí)間戳分配算法下被認(rèn)為是存在沖突而被回滾的情況。
文獻(xiàn)[22]介紹了一種名為“Time Traveling Optimistic Concurrency Control(TicToc)”的算法,該算法基于OCC算法,提出“data-driven timestamp management”的思路,即不給每個(gè)事務(wù)分配獨(dú)立的(全局)時(shí)間戳,而是在訪問數(shù)據(jù)項(xiàng)時(shí)嵌入必要的(本地)時(shí)間戳信息,用于為每個(gè)事務(wù)在提交之前計(jì)算出有效的提交時(shí)間戳,而經(jīng)計(jì)算(不是預(yù)先分配)而得的提交時(shí)間戳用于解決并發(fā)沖突從而保證事務(wù)是可串行化的。因不用在分布式事務(wù)開始和提交階段依賴全局的協(xié)調(diào)器為事務(wù)分配時(shí)間戳,所以在這個(gè)階段,可實(shí)現(xiàn)去中心化的目的。因結(jié)合使用OCC機(jī)制,所以可縮小事務(wù)沖突重疊的執(zhí)行時(shí)間段,提高了并發(fā)度。
文獻(xiàn)[7]基于OCC框架,實(shí)現(xiàn)了DTA算法,即前述的MaaT算法(第5.5節(jié)),這里不再展開。
?
6、3TS 待改進(jìn)功能
3TS系統(tǒng)提供了統(tǒng)一的技術(shù)研制平臺(tái),可以對(duì)多種并發(fā)訪問控制算法進(jìn)行統(tǒng)一對(duì)比、分析。目前仍然存在如下待改進(jìn)的地方,會(huì)對(duì)不同并發(fā)控制協(xié)議帶來不同程度的影響,影響實(shí)驗(yàn)結(jié)果的準(zhǔn)確性。我們主要總結(jié)了如下待改進(jìn)的功能點(diǎn):
消息通信機(jī)制,可以考慮通過RPC等方式替代現(xiàn)有的消息通信機(jī)制,從而減少消息隊(duì)列中的等待對(duì)事務(wù)性能的影響。
線程調(diào)度模型(一個(gè)線程綁定一個(gè)核),可以考慮引入更多的調(diào)度模型,幫助分析線程調(diào)度方法對(duì)并發(fā)控制協(xié)議性能的影響。
不支持SQL語句,需要引入SQL解析等操作,來更好的模擬真實(shí)數(shù)據(jù)庫場景。
不支持全部的TPCC事務(wù),需要進(jìn)一步引入Delivery等事務(wù)類型,從而支持全部的TPCC測試。
全局時(shí)間,沒有全局時(shí)間戳生成模塊,使用機(jī)器本地的時(shí)間戳可能會(huì)存在時(shí)鐘偏差,對(duì)OCC等協(xié)議造成影響。
死鎖檢測算法,可以考慮引入死鎖檢測算法,來更好的分析其他的2PL協(xié)議。
Deneva中各個(gè)算法不可以動(dòng)態(tài)切換,每種算法使用宏(C語言的宏)來進(jìn)行切換,這要求系統(tǒng)切換算法執(zhí)行時(shí),每次都要?jiǎng)討B(tài)編譯后再運(yùn)行,這是一個(gè)待改進(jìn)點(diǎn)。
?
致謝
感謝騰訊CynosDB(TDSQL)團(tuán)隊(duì)與中國人民大學(xué)數(shù)據(jù)工程與知識(shí)工程教育部重點(diǎn)實(shí)驗(yàn)室對(duì)本項(xiàng)工作的支持,感謝趙展浩,劉暢,趙泓堯等同學(xué)為本文做出貢獻(xiàn)。
?
Reference
[1] Rachael Harding, Dana Van Aken, Andrew Pavlo, Michael Stonebraker: AnEvaluation of Distributed Concurrency Control. Proc. VLDB Endow. 10(5): 553-564(2017)
[2] ??? Philip A. Bernstein, NathanGoodman: Concurrency Control in Distributed Database Systems. ACM Comput. Surv.13(2): 185-221 (1981)
[3] Daniel J. Rosenkrantz, Richard Edwin Stearns, Philip M. Lewis II:System Level Concurrency Control for Distributed Database Systems. ACM Trans.Database Syst. 3(2): 178-198 (1978)
[4] D. P. Reed. Naming and synchronization in a decentralized computersystem. PhD thesis, Massachusetts Institute of Technology, Cambridge, MA, USA,1978.
[5] H. T. Kung, John T. Robinson: On Optimistic Methods for ConcurrencyControl. ACM Trans. Database Syst. 6(2): 213-226 (1981)
[6] Theo H?rder: Observations on optimistic concurrency control schemes.Inf. Syst. 9(2): 111-120 (1984)
[7] Hatem A. Mahmoud, Vaibhav Arora, Faisal Nawab, Divyakant Agrawal, AmrEl Abbadi: MaaT: Effective and scalable coordination of distributedtransactions in the cloud. Proc. VLDB Endow. 7(5): 329-340 (2014)
[8] Xiangyao Yu, Yu Xia, Andrew Pavlo, Daniel Sánchez, LarryRudolph, Srinivas Devadas:
Sundial: Harmonizing Concurrency Control and Caching in a Distributed OLTPDatabase Management System. Proc. VLDB Endow. 11(10): 1289-1302 (2018)
[9] Stephen Tu, Wenting Zheng, Eddie Kohler, Barbara Liskov, Samuel Madden:Speedy transactions in multicore in-memory databases. SOSP 2013: 18-32
[10] Alexander Thomson, Thaddeus Diamond, Shu-Chun Weng, Kun Ren, PhilipShao, Daniel J. Abadi: Calvin: fast distributed transactions for partitioneddatabase systems. SIGMOD Conference 2012: 1-12
[11] Hal Berenson, Philip A. Bernstein, Jim Gray, Jim Melton, Elizabeth J.O'Neil, Patrick E. O'Neil: A Critique of ANSI SQL Isolation Levels. SIGMODConference 1995: 1-10
[12] Alan D. Fekete, Dimitrios Liarokapis, Elizabeth J. O'Neil, Patrick E.O'Neil, Dennis E. Shasha: Making snapshot isolation serializable. ACM Trans.Database Syst. 30(2): 492-528 (2005)
[13] Michael J. Cahill, Uwe R?hm, Alan D. Fekete: Serializable isolationfor snapshot databases. SIGMOD Conference 2008: 729-738
[14] Maysam Yabandeh, Daniel Gómez Ferro: A critique of snapshotisolation. EuroSys 2012: 155-168
[15] https://en.wikipedia.org/wiki/Distributed_transaction
[16] P. Bernstein, V. Hadzilacos, and N. Goodman. Concurrency Control andRecovery in Database Systems. Addison–Wesley, 1987.
[17] D. R. Ports and K. Grittner, “Serializable snapshot isolation inpostgresql,” PVLDB, vol. 5, no. 12, pp. 1850–1861, 2012.
[18] J.B?ttcher, et al., ScalableGarbage Collection for In-Memory MVCC Systems, in?VLDB,2019
[19] Yingjun Wu, Joy Arulraj, Jiexi Lin, Ran Xian, Andrew Pavlo:An EmpiricalEvaluation of In-Memory Multi-Version Concurrency Control. Proc. VLDBEndow. 10(7): 781-792 (2017)
[20] D. Lomet and M. F. Mokbel, “Locking key ranges with unbundledtransaction services,” VLDB, pp. 265–276, 2009.
[21] Jinwei Guo, Peng Cai, Jiahao Wang, Weining Qian, Aoying Zhou:Adaptive Optimistic Concurrency Control for Heterogeneous Workloads. PVLDB12(5): 584-596 (2019)
[22] X. Yu, A. avlo, D. Sanchez, and S.Devadas, “Tictoc: Time traveling optimistic concurrency control,” in Proceedingsof SIGMOD, vol. 8, 2016, pp. 209–220.
[23] Rudolf Bayer,Klaus Elhardt, Johannes Heigert, Angelika Reiser:Dynamic Timestamp Allocation forTransactions in Database Systems. DDB 1982: 9-20
總結(jié)
以上是生活随笔為你收集整理的最新开源:3TS腾讯事务处理技术验证系统(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大牛书单 | 搜索大牛都读什么书?
- 下一篇: 首次揭秘:腾讯TDSQL分布式多级一致性