一種跨機(jī)房數(shù)據(jù)庫(kù)同步方法及系統(tǒng)的制作方法
【專利摘要】本申請(qǐng)公開(kāi)了一種跨機(jī)房數(shù)據(jù)庫(kù)同步方法,用于目標(biāo)數(shù)據(jù)庫(kù)跨機(jī)房的從源數(shù)據(jù)庫(kù)同步數(shù)據(jù),包括如下步驟:步驟100、在源數(shù)據(jù)庫(kù)端監(jiān)聽(tīng)源數(shù)據(jù)庫(kù)的變更;步驟110、利用多個(gè)順序編號(hào)的并行進(jìn)程依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù);步驟120、各個(gè)并行進(jìn)程將提取到的數(shù)據(jù)經(jīng)合并、壓縮后進(jìn)行發(fā)送;步驟130、在目標(biāo)數(shù)據(jù)庫(kù)端接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù),按照各并行進(jìn)程的次序進(jìn)行加載得到待同步數(shù)據(jù),利用該待同步數(shù)據(jù)更新目標(biāo)數(shù)據(jù)庫(kù)。本申請(qǐng)采用多線程并行處理的思路,利用SQL語(yǔ)義執(zhí)行的特性,通過(guò)對(duì)數(shù)據(jù)的合并、壓縮、并行處理等完整的傳輸方案,來(lái)緩解目前跨機(jī)房、跨地區(qū)網(wǎng)絡(luò)的同步延遲問(wèn)題。
【專利說(shuō)明】一種跨機(jī)房數(shù)據(jù)庫(kù)同步方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001 ] 本申請(qǐng)涉及計(jì)算機(jī)及網(wǎng)絡(luò)【技術(shù)領(lǐng)域】,尤其涉及一種跨機(jī)房數(shù)據(jù)庫(kù)同步傳輸方法和系統(tǒng)。
【背景技術(shù)】
[0002]目前針對(duì)一些大型網(wǎng)站業(yè)務(wù),在系統(tǒng)可用性上往往會(huì)考慮數(shù)據(jù)庫(kù)的跨機(jī)房鏡像復(fù)制,容災(zāi)備份等,在發(fā)生不可抗力因素導(dǎo)致當(dāng)?shù)財(cái)?shù)據(jù)不可用時(shí),能夠快速的通過(guò)異步的數(shù)據(jù)庫(kù)備份或者鏡像提供系統(tǒng)訪問(wèn)。
[0003]在做數(shù)據(jù)庫(kù)同步時(shí),目前一般的做法是通過(guò)數(shù)據(jù)庫(kù)DML/DDL的變更日志解析,發(fā)送給目標(biāo)庫(kù)后再重新執(zhí)行一次數(shù)據(jù)庫(kù)DML/DDL變更,以達(dá)到兩邊的數(shù)據(jù)庫(kù)保持一致。這種做法針對(duì)跨機(jī)房,跨地區(qū)網(wǎng)絡(luò)的數(shù)據(jù)庫(kù)同步,存在的一個(gè)問(wèn)題就是數(shù)據(jù)的傳輸量以及重新執(zhí)行的代價(jià),源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)完全是1:1的模式,源庫(kù)的一次變更,就會(huì)有一份數(shù)據(jù)傳輸以及一次DDL/DML執(zhí)行。
[0004]目前杭州到青島的單個(gè)tcp包的網(wǎng)絡(luò)延遲為70ms,杭州到美國(guó)的單個(gè)tcp包的網(wǎng)絡(luò)延遲為200ms,一旦同一時(shí)間數(shù)據(jù)庫(kù)的變更達(dá)到一個(gè)高峰,數(shù)據(jù)庫(kù)的同步過(guò)程會(huì)因?yàn)榫W(wǎng)絡(luò)傳輸和重新執(zhí)行而造成阻塞,從而導(dǎo)致數(shù)據(jù)庫(kù)同步延遲。因此,針對(duì)一些跨機(jī)房,跨地區(qū)網(wǎng)絡(luò)的數(shù)據(jù)庫(kù)同步,如何減少傳輸數(shù)據(jù)以及減少重新執(zhí)行的代價(jià)就非常關(guān)鍵。
[0005]現(xiàn)有的技術(shù)通常是利用數(shù)據(jù)庫(kù)自帶的解決方案,比如使用比較廣泛的mysql數(shù)據(jù)庫(kù)同步。mysql同步會(huì)將數(shù)據(jù)庫(kù)變更的記錄存入binlog文件,并提供socket服務(wù),由需要執(zhí)行同步的目標(biāo)庫(kù)發(fā)起一次數(shù)據(jù)同步請(qǐng)求。
[0006]目前mysql5版本自帶數(shù)據(jù)庫(kù)復(fù)制方案,同步系統(tǒng)本身與mysqlserver進(jìn)行了集成,作為一個(gè)mysql組件存在。例如源數(shù)據(jù)庫(kù)為A,目標(biāo)數(shù)據(jù)庫(kù)為B,同步系統(tǒng)為C,同步過(guò)程如下:
[0007]I)同步系統(tǒng)通過(guò)單個(gè)socket鏈接和數(shù)據(jù)庫(kù)建立鏈接,開(kāi)始監(jiān)聽(tīng)數(shù)據(jù)變更;
[0008]2)原始數(shù)據(jù)在數(shù)據(jù)庫(kù)A中發(fā)生insert/update/delete等操作;
[0009]3)數(shù)據(jù)庫(kù)A會(huì)在本地生成變更日志數(shù)據(jù);
[0010]4)同步系統(tǒng)監(jiān)聽(tīng)到數(shù)據(jù)變更,通過(guò)建立的socket開(kāi)始獲取變更數(shù)據(jù);
[0011]5)在異步接收完整個(gè)變更數(shù)據(jù)包后,解析為內(nèi)部執(zhí)行對(duì)象;
[0012]6)根據(jù)數(shù)據(jù)庫(kù)A上的變更操作,在目標(biāo)數(shù)據(jù)庫(kù)B上重新執(zhí)行insert/update/delete等操作。
[0013]但現(xiàn)有技術(shù)mysql同步主要存在以下問(wèn)題:
[0014]I)為保證同步順序性,mysql采用了 tcp長(zhǎng)鏈接的方式進(jìn)行數(shù)據(jù)傳輸。
[0015]2)為保證數(shù)據(jù)的可靠性,mysql采用了 ack請(qǐng)求的回饋模式+順序傳輸。只有上一批數(shù)據(jù)完全獲取成功后,才會(huì)去獲取下一批數(shù)據(jù),并且同一時(shí)間只有一份數(shù)據(jù)在傳輸。
[0016]3) mysql變更日志文件binlog詳細(xì)記錄每次數(shù)據(jù)庫(kù)的變更,可以提供DBA (數(shù)據(jù)庫(kù)管理員)詳細(xì)查看后用于分析數(shù)據(jù)庫(kù)的歷史變更記錄,并不是僅僅為數(shù)據(jù)庫(kù)的高效同步而特殊設(shè)計(jì)的,所以存在很多冗余數(shù)據(jù),造成數(shù)據(jù)量巨大。
[0017]針對(duì)跨機(jī)房,跨地區(qū)網(wǎng)絡(luò)的同步業(yè)務(wù),傳統(tǒng)的單tcp工作模式面對(duì)高峰時(shí)期的數(shù)據(jù)庫(kù)變更同步時(shí),會(huì)產(chǎn)生數(shù)據(jù)堆積,造成網(wǎng)絡(luò)擁堵。
【發(fā)明內(nèi)容】
[0018]本申請(qǐng)?zhí)岢隽艘环N高效、可靠的數(shù)據(jù)庫(kù)同步方法及系統(tǒng),采用多線程并行處理的思路,利用SQL語(yǔ)義執(zhí)行的特性,通過(guò)對(duì)數(shù)據(jù)的合并、壓縮、并行處理等完整的傳輸方案,來(lái)緩解目前跨機(jī)房、跨地區(qū)網(wǎng)絡(luò)的同步延遲問(wèn)題。
[0019]一種跨機(jī)房數(shù)據(jù)庫(kù)同步方法,用于目標(biāo)數(shù)據(jù)庫(kù)跨機(jī)房的從源數(shù)據(jù)庫(kù)同步數(shù)據(jù),包括如下步驟:
[0020]步驟100、在源數(shù)據(jù)庫(kù)端監(jiān)聽(tīng)源數(shù)據(jù)庫(kù)的變更;
[0021]步驟110、利用多個(gè)順序編號(hào)的并行進(jìn)程依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù);
[0022]步驟120、各個(gè)并行進(jìn)程將提取到的數(shù)據(jù)經(jīng)合并、壓縮后進(jìn)行發(fā)送;
[0023]步驟130、在目標(biāo)數(shù)據(jù)庫(kù)端接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù),按照各并行進(jìn)程的次序進(jìn)行加載得到待同步數(shù)據(jù),利用該待同步數(shù)據(jù)更新目標(biāo)數(shù)據(jù)庫(kù)。
[0024]所述步驟100中,在源數(shù)據(jù)庫(kù)端通過(guò)socket和源數(shù)據(jù)庫(kù)建立鏈接,監(jiān)聽(tīng)數(shù)據(jù)變更,所述源數(shù)據(jù)庫(kù)的變更為Insert、Update、Delete至少一種事件的觸發(fā)。
[0025]源數(shù)據(jù)庫(kù)發(fā)生insert、update或delete事件時(shí)會(huì)在本地生成變更日志數(shù)據(jù),通過(guò)建立的socket可以獲取變更數(shù)據(jù)。
[0026]步驟110具體包括:
[0027]步驟111、開(kāi)啟多個(gè)并行進(jìn)程并對(duì)每個(gè)并行進(jìn)程賦以編號(hào);
[0028]步驟112、各個(gè)并行進(jìn)程按照編號(hào)依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),且在提取的同時(shí)進(jìn)行解析得到若干內(nèi)部對(duì)象,即步驟120所述的提取到的數(shù)據(jù)。
[0029]所述步驟110中,按照系統(tǒng)并行度的設(shè)置開(kāi)啟多個(gè)并行進(jìn)程,編號(hào)在前的并行進(jìn)程先提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),滿足設(shè)定的數(shù)據(jù)量后,下一個(gè)并行進(jìn)程再開(kāi)始提取,以此類推。
[0030]所述步驟112中,通過(guò)與源數(shù)據(jù)庫(kù)相匹配的協(xié)議格式解析得到所述內(nèi)部對(duì)象,該內(nèi)部對(duì)象的數(shù)據(jù)結(jié)構(gòu)包括事件類型、主鍵信息和變更字段。
[0031]本申請(qǐng)中內(nèi)部對(duì)象的數(shù)據(jù)結(jié)構(gòu)采用常用數(shù)據(jù)庫(kù)的數(shù)據(jù)結(jié)構(gòu)類型,例如使用比較廣泛的mysql數(shù)據(jù)庫(kù)等。
[0032]步驟120中,所述的合并包括:
[0033]步驟121、同一并行進(jìn)程中,將主鍵信息相同的內(nèi)部對(duì)象構(gòu)建為子鏈表;
[0034]步驟122、將同屬一個(gè)子鏈表的所有內(nèi)部對(duì)象按照對(duì)應(yīng)的變更字段依次進(jìn)行運(yùn)算,處理得到合并后的內(nèi)部對(duì)象。
[0035]源數(shù)據(jù)庫(kù)的變更過(guò)程中,每一次事件的觸發(fā)以及所涉及的變更數(shù)據(jù)可對(duì)應(yīng)一個(gè)內(nèi)部對(duì)象,若在一個(gè)并行進(jìn)程中包含了多次的變更操作,在進(jìn)行數(shù)據(jù)提取和解析后就對(duì)應(yīng)的生成多個(gè)內(nèi)部對(duì)象,在步驟121中,將同一并行進(jìn)程的所有內(nèi)部對(duì)象進(jìn)行分類,每一類構(gòu)建生成一個(gè)子鏈表,同一子鏈表中的各個(gè)內(nèi)部對(duì)象具有相同的主鍵信息。
[0036]在所述步驟122中,按照子鏈表內(nèi)各個(gè)內(nèi)部對(duì)象的順序(按照內(nèi)部對(duì)象中所涉及的變更操作的發(fā)生時(shí)間),依次的進(jìn)行運(yùn)算,例如首先將前兩個(gè)內(nèi)部對(duì)象進(jìn)行運(yùn)算得到運(yùn)算后的內(nèi)部對(duì)象,再將該運(yùn)算后的內(nèi)部對(duì)象與第三個(gè)內(nèi)部對(duì)象進(jìn)行運(yùn)算,以此類推,直至完成同一子鏈表中所有內(nèi)部對(duì)象的運(yùn)算,得到合并后的內(nèi)部對(duì)象。
[0037]在步驟130中,目標(biāo)數(shù)據(jù)庫(kù)端可以同時(shí)接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù),由于各并行進(jìn)程是按次序編號(hào)的,因此,目標(biāo)數(shù)據(jù)庫(kù)端在對(duì)接收的數(shù)據(jù)進(jìn)行恢復(fù)和加載時(shí),也要按照并行進(jìn)程的編號(hào)進(jìn)行,直至完成所有變更數(shù)據(jù)的處理。
[0038]本申請(qǐng)還提供一種跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng),用于目標(biāo)數(shù)據(jù)庫(kù)跨機(jī)房的從源數(shù)據(jù)庫(kù)同步數(shù)據(jù),包括:
[0039]監(jiān)聽(tīng)模塊,用于在源數(shù)據(jù)庫(kù)端監(jiān)聽(tīng)源數(shù)據(jù)庫(kù)的變更;
[0040]提取模塊,用于利用多個(gè)順序編號(hào)的并行進(jìn)程依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù);
[0041]數(shù)據(jù)處理模塊,用于各個(gè)并行進(jìn)程將提取到的數(shù)據(jù)經(jīng)合并、壓縮后進(jìn)行發(fā)送;
[0042]接收模塊,用于在目標(biāo)數(shù)據(jù)庫(kù)端接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù),按照各并行進(jìn)程的次序進(jìn)行加載得到待同步數(shù)據(jù),利用該待同步數(shù)據(jù)更新目標(biāo)數(shù)據(jù)庫(kù)。
[0043]所述監(jiān)聽(tīng)模塊中,源數(shù)據(jù)庫(kù)的變更為Insert、Update、Delete至少一種事件的觸發(fā)。
[0044]所述提取模塊包括:
[0045]進(jìn)程啟動(dòng)模塊,用于開(kāi)啟多個(gè)并行進(jìn)程并對(duì)每個(gè)并行進(jìn)程賦以編號(hào);
[0046]解析模塊,用于各個(gè)并行進(jìn)程按照編號(hào)依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),且在提取的同時(shí)進(jìn)行解析得到若干內(nèi)部對(duì)象,即數(shù)據(jù)處理模塊中所述的提取到的數(shù)據(jù)。
[0047]所述解析模塊,通過(guò)與源數(shù)據(jù)庫(kù)相匹配的協(xié)議格式解析得到所述內(nèi)部對(duì)象,該內(nèi)部對(duì)象的數(shù)據(jù)結(jié)構(gòu)包括事件類型、主鍵信息和變更字段。
[0048]所述數(shù)據(jù)處理模塊包括依次對(duì)提取到的數(shù)據(jù)進(jìn)行相應(yīng)處理的合并模塊、壓縮模塊和發(fā)送模塊,其中所述合并模塊包括:
[0049]建子鏈表模塊,用于同一并行進(jìn)程中,將主鍵信息相同的內(nèi)部對(duì)象構(gòu)建為子鏈表;
[0050]運(yùn)算合并模塊,用于將同屬一個(gè)子鏈表的所有內(nèi)部對(duì)象按照對(duì)應(yīng)的變更字段依次進(jìn)行運(yùn)算,處理得到合并后的內(nèi)部對(duì)象。
[0051]本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法及系統(tǒng)的有益效果:
[0052]相比于現(xiàn)有的同步模式,引入了數(shù)據(jù)的合并,使數(shù)據(jù)傳遞最小化。采用并行同步過(guò)程,盡可能將數(shù)據(jù)傳遞并行化,網(wǎng)絡(luò)傳輸?shù)臅r(shí)間延遲僅發(fā)生在第一個(gè)并行過(guò)程所需要的網(wǎng)絡(luò)傳輸時(shí)間,針對(duì)跨機(jī)房、跨地區(qū)網(wǎng)絡(luò)的同步中,可避免數(shù)據(jù)堆積。
【專利附圖】
【附圖說(shuō)明】
[0053]圖1為本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法流程圖;
[0054]圖2為本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法中各個(gè)并行進(jìn)程提取源數(shù)據(jù)庫(kù)數(shù)據(jù)變更流程圖;
[0055]圖3為本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法數(shù)據(jù)合并步驟流程圖;
[0056]圖4為本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng)示意圖;
[0057]圖5為本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法示意圖(以3個(gè)并行進(jìn)程為例);[0058]圖6為本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法數(shù)據(jù)合并步驟示意圖。
【具體實(shí)施方式】
[0059]以下結(jié)合附圖對(duì)本申請(qǐng)技術(shù)方案進(jìn)行進(jìn)一步的描述。
[0060]參見(jiàn)圖1、圖5,以mysql系統(tǒng)為例,源數(shù)據(jù)庫(kù)與目標(biāo)數(shù)據(jù)庫(kù)處在不同的機(jī)房,利用本申請(qǐng)的數(shù)據(jù)庫(kù)同步方法,可以高效的完成目標(biāo)數(shù)據(jù)庫(kù)與源數(shù)據(jù)庫(kù)的同步更新,本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法包括:
[0061]步驟100、在源數(shù)據(jù)庫(kù)端與源數(shù)據(jù)庫(kù)按照協(xié)議格式定義,建立socket鏈接,通過(guò)socket鏈接監(jiān)聽(tīng)數(shù)據(jù)變更,源數(shù)據(jù)庫(kù)的變更為Insert、Update、Delete至少一種事件的觸發(fā)。
[0062]其中,源數(shù)據(jù)庫(kù)與目標(biāo)數(shù)據(jù)庫(kù)遵循mysql同步協(xié)議,比如mysql數(shù)據(jù)同步協(xié)議;文檔:http: //forge, mysql.com/wiki/MySQL_Internals_Binary_Log。通過(guò)mysql server 提供的數(shù)據(jù)變更socket服務(wù),進(jìn)一步的獲取對(duì)應(yīng)的變更數(shù)據(jù)。
[0063]步驟110、利用多個(gè)順序編號(hào)的并行進(jìn)程依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),參見(jiàn)圖
2,具體包括:
[0064]步驟111、按照系統(tǒng)并行度的設(shè)置開(kāi)啟多個(gè)并行進(jìn)程并對(duì)每個(gè)并行進(jìn)程賦以編號(hào);例如開(kāi)啟5個(gè)并行進(jìn)程,有序遞增的編號(hào)為并行進(jìn)程1、并行進(jìn)程2、并行進(jìn)程3、并行進(jìn)程
4、并行進(jìn)程5。
[0065]步驟112、各個(gè)并行進(jìn)程按照編號(hào)依次通過(guò)socket鏈接向獲取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù)。
[0066]編號(hào)在前的并行進(jìn)程先提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),滿足設(shè)定的數(shù)據(jù)量后,下一個(gè)并行進(jìn)程再開(kāi)始提取,按序號(hào)從小到大依次進(jìn)行數(shù)據(jù)提取,整個(gè)過(guò)程為串行。
[0067]在提取的同時(shí)通過(guò)協(xié)議格式解析mysql server返回的binlog數(shù)據(jù),解析為同步系統(tǒng)的內(nèi)部對(duì)象(Entry),在源數(shù)據(jù)庫(kù)的變更過(guò)程中,每一次事件的觸發(fā)對(duì)應(yīng)得到一個(gè)內(nèi)部對(duì)象。
[0068]Entry的數(shù)據(jù)結(jié)構(gòu)如下:
[0069]a)事件類型:
[0070]主要分為DDL/DML執(zhí)行,數(shù)據(jù)同步主要針對(duì)DML操作事件,DML操作事件主要分為Insert、Update、Delete 三種事件。
[0071]b)主鍵信息
[0072]數(shù)據(jù)庫(kù)中表的主鍵字段,包括主鍵名,主鍵值。
[0073]c)變更字段
[0074]數(shù)據(jù)庫(kù)中表的當(dāng)前變更字段,包括變更字段名,變更前值,變更后值。
[0075]步驟120、各個(gè)并行進(jìn)程將提取到的數(shù)據(jù)經(jīng)合并、壓縮后進(jìn)行發(fā)送;如圖3所示,其中的合并過(guò)程具體包括:
[0076]步驟121、同一并行進(jìn)程中,將主鍵信息相同的內(nèi)部對(duì)象構(gòu)建為子鏈表;即對(duì)同一并行進(jìn)程的所有內(nèi)部對(duì)象進(jìn)行分類,每一類構(gòu)建生成一個(gè)子鏈表,同一子鏈表中的各個(gè)內(nèi)部對(duì)象具有相同的按照主鍵信息。
[0077]參見(jiàn)圖6,例如將具有相同主鍵信息A的各個(gè)內(nèi)部對(duì)象構(gòu)建生成子鏈表pkl,在子鏈表pkl中各個(gè)內(nèi)部對(duì)象的數(shù)據(jù)變更的類型(insert、update或delete)可能相同也可能不相同。
[0078]同理,將具有相同主鍵信息B的各個(gè)內(nèi)部對(duì)象構(gòu)建生成子鏈表pk2,將具有相同主鍵信息C的各個(gè)內(nèi)部對(duì)象構(gòu)建生成子鏈表pk3,以此類推。
[0079]就每個(gè)并行進(jìn)程而言,可以包含一個(gè)或多個(gè)子鏈表,根據(jù)每個(gè)并行進(jìn)程的數(shù)據(jù)容量而定。
[0080]步驟122、將同屬一個(gè)子鏈表的所有內(nèi)部對(duì)象按照對(duì)應(yīng)的變更字段依次進(jìn)行運(yùn)算,處理得到合并后的內(nèi)部對(duì)象。
[0081]運(yùn)算主要針對(duì)DML操作事件(Insert、Update、Delete),運(yùn)算時(shí)首先將前兩個(gè)內(nèi)部對(duì)象進(jìn)行運(yùn)算得到運(yùn)算后的內(nèi)部對(duì)象,再將該運(yùn)算后的內(nèi)部對(duì)象與第三個(gè)內(nèi)部對(duì)象進(jìn)行運(yùn)算,以此類推,直至完成同一子鏈表中所有內(nèi)部對(duì)象的運(yùn)算,得到合并后的內(nèi)部對(duì)象。
[0082]兩個(gè)進(jìn)行運(yùn)算的內(nèi)部對(duì)象中,若變更字段不同,則將不同變更字段的變更類型以及變更前后的值合并至運(yùn)算后的內(nèi)部對(duì)象;
[0083]例如前一個(gè)Entry的變更類型為Insert,插入內(nèi)容為A的字段,而后一個(gè)Entry的變更類型為Update,即對(duì)原有的內(nèi)容為B的字段進(jìn)行了更新而得到內(nèi)容B',那么運(yùn)算后的Entry則視為存在兩個(gè)變更,即插入內(nèi)容為A的字段以及對(duì)原有的內(nèi)容為B的字段進(jìn)行了更新而得到內(nèi)容B'。
[0084]兩個(gè)進(jìn)行運(yùn)算的內(nèi)部對(duì)象中,若變更字段相同,則將該變更字段經(jīng)兩次變更后的值合并至運(yùn)算后的內(nèi)部對(duì)象。
[0085]變更字段相同時(shí)的具體運(yùn)算規(guī)則如下:
[0086]a) Entry (Insert 類型)+Entry (Update 類型)=> Entry (Insert 類型);即將Entry (Update類型)對(duì)應(yīng)的變更字段,替換掉Entry (Insert類型)中同名的變更字段。
[0087]例如在同一子鏈表中,前一個(gè)Entry的變更類型為Insert,插入了 3個(gè)字段:A字段(A內(nèi)容)、B字段(B內(nèi)容)、C字段(C內(nèi)容)。
[0088]而后一個(gè)Entry的變更類型為Update,更新了 I個(gè)字段得到B字段(B’內(nèi)容)',那么運(yùn)算后的Entry:A字段(A內(nèi)容)、B字段(B’內(nèi)容)、C字段(C內(nèi)容),即B字段使用了第二次update的內(nèi)容,其他字段的都使用第一次insert的內(nèi)容。
[0089]b) Entry (Insert 類型)+Entry (Delete 類型)=> Entry (Delete 類型),即直接返回 Entry (Delete 類型)。
[0090]例如在同一子鏈表中,前一個(gè)Entry的變更類型為Insert,插入A字段(A內(nèi)容),而后一個(gè)Entry的變更類型為Delete,即刪除A字段(A內(nèi)容),那么運(yùn)算后的Entry則視為刪除A字段(A內(nèi)容)。
[0091]c) Entry (Update 類型)+Entry (Update 類型)=> Entry (Update 類型),即同名字段以后者變更字段覆蓋前者。
[0092]例如在同一子鏈表中,前一個(gè)Entry的變更類型Update,得到變更后的3個(gè)字段:A字段(A內(nèi)容)、B字段(B內(nèi)容)、C字段(C內(nèi)容)。
[0093]而后一個(gè)Entry的變更類型也為Update,變更了 2個(gè)字段得到:C字段(C’內(nèi)容)、D字段(D內(nèi)容)。
[0094]運(yùn)算后的Entry:A字段(A內(nèi)容)、B字段(B內(nèi)容)、,C字段(C’內(nèi)容)、D字段(D內(nèi)容),可見(jiàn)C字段使用了第二次update的內(nèi)容,字段為兩次變更字段的合集。
[0095]又例如在同一子鏈表中,前一個(gè)Entry的變更類型Update,變更了 3個(gè)字段后得到A字段(A內(nèi)容)、B字段(B內(nèi)容)、C字段(C內(nèi)容)。
[0096]而后一個(gè)Entry的變更類型也為Update,變更了 2個(gè)字段得到D字段(D內(nèi)容)、E字段(E內(nèi)容)。
[0097]運(yùn)算后的Entry:A字段(A內(nèi)容)、B字段(B內(nèi)容)、C字段(C內(nèi)容)、D字段(D內(nèi)容)、E字段(E內(nèi)容),即兩次變更沒(méi)有交集,合并的結(jié)果為5個(gè)字段,字段為兩次變更字段的合集。
[0098]d) Entry (Update 類型)+Entry (Delete 類型)=> Entry (Delete 類型),直接返回 Entry (Delete 類型)。
[0099]例如在同一子鏈表中,前一個(gè)Entry的變更類型為Update,即對(duì)A字段(A內(nèi)容)進(jìn)行了更新得到A字段(A’內(nèi)容),而后一個(gè)Entry的變更類型為Delete,即刪除A字段,那么運(yùn)算后的Entry則視為刪除更新后的A字段。
[0100]e) Entry (Delete 類型)+Entry (Insert 類型)=> Entry (Insert 類型),直接返回 Entry (Insert 類型)。
[0101]例如在同一子鏈表中,前一個(gè)Entry的變更類型Delete,即刪除A字段(A內(nèi)容),而后一個(gè)Entry的變更類型為Insert,即插入A字段(A內(nèi)容),那么運(yùn)算后的Entry則視為插入A字段(A內(nèi)容)。
[0102]在步驟120中經(jīng)以上處理得到合并后的內(nèi)部對(duì)象,再進(jìn)行壓縮和發(fā)送,其中壓縮時(shí)首先通過(guò)數(shù)據(jù)對(duì)象序列化將合并后的內(nèi)部對(duì)象轉(zhuǎn)化為二進(jìn)制,具體算法可以采用高效數(shù)據(jù)對(duì)象序列化算法:google protobuf ;
[0103]文檔:https: //developers, google, com/protocol-buffers/docs/overview。
[0104]針對(duì)序列化后的數(shù)據(jù)再通過(guò)壓縮算法進(jìn)一步壓縮,具體算法可以采用高效數(shù)據(jù)壓縮算法:gzip ;文檔:http://www.gzip.0rg/。
[0105]完成壓縮后可以利用傳統(tǒng)的tcp傳輸方式,可靠的將數(shù)據(jù)傳遞給目標(biāo)數(shù)據(jù)庫(kù)端。
[0106]步驟130、在目標(biāo)數(shù)據(jù)庫(kù)端接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù)(壓縮后的數(shù)據(jù)),按照各并行進(jìn)程的次序進(jìn)行加載得到待同步數(shù)據(jù),利用該待同步數(shù)據(jù)更新目標(biāo)數(shù)據(jù)庫(kù)。
[0107]在目標(biāo)數(shù)據(jù)庫(kù)端按照mysql server同步協(xié)議,順序的重新執(zhí)行變更數(shù)據(jù),在進(jìn)行數(shù)據(jù)庫(kù)重新執(zhí)行變更記錄之前,會(huì)進(jìn)行并行過(guò)程重排。按照原先的數(shù)據(jù)獲取順序,也就是按并行過(guò)程序號(hào)從小到大,先加載并行進(jìn)程I的數(shù)據(jù),再加載并行進(jìn)程2的數(shù)據(jù),最后依次加載直到完成,此整個(gè)過(guò)程為串行。
[0108]整個(gè)同步過(guò)程中,源數(shù)據(jù)庫(kù)端與目標(biāo)數(shù)據(jù)庫(kù)端一直維護(hù)已經(jīng)開(kāi)啟的并行進(jìn)程,以避免通信的間斷。
[0109]本實(shí)施例還提供一種跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng),用于目標(biāo)數(shù)據(jù)庫(kù)跨機(jī)房的從源數(shù)據(jù)庫(kù)同步數(shù)據(jù),如圖4所示,包括:
[0110]監(jiān)聽(tīng)模塊200,用于在源數(shù)據(jù)庫(kù)端監(jiān)聽(tīng)源數(shù)據(jù)庫(kù)的變更,源數(shù)據(jù)庫(kù)的變更為Insert、Update、Delete至少一種事件的觸發(fā);
[0111]提取模塊210,用于利用多個(gè)順序編號(hào)的并行進(jìn)程依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù);[0112]數(shù)據(jù)處理模塊220,用于各個(gè)并行進(jìn)程將提取到的數(shù)據(jù)經(jīng)合并、壓縮后進(jìn)行發(fā)送;
[0113]接收模塊230,用于在目標(biāo)數(shù)據(jù)庫(kù)端接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù),按照各并行進(jìn)程的次序進(jìn)行加載得到待同步數(shù)據(jù),利用該待同步數(shù)據(jù)更新目標(biāo)數(shù)據(jù)庫(kù)。
[0114]提取模塊210包括:
[0115]進(jìn)程啟動(dòng)模塊211,用于開(kāi)啟多個(gè)并行進(jìn)程并對(duì)每個(gè)并行進(jìn)程賦以編號(hào);
[0116]解析模塊212,用于各個(gè)并行進(jìn)程按照編號(hào)依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),且在提取的同時(shí)進(jìn)行解析得到若干內(nèi)部對(duì)象,解析時(shí)通過(guò)與源數(shù)據(jù)庫(kù)相匹配的協(xié)議格式解析得到所述內(nèi)部對(duì)象,該內(nèi)部對(duì)象的數(shù)據(jù)結(jié)構(gòu)包括事件類型、主鍵信息和變更字段。
[0117]數(shù)據(jù)處理模塊220包括依次對(duì)提取到的數(shù)據(jù)進(jìn)行相應(yīng)處理的合并模塊221、壓縮模塊222和發(fā)送模塊223,其中合并模塊221包括:
[0118]建子鏈表模塊2211,用于同一并行進(jìn)程中,將主鍵信息相同的內(nèi)部對(duì)象構(gòu)建為子鏈表;
[0119]運(yùn)算合并模塊2212,用于將同屬一個(gè)子鏈表的所有內(nèi)部對(duì)象按照事件類型的不同組合依次進(jìn)行運(yùn)算,處理得到合并后的內(nèi)部對(duì)象。
[0120]本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步方法和系統(tǒng)引入了數(shù)據(jù)的合并,使數(shù)據(jù)傳遞最小化,采用并行進(jìn)程,每個(gè)并行進(jìn)程拿到數(shù)據(jù)后,在各自的進(jìn)程中會(huì)依次進(jìn)入數(shù)據(jù)的合并、壓縮和傳送,多個(gè)并行進(jìn)程互不干擾,這樣在針對(duì)跨機(jī)房、跨地區(qū)網(wǎng)絡(luò)的同步中,提高的效率,避免數(shù)據(jù)堆積。
[0121]本申請(qǐng)跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng)的各個(gè)模塊可以集成于一體,也可以分離部署,或進(jìn)一步拆分成多個(gè)子模塊。各個(gè)模塊可以按照實(shí)施例描述分布于實(shí)施例的系統(tǒng)中,也可以進(jìn)行相應(yīng)變化位于不同于本實(shí)施例的一個(gè)或多個(gè)系統(tǒng)中。
[0122]本領(lǐng)域的技術(shù)人員應(yīng)該明白,本申請(qǐng)的實(shí)施例可提供成為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。
[0123]本申請(qǐng)的各模塊或各步驟可以用通用的計(jì)算裝置來(lái)實(shí)現(xiàn),可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來(lái)實(shí)現(xiàn),從而可以將它們存儲(chǔ)在存儲(chǔ)裝置中由計(jì)算裝置來(lái)執(zhí)行,或者將它們分別制作成各個(gè)集成電路模塊,或者將它們中的多個(gè)模塊或步驟制作成單個(gè)集成電路模塊來(lái)實(shí)現(xiàn)。因此,本申請(qǐng)不限制于任何特定的硬件和軟件結(jié)合。
[0124]以上公開(kāi)的僅為本申請(qǐng)的具體實(shí)施例,但是本申請(qǐng)并非局限于此,本領(lǐng)域的技術(shù)人員可以對(duì)本申請(qǐng)進(jìn)行各種改動(dòng)和變型而不脫離本申請(qǐng)的精神和范圍。顯然這些改動(dòng)和變型均應(yīng)屬于本申請(qǐng)要求的保護(hù)范圍保護(hù)內(nèi)。
【權(quán)利要求】
1.一種跨機(jī)房數(shù)據(jù)庫(kù)同步方法,用于目標(biāo)數(shù)據(jù)庫(kù)跨機(jī)房的從源數(shù)據(jù)庫(kù)同步數(shù)據(jù),其特征在于,包括如下步驟: 步驟100、在源數(shù)據(jù)庫(kù)端監(jiān)聽(tīng)源數(shù)據(jù)庫(kù)的變更; 步驟110、利用多個(gè)順序編號(hào)的并行進(jìn)程依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù); 步驟120、各個(gè)并行進(jìn)程將提取到的數(shù)據(jù)經(jīng)合并、壓縮后進(jìn)行發(fā)送; 步驟130、在目標(biāo)數(shù)據(jù)庫(kù)端接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù),按照各并行進(jìn)程的次序進(jìn)行加載得到待同步數(shù)據(jù),利用該待同步數(shù)據(jù)更新目標(biāo)數(shù)據(jù)庫(kù)。
2.如權(quán)利要求1所述的跨機(jī)房數(shù)據(jù)庫(kù)同步方法,其特征在于,步驟100中,所述源數(shù)據(jù)庫(kù)的變更為Insert、Update、Delete至少一種事件的觸發(fā)。
3.如權(quán)利要求1所述的跨機(jī)房數(shù)據(jù)庫(kù)同步方法,其特征在于,步驟110具體包括: 步驟111、開(kāi)啟多個(gè)并行進(jìn)程并對(duì)每個(gè)并行進(jìn)程賦以編號(hào); 步驟112、各個(gè)并行進(jìn)程按照編號(hào)依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),且在提取的同時(shí)進(jìn)行解析得到若干內(nèi)部對(duì)象,即步驟120所述的提取到的數(shù)據(jù)。
4.如權(quán)利要求3所述的跨機(jī)房數(shù)據(jù)庫(kù)同步方法,其特征在于,步驟112中,通過(guò)與源數(shù)據(jù)庫(kù)相匹配的協(xié)議格式解析得到所述內(nèi)部對(duì)象,該內(nèi)部對(duì)象的數(shù)據(jù)結(jié)構(gòu)包括事件類型、主鍵信息和變更字段。
5.如權(quán)利要求4所述的跨機(jī)房數(shù)據(jù)庫(kù)同步方法,其特征在于,步驟120中,所述的合并包括: 步驟121、同一并行進(jìn)程中,將主鍵`信息相同的內(nèi)部對(duì)象構(gòu)建為子鏈表; 步驟122、將同屬一個(gè)子鏈表的所有內(nèi)部對(duì)象按照對(duì)應(yīng)的變更字段依次進(jìn)行運(yùn)算,處理得到合并后的內(nèi)部對(duì)象。
6.一種跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng),用于目標(biāo)數(shù)據(jù)庫(kù)跨機(jī)房的從源數(shù)據(jù)庫(kù)同步數(shù)據(jù),其特征在于,包括: 監(jiān)聽(tīng)模塊,用于在源數(shù)據(jù)庫(kù)端監(jiān)聽(tīng)源數(shù)據(jù)庫(kù)的變更; 提取模塊,用于利用多個(gè)順序編號(hào)的并行進(jìn)程依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù); 數(shù)據(jù)處理模塊,用于各個(gè)并行進(jìn)程將提取到的數(shù)據(jù)經(jīng)合并、壓縮后進(jìn)行發(fā)送; 接收模塊,用于在目標(biāo)數(shù)據(jù)庫(kù)端接收各個(gè)并行進(jìn)程發(fā)送的數(shù)據(jù),按照各并行進(jìn)程的次序進(jìn)行加載得到待同步數(shù)據(jù),利用該待同步數(shù)據(jù)更新目標(biāo)數(shù)據(jù)庫(kù)。
7.如權(quán)利要求6所述的跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng),其特征在于,所述監(jiān)聽(tīng)模塊中,源數(shù)據(jù)庫(kù)的變更為Insert、Update、Delete至少一種事件的觸發(fā)。
8.如權(quán)利要求6所述的跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng),其特征在于,所述提取模塊包括: 進(jìn)程啟動(dòng)模塊,用于開(kāi)啟多個(gè)并行進(jìn)程并對(duì)每個(gè)并行進(jìn)程賦以編號(hào); 解析模塊,用于各個(gè)并行進(jìn)程按照編號(hào)依次提取源數(shù)據(jù)庫(kù)的變更數(shù)據(jù),且在提取的同時(shí)進(jìn)行解析得到若干內(nèi)部對(duì)象,即數(shù)據(jù)處理模塊中所述的提取到的數(shù)據(jù)。
9.如權(quán)利要求8所述的跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng),其特征在于,所述解析模塊,通過(guò)與源數(shù)據(jù)庫(kù)相匹配的協(xié)議格式解析得到所述內(nèi)部對(duì)象,該內(nèi)部對(duì)象的數(shù)據(jù)結(jié)構(gòu)包括事件類型、主鍵信息和變更字段。
10.如權(quán)利要求9所述的跨機(jī)房數(shù)據(jù)庫(kù)同步系統(tǒng),其特征在于,所述數(shù)據(jù)處理模塊包括依次對(duì)提取到的數(shù)據(jù)進(jìn)行相應(yīng)處理的合并模塊、壓縮模塊和發(fā)送模塊,其中所述合并模塊包括: 建子鏈表模塊,用于同一并行進(jìn)程中,將主鍵信息相同的內(nèi)部對(duì)象構(gòu)建為子鏈表;運(yùn)算合并模塊,用于將同屬一個(gè)子鏈表的所有內(nèi)部對(duì)象按照對(duì)應(yīng)的變更字段依次進(jìn)行運(yùn)算, 處理得到合并后的內(nèi)部對(duì)象。
【文檔編號(hào)】G06F17/30GK103778136SQ201210400979
【公開(kāi)日】2014年5月7日 申請(qǐng)日期:2012年10月19日 優(yōu)先權(quán)日:2012年10月19日
【發(fā)明者】樓江航 申請(qǐng)人:阿里巴巴集團(tuán)控股有限公司