專利名稱:一種內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種內(nèi)存數(shù)據(jù)庫領(lǐng)域,更具體的說,涉及一種內(nèi)存數(shù)據(jù)庫復(fù)制方法,用于解決多個內(nèi)存數(shù)據(jù)庫之間數(shù)據(jù)一致性的問題。
背景技術(shù):
隨著電信業(yè)不斷的發(fā)展,業(yè)務(wù)擴展越來越廣,各種新業(yè)務(wù)層出不窮,數(shù)據(jù)量也越來越大,對數(shù)據(jù)訪問的不間斷要求也越來越高。大量的用戶資料數(shù)據(jù)、用戶消費數(shù)據(jù)都需要存放在內(nèi)存數(shù)據(jù)庫中,但是由于內(nèi)存的非持久性,一旦內(nèi)存數(shù)據(jù)庫進程或者所在主機發(fā)生異常停止,內(nèi)存中的數(shù)據(jù)就將全部丟失,直接導(dǎo)致應(yīng)用程序無法繼續(xù)進行訪問。如何確保一個內(nèi)存數(shù)據(jù)庫節(jié)點損壞,另一個節(jié)點能夠快速接管,成為內(nèi)存數(shù)據(jù)庫安全的關(guān)鍵技術(shù)。目前,內(nèi)存數(shù)據(jù)庫之間的數(shù)據(jù)保持一致的方式一般有兩種一是完全同步方式,二是SQL語句重做方式。對于完全同步方式,當應(yīng)用程序修改主節(jié)點數(shù)據(jù)時,同時通過網(wǎng)絡(luò)去修改其他節(jié)點的內(nèi)存數(shù)據(jù)庫數(shù)據(jù),當兩者都操作成功后,再返回操作成功的標志。此種方式雖然能夠保證兩個節(jié)點之間的數(shù)據(jù)能夠完全一致,但由于需要同時操作兩個節(jié)點,使得訪問效率大打折扣,無法發(fā)揮內(nèi)存數(shù)據(jù)庫訪問速度快的優(yōu)勢。另外,隨著需要同步的節(jié)點的增加,訪問速度也會急劇下降。對于SQL語句重做的方式,應(yīng)用程序修改主節(jié)點數(shù)據(jù)時,同時將SQL操作寫入日志文件。通過單獨的復(fù)制程序,實時讀取日志文件,將SQL語句通過網(wǎng)絡(luò)發(fā)送到其他節(jié)點并執(zhí)行,此種方式雖然不會影響應(yīng)用訪問內(nèi)存數(shù)據(jù)庫主節(jié)點的速度,但復(fù)制進程需要重新解析 SQL語句,并重新在內(nèi)存中查找需要操作的記錄,在數(shù)據(jù)量巨大的電信業(yè)務(wù)系統(tǒng)中,難以在短時間內(nèi)將變化的數(shù)據(jù)復(fù)制到其他節(jié)點的內(nèi)存中。因此,需要提出一種既能節(jié)省資源,又能快速高效的實現(xiàn)內(nèi)存數(shù)據(jù)庫復(fù)制的方法。
發(fā)明內(nèi)容
為了實現(xiàn)多個內(nèi)存數(shù)據(jù)庫之間數(shù)據(jù)的實時同步,本發(fā)明提出一種內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法。該方法包括如下步驟
步驟I:主節(jié)點等待其他節(jié)點的連接請求;
步驟2 :備節(jié)點申請連接主節(jié)點,并發(fā)送需要復(fù)制的表的表名;
步驟3 :主節(jié)點掃描本節(jié)點的REDO日志文件,根據(jù)接收的表名挑選出需要發(fā)送的數(shù)據(jù)生成包括待復(fù)制表的增量數(shù)據(jù)包,通過Socket批量發(fā)送給備節(jié)點;
步驟4:備節(jié)點接收到需要的數(shù)據(jù)后,在本節(jié)點的內(nèi)存數(shù)據(jù)庫中逐條寫入,成功后,將成功標志發(fā)送給主節(jié)點;
步驟5 :主節(jié)點收到成功標志后,記錄本次掃描REDO日志文件的截止位置,以便于下次掃描時,從此位置接續(xù)。
本發(fā)明的有益效果是備節(jié)點在向主節(jié)點申請數(shù)據(jù)時,需要向主節(jié)點發(fā)送需要復(fù)制的表的表名,這樣可以根據(jù)實際需要選擇需要復(fù)制的表,不需要復(fù)制的表則不用發(fā)送, 從而節(jié)省相關(guān)資源。另外,由于各節(jié)點之間直接通過REDO日志進行數(shù)據(jù)復(fù)制,REDO日志中含有每條記錄的內(nèi)存坐標,備節(jié)點可以直接根據(jù)內(nèi)存坐標值在內(nèi)存中定位對應(yīng)的記錄,快速完成修改操作。進一步,REDO日志中每條記錄中存放的是當前每個字段的值,即使之前主節(jié)點和備節(jié)點之間的記錄由于某種原因已經(jīng)不一致了,經(jīng)過REDO日志的復(fù)制之后,備節(jié)點會立即將對應(yīng)記錄的值改成和主節(jié)點一致的數(shù)據(jù),從而確保備節(jié)點的數(shù)據(jù)時刻和主節(jié)點保持一致。
圖I為本發(fā)明的內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方式的流程圖。圖2為本發(fā)明的備節(jié)點的接收線程流程圖。圖3為本發(fā)明作為數(shù)據(jù)源的主節(jié)點的發(fā)送線程流程圖。
具體實施例方式以下結(jié)合附圖對本發(fā)明的原理和特征進行描述,所舉實例只用于解釋本發(fā)明,并非用于限定本發(fā)明的范圍。本發(fā)明的內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,如圖I所示,包括如下步驟
步驟I :主節(jié)點等待其他節(jié)點的連接請求,例如打開socket接口,啟動監(jiān)聽服務(wù);
步驟2 :備節(jié)點申請連接主節(jié)點,并發(fā)送需要復(fù)制的表的表名;
步驟3 :主節(jié)點掃描本節(jié)點的REDO日志文件,根據(jù)接收的表名挑選出需要發(fā)送的數(shù)據(jù), 生成待復(fù)制表的增量數(shù)據(jù)包,通過Socket批量發(fā)送給備節(jié)點;
步驟4:備節(jié)點從端口讀取接收到的數(shù)據(jù)后,在本節(jié)點的內(nèi)存數(shù)據(jù)庫中按順序?qū)懭耄晒?將成功標志發(fā)送給主節(jié)點;
步驟5 :主節(jié)點收到成功標志后,記錄本次掃描REDO日志文件的截止位置,以便于下次掃描時,從此位置接續(xù)。其中備節(jié)點向主節(jié)點發(fā)送需要復(fù)制的表名列表,該列表中可以同時包含多個表名,如“bbb;myteSt”,多個表名之間可以用“;”分隔。主節(jié)點接收到此列表之后,先保留在臨時變量中,然后實時去讀取REDO日志,REDO日志中每條記錄中都含有表名信息,主節(jié)點讀出此表名,然后判斷是否需要復(fù)制,如果需要,則發(fā)送相應(yīng)的數(shù)據(jù)給備節(jié)點,否則就繼續(xù)讀取下一條表名。備節(jié)點收到數(shù)據(jù)之后,根據(jù)操作標志,在對應(yīng)表的對應(yīng)記錄上做修改操作,實現(xiàn)數(shù)據(jù)的復(fù)制。在內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制中,當申請數(shù)據(jù)復(fù)制后,備節(jié)點啟動接收線程,其流程圖如圖2所示
備節(jié)點連接到數(shù)據(jù)源主節(jié)點,如果未連接上數(shù)據(jù)源主節(jié)點,則在休眠指定時間后,繼續(xù)連接;如果連接到數(shù)據(jù)源主節(jié)點,則從端口讀取數(shù)據(jù)源主節(jié)點發(fā)送的數(shù)據(jù),并逐條寫入本機內(nèi)存數(shù)據(jù)庫;判斷是否寫入成功,如果寫入成功,則向主節(jié)點發(fā)送成功標志,如果寫入不成功,則斷開連接,并在休眠指定時間后,重新執(zhí)行上述所有步驟。
在內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制中,作為數(shù)據(jù)源的主節(jié)點,啟動接收線程,其流程圖如圖3 所示
主節(jié)點打開socket接口,啟動監(jiān)聽服務(wù),等待申請者的連接;當接收申請者的連接請求后,根據(jù)REDO日志生成包括待復(fù)制表的增量數(shù)據(jù)包并發(fā)送;接收來自申請者的接收處理成功標志;如果增量數(shù)據(jù)已全部發(fā)送完畢,記錄對應(yīng)的文件位置,休眠指定時間,該指定時間例如可以是I秒,之后,重新執(zhí)行上述所有步驟。以下為采用本發(fā)明方法的配置文件信息,本文件配置的是進程運行時使用的基本信息,采用INI文件格式。[DRS_INF0]
DR_P0RT = 12001 #本機作為數(shù)據(jù)源時開放的監(jiān)聽端口號 #復(fù)制的數(shù)據(jù)源
HOST= 192.168.O.2:12001
TAB= bbb;mytest#需要復(fù)制的表,分號分隔
如果多個節(jié)點的“HOST”配置都指向同一個值,則會實現(xiàn)一個節(jié)點向多個節(jié)點復(fù)制。也就是說,如果備節(jié)點為多個時,多個備節(jié)點連接同一個主節(jié)點,主節(jié)點能夠為每個請求數(shù)據(jù)的備節(jié)點創(chuàng)建獨立的復(fù)制線程,從而實現(xiàn)內(nèi)存數(shù)據(jù)庫的多節(jié)點復(fù)制。 以上所述僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范圍之內(nèi)。
權(quán)利要求
1.一種內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,包括步驟I:主節(jié)點等待其他節(jié)點的連接請求;步驟2 :備節(jié)點申請連接主節(jié)點,并發(fā)送需要復(fù)制的表的表名;步驟3 :主節(jié)點掃描本節(jié)點的REDO日志文件,根據(jù)接收的表名挑選出需要發(fā)送的數(shù)據(jù)生成包括待復(fù)制表的增量數(shù)據(jù)包,通過Socket批量發(fā)送給備節(jié)點;步驟4:備節(jié)點接收到需要的數(shù)據(jù)后,在本節(jié)點的內(nèi)存數(shù)據(jù)庫中逐條寫入,成功后,將成功標志發(fā)送給主節(jié)點;步驟5 :主節(jié)點收到成功標志后,記錄本次掃描REDO日志文件的截止位置,以便于下次掃描時,從此位置接續(xù)。
2.根據(jù)權(quán)利要求I所述的內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,其特征在于在步驟I中主節(jié)點提供監(jiān)聽服務(wù),等待其他其他節(jié)點請求數(shù)據(jù)。
3.根據(jù)權(quán)利要求I所述的內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,其特征在于復(fù)制是以表為單位的,僅對指定的表進行復(fù)制。
4.根據(jù)權(quán)利要求I所述的內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,其特征在于RED0日志中含有每條記錄的內(nèi)存坐標,備節(jié)點直接根據(jù)內(nèi)存坐標值在內(nèi)存中定位對應(yīng)的記錄,快速完成寫入操作。
5.根據(jù)權(quán)利要求I所述的內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,其特征在于備節(jié)點為多個,多個備節(jié)點連接同一個主節(jié)點,主節(jié)點為每個請求數(shù)據(jù)的備節(jié)點創(chuàng)建獨立的復(fù)制線程,從而實現(xiàn)內(nèi)存數(shù)據(jù)庫的多節(jié)點復(fù)制。
6.根據(jù)權(quán)利要求I所述的內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,其特征在于在步驟2中,備節(jié)點能夠一次同時向主節(jié)點發(fā)送N個需要復(fù)制的表名列表,N > 2。
全文摘要
本發(fā)明提供了一種內(nèi)存數(shù)據(jù)庫節(jié)點復(fù)制方法,包括以下步驟主節(jié)點等待其他節(jié)點的連接請求;備節(jié)點申請連接主節(jié)點,并發(fā)送需要復(fù)制的表的表名;主節(jié)點掃描本節(jié)點的REDO日志文件,根據(jù)接收的表名生成包括待復(fù)制表的增量數(shù)據(jù)包,并發(fā)送給備節(jié)點;備節(jié)點接收到需要的數(shù)據(jù)后,在本節(jié)點的內(nèi)存數(shù)據(jù)庫中逐條寫入,成功后,將成功標志發(fā)送給主節(jié)點;主節(jié)點收到成功標志后,記錄本次掃描REDO日志文件的截止位置,以便于下次掃描時,從此位置接續(xù)。本發(fā)明采用備節(jié)點主動申請、主節(jié)點被動發(fā)送的的方式,將主節(jié)點的REDO日志實時發(fā)送到各個備節(jié)點上,實現(xiàn)內(nèi)存數(shù)據(jù)庫多節(jié)點復(fù)制。因此,既節(jié)省了資源,又能快速高效的實現(xiàn)內(nèi)存數(shù)據(jù)庫的復(fù)制。
文檔編號G06F17/30GK102609479SQ20121001782
公開日2012年7月25日 申請日期2012年1月20日 優(yōu)先權(quán)日2012年1月20日
發(fā)明者王金山 申請人:北京神州數(shù)碼思特奇信息技術(shù)股份有限公司