專(zhuān)利名稱(chēng):一種多數(shù)據(jù)庫(kù)數(shù)據(jù)同步方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)庫(kù)的數(shù)據(jù)同步領(lǐng)域,具體地講,提供了一種基于異步消息機(jī)制的收發(fā)分離數(shù)據(jù)同步實(shí)現(xiàn)方法。
背景技術(shù):
在很多系統(tǒng)中都有數(shù)據(jù)同步的需求,保證多模塊的數(shù)據(jù)都要一致,而且要考慮實(shí)時(shí)性和正確性。申請(qǐng)?zhí)枮?2103019.7的中國(guó)專(zhuān)利提出了一種通信系統(tǒng)中主備板數(shù)據(jù)實(shí)時(shí)同步的方法,提供了一種內(nèi)存數(shù)據(jù)庫(kù)主備同步的方案。此專(zhuān)利在主、備板中各設(shè)置一數(shù)據(jù)緩沖區(qū);當(dāng)主板數(shù)據(jù)修改時(shí),向其緩沖區(qū)中寫(xiě)入主板修改過(guò)的數(shù)據(jù);緩沖區(qū)對(duì)數(shù)據(jù)進(jìn)行處理;當(dāng)緩沖區(qū)數(shù)據(jù)量達(dá)到一定時(shí),主板實(shí)時(shí)同步進(jìn)程從緩沖區(qū)中讀數(shù)據(jù)并發(fā)送到備板實(shí)時(shí)同步進(jìn)程;更新備板數(shù)據(jù)庫(kù),并將操作結(jié)果返回給主板;如果操作結(jié)果是同步成功,則刪除緩沖區(qū)中相應(yīng)的數(shù)據(jù),否則重新發(fā)送數(shù)據(jù),直至緩沖區(qū)內(nèi)記錄為空。
1、原有技術(shù)在主板緩沖區(qū)達(dá)到一定數(shù)量時(shí)才會(huì)觸發(fā)主備同步,實(shí)時(shí)性不夠好。我們發(fā)明只要主數(shù)據(jù)庫(kù)發(fā)生變化就向目標(biāo)數(shù)據(jù)庫(kù)同步。
2、原有技術(shù)采用發(fā)送數(shù)據(jù)包后,主機(jī)等待備機(jī)應(yīng)答后才做下一步處理。我們發(fā)明采用收發(fā)分離方法,主數(shù)據(jù)庫(kù)發(fā)送數(shù)據(jù)不需要等待目標(biāo)數(shù)據(jù)庫(kù)應(yīng)答,數(shù)據(jù)同步效率比較高。
3、原有技術(shù)緩沖區(qū)存放的是所有變化數(shù)據(jù),空間占用比較多。
我們的發(fā)明緩沖區(qū)只存放修改記錄的關(guān)鍵字,占用空間較小。
4、如果對(duì)同一索引記錄頻繁修改,原有方法會(huì)造成緩沖區(qū)利用率不高。
我們發(fā)明由于緩沖區(qū)只存放關(guān)鍵字,所以對(duì)同一記錄反復(fù)修改在數(shù)據(jù)兩次同步之間等同于只修改2次,大大提高同步效率,并保證數(shù)據(jù)的一致性。
發(fā)明內(nèi)容
本發(fā)明提出了一種多數(shù)據(jù)庫(kù)數(shù)據(jù)同步方法,基于異步消息機(jī)制,并結(jié)合了數(shù)據(jù)處理要求效率高、實(shí)時(shí)性強(qiáng)的特點(diǎn),使不同模塊間的數(shù)據(jù)同步保證了實(shí)時(shí)性,且傳輸量降低到最低程度;同時(shí),通過(guò)異步消息機(jī)制保證了數(shù)據(jù)同步的正確性,也提高了數(shù)據(jù)同步的效率。
本發(fā)明提出的多數(shù)據(jù)庫(kù)數(shù)據(jù)同步方法,包括以下處理步驟步驟一,初始化所有目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列;步驟二,當(dāng)主數(shù)據(jù)庫(kù)發(fā)生變化時(shí),將變化表記錄的關(guān)鍵字寫(xiě)入各目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列,用唯一的ID號(hào)標(biāo)識(shí)其在失步隊(duì)列中的位置,并向所有目標(biāo)數(shù)據(jù)庫(kù)發(fā)送失步記錄內(nèi)容;步驟三,目標(biāo)數(shù)據(jù)庫(kù)接收數(shù)據(jù),并更新相應(yīng)表記錄,向主數(shù)據(jù)庫(kù)返回應(yīng)答消息,消息內(nèi)含有更新成功的失步記錄的ID號(hào);步驟四,主數(shù)據(jù)庫(kù)端根據(jù)響應(yīng)消息內(nèi)的ID號(hào),將該目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列內(nèi)對(duì)應(yīng)的失步記錄清除。
優(yōu)選地,步驟一中還可以設(shè)定一個(gè)周期定時(shí)器一,當(dāng)定時(shí)周期到時(shí)執(zhí)行以下同步過(guò)程;1)根據(jù)各目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列內(nèi)記錄的關(guān)鍵字,從數(shù)據(jù)庫(kù)中讀取若干條失步記錄,將其打包發(fā)送到目標(biāo)數(shù)據(jù)庫(kù),每次定時(shí)同步最大發(fā)包數(shù)量可以預(yù)設(shè);2)目標(biāo)數(shù)據(jù)庫(kù)接收數(shù)據(jù),并更新相應(yīng)表記錄,向主數(shù)據(jù)庫(kù)返回應(yīng)答消息,消息內(nèi)含有更新成功的失步記錄的ID號(hào);3)主數(shù)據(jù)庫(kù)端根據(jù)響應(yīng)消息內(nèi)的ID號(hào),將該目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列內(nèi)對(duì)應(yīng)的失步記錄清除。
優(yōu)選地,當(dāng)某個(gè)目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列溢出時(shí),執(zhí)行以下同步處理過(guò)程i清空該溢出的失步隊(duì)列,并將該隊(duì)列加鎖禁止讀寫(xiě),同時(shí)向該失步隊(duì)列對(duì)應(yīng)的目標(biāo)數(shù)據(jù)庫(kù)發(fā)送批量同步請(qǐng)求;ii系統(tǒng)接收到該目標(biāo)數(shù)據(jù)庫(kù)批量同步應(yīng)答消息后,將主數(shù)據(jù)庫(kù)所有需要同步的數(shù)據(jù)全部存儲(chǔ)到內(nèi)存緩沖區(qū),并將所述失步隊(duì)列解鎖;iii主數(shù)據(jù)庫(kù)將數(shù)據(jù)打包成同步數(shù)據(jù)包發(fā)送給目標(biāo)數(shù)據(jù)庫(kù);iv目標(biāo)數(shù)據(jù)庫(kù)接收同步數(shù)據(jù)包,進(jìn)行批量更新表記錄。
優(yōu)選地,如果步驟iv中目標(biāo)數(shù)據(jù)庫(kù)反饋同步不成功消息,主數(shù)據(jù)庫(kù)重復(fù)發(fā)送同步數(shù)據(jù)包給該目標(biāo)數(shù)據(jù)庫(kù)。
優(yōu)選地,所述步驟iii中主數(shù)據(jù)庫(kù)可以將數(shù)據(jù)打成多個(gè)同步數(shù)據(jù)包發(fā)送給目標(biāo)數(shù)據(jù)庫(kù),每次發(fā)送一包數(shù)據(jù),并設(shè)定同步超時(shí)定時(shí)器二;然后主數(shù)據(jù)庫(kù)收到目標(biāo)數(shù)據(jù)庫(kù)發(fā)送的成功應(yīng)答消息后,發(fā)送下一個(gè)包;如果收到失敗應(yīng)答或定時(shí)器二超時(shí)則重復(fù)發(fā)送同步數(shù)據(jù)包。
優(yōu)選地,還可以設(shè)定重復(fù)發(fā)送同步數(shù)據(jù)包次數(shù)的閾值,達(dá)到閾值則不再發(fā)送,系統(tǒng)告警并宣布本次批量同步失敗。
優(yōu)選地,所述步驟ii中,如果此時(shí)主數(shù)據(jù)庫(kù)發(fā)生變化,將變化表記錄的關(guān)鍵字寫(xiě)入各目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列,并用全局唯一的ID號(hào)標(biāo)識(shí)其在失步隊(duì)列中的位置,向除正在進(jìn)行批量同步外的其他目標(biāo)數(shù)據(jù)庫(kù)發(fā)送同步記錄內(nèi)容。
采用本發(fā)明所述的方法,具有以下優(yōu)點(diǎn)1.數(shù)據(jù)同步采收發(fā)分離機(jī)制,從而加快數(shù)據(jù)傳輸;即使偶爾丟失消息包也不會(huì)對(duì)數(shù)據(jù)完整性產(chǎn)生影響。
2.隊(duì)列所需空間大小依據(jù)應(yīng)用情況確定,以不頻繁發(fā)生所有數(shù)據(jù)同步為準(zhǔn),且需要保存信息少,所以空間要求不大。
3.數(shù)據(jù)同步的實(shí)時(shí)性和正確性由實(shí)時(shí)同步、定時(shí)器輪詢(xún)所有失步隊(duì)列和所有數(shù)據(jù)同步3個(gè)層面共同保證。
圖1是本發(fā)明多數(shù)據(jù)庫(kù)數(shù)據(jù)同步系統(tǒng)框架圖;圖2是本發(fā)明數(shù)據(jù)同步方法中實(shí)時(shí)同步和定時(shí)器輪詢(xún)失步隊(duì)列同步的處理流程圖;圖3是本發(fā)明數(shù)據(jù)同步方法中批量數(shù)據(jù)同步處理流程圖。
具體實(shí)施例方式
下面列舉一種應(yīng)用于前后臺(tái)數(shù)據(jù)同步的實(shí)施方案,其系統(tǒng)架構(gòu)如圖1。后臺(tái)系統(tǒng)作為源模塊,其數(shù)據(jù)庫(kù)采用商用數(shù)據(jù)庫(kù);前臺(tái)系統(tǒng)作為目的模塊,其數(shù)據(jù)庫(kù)是內(nèi)存數(shù)據(jù)庫(kù)。每次后臺(tái)數(shù)據(jù)修改后,都要通過(guò)實(shí)時(shí)同步、定時(shí)器輪詢(xún)和所有數(shù)據(jù)同步3個(gè)措施,同時(shí)向多個(gè)前臺(tái)模塊同步數(shù)據(jù)。數(shù)據(jù)同步流程如圖2所示,具體實(shí)現(xiàn)步驟如下1.為每個(gè)前臺(tái)模塊建立數(shù)據(jù)失步隊(duì)列,并初始化失步隊(duì)列和傳輸數(shù)據(jù)控制區(qū)(即隊(duì)列管理信息),設(shè)定輪詢(xún)周期定時(shí)器timer1。
1)數(shù)據(jù)失步隊(duì)列描述數(shù)據(jù)失步信息;
2)隊(duì)列管理信息描述隊(duì)列的狀態(tài);
2.把對(duì)數(shù)據(jù)的每一次操作(包括增加、修改、刪除數(shù)據(jù))將變化表記錄的關(guān)鍵字(即失步記錄關(guān)鍵值)插入到所有失步隊(duì)列中,并用唯一的ID號(hào)來(lái)標(biāo)記該操作在隊(duì)列中的位置。隊(duì)列只需記錄查找數(shù)據(jù)的關(guān)鍵值,而不記錄此次數(shù)據(jù)操作類(lèi)型。如果由于數(shù)據(jù)操作非常頻繁,而數(shù)據(jù)實(shí)時(shí)同步和定時(shí)同步來(lái)不及處理,導(dǎo)致數(shù)據(jù)失步隊(duì)列溢出,則清空失步隊(duì)列并加鎖防止讀寫(xiě),同時(shí)標(biāo)記該失步隊(duì)列為等待同步狀態(tài)。
3.系統(tǒng)從失步隊(duì)列中取失步記錄關(guān)鍵值,并查詢(xún)相應(yīng)的數(shù)據(jù),依據(jù)查詢(xún)結(jié)果來(lái)確定操作類(lèi)型(有數(shù)據(jù)則為修改,無(wú)數(shù)據(jù)則為刪除),把失步數(shù)據(jù)向前臺(tái)模塊發(fā)送。
4.前臺(tái)模塊接收數(shù)據(jù),更新相應(yīng)的表記錄,并向后臺(tái)反饋更新成功與否的消息,消息內(nèi)包含該記錄在失步隊(duì)列的ID號(hào)。
5.源模塊依據(jù)反饋的同步結(jié)果來(lái)處理如果同步成功,則依據(jù)ID號(hào)從失步隊(duì)列中刪除該條數(shù)據(jù)操作信息,否則保留該數(shù)據(jù)操作信息等待定時(shí)器定時(shí)輪詢(xún)處理。
6.timer1定時(shí)到,則所有失步隊(duì)列進(jìn)行輪詢(xún)。如果該失步隊(duì)列處于等待同步且非正在同步狀態(tài),則轉(zhuǎn)步驟7~11的批量同步過(guò)程,如圖3所示。如果該失步隊(duì)列正常(非處于等待同步或正在同步狀態(tài)),則從隊(duì)列中取若干(最大處理?xiàng)l數(shù)可以依據(jù)系統(tǒng)性能進(jìn)行調(diào)整)失步記錄向前臺(tái)同步,其過(guò)程如步驟3~5。
7.批量同步過(guò)程,即對(duì)所有數(shù)據(jù)進(jìn)行同步。后臺(tái)模塊向前臺(tái)模塊發(fā)送同步開(kāi)始消息,并取消等待同步狀態(tài)、打上正在同步狀態(tài)。
8.后臺(tái)接收到前臺(tái)模塊響應(yīng)的同步開(kāi)始消息后,讀取數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)并存儲(chǔ)在緩沖區(qū)中,依據(jù)消息大小和數(shù)據(jù)包格式進(jìn)行打包。同時(shí),系統(tǒng)將該失步隊(duì)列解鎖,重新開(kāi)始登記數(shù)據(jù)失步記錄,但不向前臺(tái)實(shí)時(shí)同步,如果失步隊(duì)列再次溢出,則再次清空失步隊(duì)列并上鎖,打上等待同步狀態(tài),一直等此次批量同步完成后再次進(jìn)行批量同步。
9.每次后臺(tái)給前臺(tái)模塊發(fā)送一個(gè)數(shù)據(jù)包(即數(shù)據(jù)同步消息),并設(shè)定同步超時(shí)定時(shí)器Timer2。前臺(tái)接收同步數(shù)據(jù)包后,進(jìn)行批量更新表記錄,并向后臺(tái)反饋同步成功與否的消息。
10.后臺(tái)接收到前臺(tái)模塊響應(yīng)的數(shù)據(jù)同步消息后,依據(jù)反饋結(jié)果,如果數(shù)據(jù)同步成功,發(fā)送下一包數(shù)據(jù)。如果數(shù)據(jù)同步失敗或Timer2超時(shí),則發(fā)送同一包數(shù)據(jù)(重發(fā)最多次數(shù)由系統(tǒng)需求確定)。如果重發(fā)次數(shù)超過(guò)閾值,則停止本次批量同步過(guò)程。如果非等待同步,則清空失步隊(duì)列并加鎖,打上等待同步狀態(tài),等待下一次定時(shí)器觸發(fā)批量同步過(guò)程。
11.如果所有數(shù)據(jù)都已經(jīng)同步完畢,后臺(tái)向前臺(tái)模塊發(fā)送同步結(jié)束消息,并在接收到前臺(tái)響應(yīng)的同步結(jié)束消息后,結(jié)束整個(gè)批量同步過(guò)程。
權(quán)利要求
1.一種多數(shù)據(jù)庫(kù)數(shù)據(jù)同步方法,其特征在于,所述方法包括以下處理步驟步驟一,初始化所有目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列;步驟二,當(dāng)主數(shù)據(jù)庫(kù)發(fā)生變化時(shí),將變化表記錄的關(guān)鍵字寫(xiě)入各目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列,用唯一的ID號(hào)標(biāo)識(shí)其在失步隊(duì)列中的位置,并向所有目標(biāo)數(shù)據(jù)庫(kù)發(fā)送失步記錄內(nèi)容;步驟三,目標(biāo)數(shù)據(jù)庫(kù)接收數(shù)據(jù),并更新相應(yīng)表記錄,向主數(shù)據(jù)庫(kù)返回應(yīng)答消息,消息內(nèi)含有更新成功的失步記錄的ID號(hào);步驟四,主數(shù)據(jù)庫(kù)端根據(jù)響應(yīng)消息內(nèi)的ID號(hào),將該目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列內(nèi)對(duì)應(yīng)的失步記錄清除。
2.如權(quán)利要求1所述的方法,其特征在于,步驟一中還可以設(shè)定一個(gè)周期定時(shí)器一,當(dāng)定時(shí)周期到時(shí)執(zhí)行以下同步過(guò)程1)根據(jù)各目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列內(nèi)記錄的關(guān)鍵字,從數(shù)據(jù)庫(kù)中讀取若干條失步記錄,將其打包發(fā)送到目標(biāo)數(shù)據(jù)庫(kù),每次定時(shí)同步最大發(fā)包數(shù)量可以預(yù)設(shè);2)目標(biāo)數(shù)據(jù)庫(kù)接收數(shù)據(jù),并更新相應(yīng)表記錄,向主數(shù)據(jù)庫(kù)返回應(yīng)答消息,消息內(nèi)含有更新成功的失步記錄的ID號(hào);3)主數(shù)據(jù)庫(kù)端根據(jù)響應(yīng)消息內(nèi)的ID號(hào),將該目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列內(nèi)對(duì)應(yīng)的失步記錄清除。
3.如權(quán)利要求1或2所述的方法,其特征在于,當(dāng)某個(gè)目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列溢出時(shí),執(zhí)行以下同步處理過(guò)程i清空該溢出的失步隊(duì)列,并將該隊(duì)列加鎖禁止讀寫(xiě),同時(shí)向該失步隊(duì)列對(duì)應(yīng)的目標(biāo)數(shù)據(jù)庫(kù)發(fā)送批量同步請(qǐng)求;ii系統(tǒng)接收到該目標(biāo)數(shù)據(jù)庫(kù)批量同步應(yīng)答消息后,將主數(shù)據(jù)庫(kù)所有需要同步的數(shù)據(jù)全部存儲(chǔ)到內(nèi)存緩沖區(qū),并將所述失步隊(duì)列解鎖;iii主數(shù)據(jù)庫(kù)將數(shù)據(jù)打包成同步數(shù)據(jù)包發(fā)送給目標(biāo)數(shù)據(jù)庫(kù)iv目標(biāo)數(shù)據(jù)庫(kù)接收同步數(shù)據(jù)包,進(jìn)行批量更新表記錄。
4.如權(quán)利要求3所述的方法,其特征在于,如果步驟iv中目標(biāo)數(shù)據(jù)庫(kù)反饋同步不成功消息,主數(shù)據(jù)庫(kù)重復(fù)發(fā)送同步數(shù)據(jù)包給該目標(biāo)數(shù)據(jù)庫(kù)。
5.如權(quán)利要求3所述的方法,其特征在于,所述步驟iii中主數(shù)據(jù)庫(kù)可以將數(shù)據(jù)打成多個(gè)同步數(shù)據(jù)包發(fā)送給目標(biāo)數(shù)據(jù)庫(kù),每次發(fā)送一包數(shù)據(jù),并設(shè)定同步超時(shí)定時(shí)器二;然后主數(shù)據(jù)庫(kù)收到目標(biāo)數(shù)據(jù)庫(kù)發(fā)送的成功應(yīng)答消息后,發(fā)送下一個(gè)包;如果收到失敗應(yīng)答或定時(shí)器二超時(shí)則重復(fù)發(fā)送同步數(shù)據(jù)包。
6.如權(quán)利要求5所述的方法,其特征在于,還可以設(shè)定重復(fù)發(fā)送同步數(shù)據(jù)包次數(shù)的閾值,達(dá)到閾值則不再發(fā)送,系統(tǒng)告警并宣布本次批量同步失敗。
7.如權(quán)利要求3所述的方法,其特征在于,所述步驟ii中,如果此時(shí)主數(shù)據(jù)庫(kù)發(fā)生變化,將變化表記錄的關(guān)鍵字寫(xiě)入各目標(biāo)數(shù)據(jù)庫(kù)的失步隊(duì)列,并用全局唯一的ID號(hào)標(biāo)識(shí)其在失步隊(duì)列中的位置,向除正在進(jìn)行批量同步外的其他目標(biāo)數(shù)據(jù)庫(kù)發(fā)送同步記錄內(nèi)容。
全文摘要
本發(fā)明公開(kāi)了一種多數(shù)據(jù)庫(kù)數(shù)據(jù)同步方法,對(duì)數(shù)據(jù)同步采收發(fā)分離機(jī)制,數(shù)據(jù)同步的實(shí)時(shí)性和正確性由實(shí)時(shí)同步、定時(shí)器輪詢(xún)所有失步隊(duì)列和所有數(shù)據(jù)同步3個(gè)層面共同保證。采用本發(fā)明的方法可以提高數(shù)據(jù)同步的效率,即使偶爾丟失消息包也不會(huì)對(duì)數(shù)據(jù)完整性產(chǎn)生影響,而且緩沖區(qū)只存放修改記錄的關(guān)鍵字,占用緩存空間較小。
文檔編號(hào)G06F17/30GK1725186SQ200410070619
公開(kāi)日2006年1月25日 申請(qǐng)日期2004年7月23日 優(yōu)先權(quán)日2004年7月23日
發(fā)明者肖旸, 胡首鋒, 許諍 申請(qǐng)人:中興通訊股份有限公司