本發(fā)明涉及一種異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行方法,尤指一種基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行系統(tǒng)及方法。
背景技術(shù):
隨著企業(yè)信息化系統(tǒng)的廣泛應(yīng)用,信息化系統(tǒng)已經(jīng)成為企業(yè)維持業(yè)務(wù)運轉(zhuǎn)的關(guān)鍵。企業(yè)多樣化的業(yè)務(wù)類型導(dǎo)致數(shù)據(jù)訪問需求日趨復(fù)雜化,同時數(shù)據(jù)量的急劇攀升也導(dǎo)致數(shù)據(jù)庫服務(wù)器不堪重負(fù)。企業(yè)迫切需要提高信息系統(tǒng)的可用性,保證業(yè)務(wù)的連續(xù)性,最大限度地減少因災(zāi)難或故障所帶來的損失。為此,分布式異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)復(fù)制是一種常用的技術(shù)手段。
目前,抽取源數(shù)據(jù)庫的事務(wù)日志,獲得源數(shù)據(jù)庫的數(shù)據(jù)操作,包括插入(INSERT)、刪除(DELETE)、更新(UPDATE),然后通過網(wǎng)絡(luò)發(fā)送給復(fù)制系統(tǒng)的目的端,目的端恢復(fù)成原始的SQL語句在目的數(shù)據(jù)庫上執(zhí)行,是一種常用的數(shù)據(jù)庫復(fù)制技術(shù)。它具有對源數(shù)據(jù)庫的性能和數(shù)據(jù)模式影響小,可采用非常靈活的方式配置出各種拓?fù)浣Y(jié)構(gòu),支持跨異構(gòu)的操作系統(tǒng)和數(shù)據(jù)庫平臺復(fù)制等優(yōu)點。
恢復(fù)后的SQL語句在目的數(shù)據(jù)庫上執(zhí)行的效率是如上所述的數(shù)據(jù)復(fù)制系統(tǒng)性能的關(guān)鍵,為此需要在目的端并行執(zhí)行這些語句。然而,目的數(shù)據(jù)庫可以采取各種并發(fā)控制機(jī)制,不加控制的并行執(zhí)行將會導(dǎo)致某些語句的執(zhí)行因為并發(fā)控制導(dǎo)致失敗,從而破壞目的數(shù)據(jù)庫與源數(shù)據(jù)庫的事務(wù)一致性。因此,提供適當(dāng)?shù)臋C(jī)制,既保證語句執(zhí)行的高并發(fā)性,又確保事務(wù)能正確執(zhí)行,是這種復(fù)制系統(tǒng)需要考慮的重要問題。目前存在的一些數(shù)據(jù)復(fù)制系統(tǒng),例如Oracle的GoldenGate,在執(zhí)行端是串行執(zhí)行恢復(fù)后的語句,雖然不會導(dǎo)致事務(wù)失敗,但效率很低。
由此可見,傳統(tǒng)的復(fù)制系統(tǒng)串行執(zhí)行的問題,不能適應(yīng)現(xiàn)代海量數(shù)據(jù)應(yīng)用環(huán)境下、大規(guī)模用戶、高并發(fā)的復(fù)制場景,需要發(fā)明新的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行方法及系統(tǒng)。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的就是要提供一種基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行系統(tǒng)及方法,在使用日志進(jìn)行異構(gòu)數(shù)據(jù)庫復(fù)制環(huán)境中,利用提交點時間線構(gòu)成柵欄,和兩條時間線之間的所有更新操作互不沖突的特性,在目的端數(shù)據(jù)庫并行執(zhí)行這些操作,可以顯著提高復(fù)制效率。其采用基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫并行復(fù)制,解決了目的數(shù)據(jù)庫事務(wù)串行執(zhí)行導(dǎo)致復(fù)制效率低下的技術(shù)問題。
為實現(xiàn)上述目的,本發(fā)明所設(shè)計的一種基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行系統(tǒng),包括源數(shù)據(jù)庫、目的數(shù)據(jù)庫、復(fù)制系統(tǒng);所述復(fù)制系統(tǒng)包括源端和目的端,所述目的端包括負(fù)責(zé)接收事務(wù)日志的日志接收線程,以及負(fù)責(zé)在目的數(shù)據(jù)庫中并行執(zhí)行相應(yīng)數(shù)據(jù)操作的日志執(zhí)行線程,所述日志執(zhí)行線程有多個,所述事務(wù)日志包括提交日志和操作日志;所述源端將源數(shù)據(jù)庫中的事務(wù)日志轉(zhuǎn)發(fā)給目的端的日志接收線程,所述日志接收線程再將收到的事務(wù)日志投遞給日志執(zhí)行線程,所述日志執(zhí)行線程接收并執(zhí)行事務(wù)日志。
一種基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行方法,包括如下步驟:
1)通過復(fù)制系統(tǒng)的源端將源數(shù)據(jù)庫的事務(wù)日志轉(zhuǎn)發(fā)給目的端;
2)目的端的日志接收線程反復(fù)接收從源數(shù)據(jù)庫傳來的事務(wù)日志,將事務(wù)日志緩存在內(nèi)存中,積累事務(wù)日志直到碰到一個提交日志后,從內(nèi)存中提取此事務(wù)的全部事務(wù)日志,投遞給一個日志執(zhí)行線程;
3)當(dāng)日志執(zhí)行線程接到一個事務(wù)的全部事務(wù)日志時被激活,如果早于其他日志執(zhí)行線程所處理事務(wù)的提交日志所在時間點,則依次取出全部操作日志,執(zhí)行操作日志的線程;否則將本次操作日志的線程掛起,等待其他日志執(zhí)行線程所處理的事務(wù)日志執(zhí)行完畢。
進(jìn)一步地,所述步驟2中,所述日志接收線程的具體實現(xiàn)過程為:
1.1)日志接收線程接收一條來自于源數(shù)據(jù)庫的事務(wù)日志;
1.2)將事務(wù)日志緩存在內(nèi)存之中;
1.3)如果此事務(wù)日志不是提交日志,返回步驟1.1;否則,執(zhí)行步驟1.4;
1.4)選擇一個空閑的日志執(zhí)行線程,將此事務(wù)全部的事務(wù)日志投遞給它,返回步驟1.1;
更進(jìn)一步地,所述步驟3中,所述日志執(zhí)行線程的具體實現(xiàn)過程為:
2.1)日志執(zhí)行線程接收一個事務(wù)的全部事務(wù)日志后被激活;
2.2)從收到的全部事務(wù)日志序列中依次取出一條日志;
2.3)檢查活動的其他日志執(zhí)行線程所執(zhí)行的提交日志,如果存在其他日志執(zhí)行線程所執(zhí)行的提交日志時間早于取出的這條日志,則本執(zhí)行線程掛起,延時執(zhí)行步驟2.3);
2.4)執(zhí)行此事務(wù)日志。
實施本發(fā)明的基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行系統(tǒng)及方法,具有以下有益效果:
傳統(tǒng)的基于日志的數(shù)據(jù)復(fù)制系統(tǒng),為了防止目的端事務(wù)執(zhí)行失敗,需要按照日志的時間順序(LSN號)串行的執(zhí)行各個事務(wù)的日志,而沒有考慮事務(wù)并行執(zhí)行的可能性。本發(fā)明使用提交點時間線構(gòu)成柵欄,利用兩條時間線之間的所有更新操作互不沖突的特性,在目的端數(shù)據(jù)庫并行執(zhí)行這些操作,顯著提高復(fù)制效率,解決了目的數(shù)據(jù)庫事務(wù)串行執(zhí)行導(dǎo)致復(fù)制效率低下的技術(shù)問題。
附圖說明
圖1為本發(fā)明的模型示意圖。
圖2為日志接收線程和日志執(zhí)行線程的關(guān)系示意圖;
圖3為本發(fā)明日志接收線程的流程示意圖;
圖4為本發(fā)明日志執(zhí)行線程的流程示意圖;
圖5為本發(fā)明的一個實施例示意圖。
具體實施方式
下面結(jié)合附圖和具體實施例對本發(fā)明作進(jìn)一步的詳細(xì)描述:
如圖1~4所示的一種基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行系統(tǒng),包括源數(shù)據(jù)庫、目的數(shù)據(jù)庫、復(fù)制系統(tǒng);所述復(fù)制系統(tǒng)包括源端和目的端,所述目的端包括負(fù)責(zé)接收事務(wù)日志的日志接收線程,以及負(fù)責(zé)在目的數(shù)據(jù)庫中并行執(zhí)行相應(yīng)數(shù)據(jù)操作的日志執(zhí)行線程,所述日志執(zhí)行線程有多個,所述事務(wù)日志包括提交日志和操作日志;所述源端將源數(shù)據(jù)庫中的事務(wù)日志轉(zhuǎn)發(fā)給目的端的日志接收線程,所述日志接收線程再將收到的事務(wù)日志投遞給日志執(zhí)行線程,所述日志執(zhí)行線程接收并執(zhí)行事務(wù)日志。
一種基于提交點時間線同步的異構(gòu)數(shù)據(jù)庫復(fù)制并行執(zhí)行方法,包括如下步驟:
1)通過復(fù)制系統(tǒng)的源端將源數(shù)據(jù)庫的事務(wù)日志轉(zhuǎn)發(fā)給目的端;
2)目的端的日志接收線程反復(fù)接收從源數(shù)據(jù)庫傳來的事務(wù)日志,將事務(wù)日志緩存在內(nèi)存中,積累事務(wù)日志直到碰到一個提交日志后,從內(nèi)存中提取此事務(wù)的全部事務(wù)日志,投遞給一個日志執(zhí)行線程,其具體實現(xiàn)過程為:
2.1)接受線程接收一條來自于源端數(shù)據(jù)庫的日志,日志內(nèi)容如下表所示:
2.2)將日志緩存在內(nèi)存之中,按照LSN順序排列;
2.3)如果此日志不是事務(wù)提交日志,返回步驟2.1);否則,執(zhí)行步驟2.4);
2.4)選擇一個空閑的日志執(zhí)行線程,將此ID對應(yīng)的事務(wù)緩存的全部日志投遞給它,返回步驟2.1);
3)當(dāng)日志執(zhí)行線程接到一個事務(wù)的全部事務(wù)日志時被激活,如果早于其他日志執(zhí)行線程所處理事務(wù)的提交日志所在時間點,則依次取出全部操作日志,執(zhí)行操作日志的線程;否則將本次操作日志的線程掛起,等待其他日志執(zhí)行線程所處理的事務(wù)日志執(zhí)行完畢,其具體實現(xiàn)過程為:
3.1)執(zhí)行線程接收一個事務(wù)全部日志后被激活;
3.2)從收到的事務(wù)日志序列中依次取出一條日志L1;
3.3)檢查活動的其他執(zhí)行線程所執(zhí)行的事務(wù),如果存在其他事務(wù)的提交日志L0,其時間早于取出的這條日志,即LSN(L0)<LSN(L1),則本執(zhí)行線程掛起,直到其他的執(zhí)行線程執(zhí)行完畢,即早于這條日志的提交日志L0進(jìn)行了提交,然后本執(zhí)行線程恢復(fù)執(zhí)行,執(zhí)行步驟3.3);
這條步驟的實質(zhì)是將日志序列中的每個提交日志看成是一個提交點時間線柵欄,柵欄之間的所有操作都可以并行執(zhí)行,這一點為主流數(shù)據(jù)庫的并發(fā)控制機(jī)制所保證。一旦遇到提交日志,其他事務(wù)的執(zhí)行就需要停止下來,等到此事務(wù)提交完成,再并行執(zhí)行下一個柵欄之前的全部操作。這樣既保證事務(wù)之間不會因為沖突導(dǎo)致其中一個被回滾,又可以最大程度的提高并行性。
3.4)執(zhí)行此日志L1。
實施例1:
如圖5,日志接收線程接收到源數(shù)據(jù)庫的事務(wù)日志序列:
W1(a)W2(b)W3(c)W1(d)W2(e)C1W2(a)W3(d)W2(f)C2W3(a)C3的執(zhí)行過程。其中Wi(a)表示事務(wù)i對于數(shù)據(jù)項a進(jìn)行寫操作,Ci表示事務(wù)i的提交操作。
日志序列中有三個提交操作,它們作為提交點時間線柵欄把序列分成了三段,每一段內(nèi)的所有操作都能夠并行執(zhí)行。
日志接收線程首先遇到的提交操作是C1,這時從緩存在內(nèi)存的日志中取出事務(wù)1的全部操作W1(a)W1(d)C1,交給某個執(zhí)行線程執(zhí)行。之后到的提交操作是C2,同理取出事務(wù)2的全部操作W2(b)W2(e)W2(a)W2(f)C2,交給某個執(zhí)行線程執(zhí)行,最后取出事務(wù)3的全部操作W3(c)W3(d)W3(a)C3,交給某個執(zhí)行線程執(zhí)行。
第1個提交點時間線柵欄把事務(wù)2的日志序列分成了2段,W2(b)W2(e)和W2(a)W2(f)C2,前面一段可以與事務(wù)1的操作并行執(zhí)行,后一段因為其LSN大于C1的LSN,要等到C1執(zhí)行完畢后才能執(zhí)行,如果事務(wù)2的執(zhí)行線程工作得更快,那么當(dāng)執(zhí)行到W2(a)時,發(fā)現(xiàn)LSN(W2(a))>LSN(C1),就會被掛起,直到C1執(zhí)行完畢后被喚醒繼續(xù)執(zhí)行。
同理,事務(wù)3的日志序列分成了3段,第1段可以在第1個提交點時間線柵欄之前與其他執(zhí)行線程并行執(zhí)行;第2段可以在第1個提交點時間線柵欄之后、第2個提交點時間線柵欄之前與其他執(zhí)行線程并行執(zhí)行;第3段只能在第2個提交點時間線柵欄之后執(zhí)行。
最后,應(yīng)當(dāng)指出,以上實施例僅是本發(fā)明較有代表性的例子。顯然,本發(fā)明不限于上述實施例,還可以有許多變形。凡依據(jù)本發(fā)明的技術(shù)實質(zhì)對以上實施例所做的任何簡單修改、等同變化及修飾,均應(yīng)認(rèn)為屬于本發(fā)明的保護(hù)范圍。