肖剛
摘要:數(shù)據(jù)庫同步是實(shí)現(xiàn)不同系統(tǒng)之間數(shù)據(jù)共享的有效方法。現(xiàn)有異構(gòu)數(shù)據(jù)庫同步模型能有效解決記錄的同步新增,但由于同步記錄查詢基于數(shù)據(jù)表名和關(guān)鍵字值,若不考慮同步數(shù)據(jù)庫節(jié)點(diǎn)變化,將導(dǎo)致數(shù)據(jù)庫不適用于某些遺留系統(tǒng)。針對(duì)該問題,提出同步控制和主從記錄映射方法,在同步控制層記錄主從記錄映射關(guān)系。在采用雙向中間件方法的同步技術(shù)基礎(chǔ)上,設(shè)計(jì)基于標(biāo)準(zhǔn)數(shù)據(jù)格式的數(shù)據(jù)轉(zhuǎn)換,降低數(shù)據(jù)轉(zhuǎn)換模塊開發(fā)維護(hù)成本,并根據(jù)模型應(yīng)用WCF框架實(shí)現(xiàn)系統(tǒng)。實(shí)踐應(yīng)用表明,該模型可實(shí)現(xiàn)異構(gòu)數(shù)庫之間同步更新。
關(guān)鍵詞:異構(gòu)數(shù)據(jù)庫;數(shù)據(jù)庫同步;主從記錄映射;標(biāo)準(zhǔn)數(shù)據(jù)格式
DOI:10.11907/ejdk.182416開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
中圖分類號(hào):TP392文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-7800(2019)010-0182-04
0引言
信息化建設(shè)具有階段性和分布性的特點(diǎn),由于缺乏統(tǒng)一的總體建設(shè)規(guī)劃及技術(shù)水平有限等原因,企業(yè)內(nèi)部各應(yīng)用系統(tǒng)相互獨(dú)立、結(jié)構(gòu)各異,采用不同的數(shù)據(jù)庫環(huán)境,缺乏統(tǒng)一的數(shù)據(jù)模型,系統(tǒng)之間數(shù)據(jù)共享困難。異構(gòu)數(shù)據(jù)庫同步是實(shí)現(xiàn)應(yīng)用系統(tǒng)數(shù)據(jù)共享的一種常見方法,尤其是對(duì)于遺留或無法獲取源碼的系統(tǒng),在明確數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)的基礎(chǔ)上,即可在不修改原有系統(tǒng)代碼和數(shù)據(jù)庫結(jié)構(gòu)的情況下實(shí)現(xiàn)數(shù)據(jù)共享。
為解決異構(gòu)數(shù)據(jù)庫同步問題,目前主要方法有以下3種:
(1)使用數(shù)據(jù)庫廠商提供的同步功能。該方法簡單易用、可靠性高,但不同數(shù)據(jù)庫系統(tǒng)之間的同步無法完全實(shí)現(xiàn)。
(2)基于數(shù)據(jù)復(fù)制合并技術(shù)的同步方案。通過在主從數(shù)據(jù)庫之間的雙向數(shù)據(jù)交換,定期將修改的數(shù)據(jù)進(jìn)行合并,該方法能有效實(shí)現(xiàn)主從數(shù)據(jù)的雙向交換,但需要修改主數(shù)據(jù)庫的表結(jié)構(gòu),增加數(shù)據(jù)表記錄的操作時(shí)間戳數(shù)據(jù)字段,以解決數(shù)據(jù)沖突。
(3)基于日志技術(shù)的同步方案,把對(duì)數(shù)據(jù)更新操作的更新信息保存下來,然后傳輸、轉(zhuǎn)換、重放實(shí)現(xiàn)數(shù)據(jù)同步,但該方案數(shù)據(jù)安全存在問題。
這些模型能有效實(shí)現(xiàn)新增操作記錄同步,對(duì)于記錄更新操作(修改、刪除)、同步記錄的查詢是通過匹配在同步節(jié)點(diǎn)數(shù)據(jù)表記錄的主關(guān)鍵字ID,并且根據(jù)當(dāng)前同步配置確定同步發(fā)送的節(jié)點(diǎn)信息實(shí)現(xiàn)的,但該方法不適用于主關(guān)鍵字段復(fù)雜、節(jié)點(diǎn)發(fā)送動(dòng)態(tài)變化的情況。
本文設(shè)計(jì)同步控制和主從記錄映射機(jī)制,通過保存主記錄的同步發(fā)送節(jié)點(diǎn)信息和主從記錄同步映射關(guān)系,解決同步更新中的問題。數(shù)據(jù)同步技術(shù)采用雙向中間件方法,在每兩個(gè)異構(gòu)數(shù)據(jù)庫間建立一個(gè)中間件,該方法傳輸效率高,但開發(fā)成本高、難于維護(hù)、擴(kuò)展性差。通過設(shè)計(jì)標(biāo)準(zhǔn)數(shù)據(jù)格式,異構(gòu)數(shù)據(jù)庫基于標(biāo)準(zhǔn)數(shù)據(jù)格式進(jìn)行數(shù)據(jù)轉(zhuǎn)換,可降低開發(fā)維護(hù)成本、提高擴(kuò)展性。
1異構(gòu)數(shù)據(jù)庫同步
異構(gòu)數(shù)據(jù)庫指相關(guān)多個(gè)數(shù)據(jù)庫系統(tǒng)的集合,異構(gòu)性包括操作系統(tǒng)異構(gòu)、數(shù)據(jù)庫管理系統(tǒng)異構(gòu)、數(shù)據(jù)庫表結(jié)構(gòu)異構(gòu)。
數(shù)據(jù)庫同步指不同數(shù)據(jù)庫之間進(jìn)行數(shù)據(jù)交換,使一個(gè)數(shù)據(jù)庫中數(shù)據(jù)記錄改變以同樣方式出現(xiàn)在另一個(gè)數(shù)據(jù)庫中。按信息同步方向可分為單向和雙向同步。單向同步也叫主從同步,其中一個(gè)數(shù)據(jù)庫是主數(shù)據(jù)庫,另一個(gè)數(shù)據(jù)庫是從數(shù)據(jù)庫,只有主數(shù)據(jù)庫的改變可以被復(fù)制到從數(shù)據(jù)庫;雙向同步指數(shù)據(jù)庫沒有主從之分,任何一個(gè)數(shù)據(jù)庫的變化均會(huì)復(fù)制到另一個(gè)數(shù)據(jù)庫中。按傳輸模式可分為同步和異步傳輸模式,同步數(shù)據(jù)同步(實(shí)時(shí)數(shù)據(jù)同步)指實(shí)時(shí)更新數(shù)據(jù)的同步模式,異步數(shù)據(jù)同步(批量數(shù)據(jù)同步)是一種延遲數(shù)據(jù)更新的模式,數(shù)據(jù)庫間會(huì)臨時(shí)出現(xiàn)數(shù)據(jù)不一致,但最終會(huì)保持?jǐn)?shù)據(jù)一致。
2同步模型
本文討論的異構(gòu)數(shù)據(jù)庫同步限定為單向同步傳輸數(shù)據(jù)同步,同步數(shù)據(jù)單元限定為單個(gè)數(shù)據(jù)表記錄,主數(shù)據(jù)庫與從數(shù)據(jù)庫是一對(duì)多的關(guān)系,即一個(gè)主數(shù)據(jù)庫可將一個(gè)數(shù)據(jù)記錄同步到多個(gè)從數(shù)據(jù)庫。約定數(shù)據(jù)庫節(jié)點(diǎn)指網(wǎng)絡(luò)節(jié)點(diǎn)中的數(shù)據(jù)庫存儲(chǔ),包括節(jié)點(diǎn)IP地址和數(shù)據(jù)庫名,主、從記錄分別指同步數(shù)據(jù)在主、從數(shù)據(jù)庫中對(duì)應(yīng)的數(shù)據(jù)表記錄。
2.1現(xiàn)有模型同步更新存在的問題
主數(shù)據(jù)庫記錄發(fā)生更新操作時(shí),同步更新操作需要確定:①哪些同步數(shù)據(jù)庫節(jié)點(diǎn)要進(jìn)行更新?②同步數(shù)據(jù)庫節(jié)點(diǎn)中哪個(gè)記錄要進(jìn)行更新?現(xiàn)有同步模型在這兩個(gè)問題的處理上存在問題。
2.1.1同步數(shù)據(jù)庫節(jié)點(diǎn)動(dòng)態(tài)變化
現(xiàn)有模型沒有考慮同步數(shù)據(jù)庫節(jié)點(diǎn)變化,同步數(shù)據(jù)庫節(jié)點(diǎn)相對(duì)固定,但仍有可能發(fā)生變化,如果在數(shù)據(jù)更新前同步數(shù)據(jù)庫節(jié)點(diǎn)發(fā)生變化,則同步更新失敗。具體原因?yàn)椋孩僭黾恿送綌?shù)據(jù)庫節(jié)點(diǎn),由于新增數(shù)據(jù)庫節(jié)點(diǎn)沒有對(duì)應(yīng)記錄,更新操作將導(dǎo)致數(shù)據(jù)庫操作異常;②刪除同步數(shù)據(jù)庫節(jié)點(diǎn),數(shù)據(jù)更新操作將不能同步到被刪除的數(shù)據(jù)庫節(jié)點(diǎn)中,節(jié)點(diǎn)中對(duì)應(yīng)記錄將保持不變。
2.1.2主從記錄映射
現(xiàn)有同步模型中,主從記錄的映射關(guān)系通過主關(guān)鍵字ID的一致性進(jìn)行判斷,其前提條件是主從數(shù)據(jù)表的主關(guān)鍵字是單屬性,數(shù)據(jù)特性相同,并且在同步新增記錄時(shí),設(shè)置從記錄的主關(guān)鍵字ID等于主記錄的主關(guān)鍵字ID,該方法不適合下列情況:①主關(guān)鍵字是自增加字段,字段值由數(shù)據(jù)庫自動(dòng)生成;②主關(guān)鍵字包含多個(gè)字段,單個(gè)字段不能唯一標(biāo)識(shí)記錄;③主關(guān)鍵字有自定義的構(gòu)造方法,主從數(shù)據(jù)庫構(gòu)造方法不同。
2.2基于標(biāo)準(zhǔn)數(shù)據(jù)格式的數(shù)據(jù)轉(zhuǎn)換
由于不同數(shù)據(jù)庫節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)模型不同,在數(shù)據(jù)命名、數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)方面存在差異,數(shù)據(jù)同步需要對(duì)不同數(shù)據(jù)模型進(jìn)行轉(zhuǎn)換。在雙向中間件方法的兩個(gè)異構(gòu)數(shù)據(jù)庫之間直接進(jìn)行數(shù)據(jù)轉(zhuǎn)換,數(shù)據(jù)同步實(shí)時(shí)更新,數(shù)據(jù)轉(zhuǎn)換效率高,但n個(gè)異構(gòu)數(shù)據(jù)庫節(jié)點(diǎn)的雙向同步需要n*(n-1)個(gè)數(shù)據(jù)轉(zhuǎn)換模塊,增加、修改一個(gè)數(shù)據(jù)表存儲(chǔ)模型不僅涉及本地?cái)?shù)據(jù)轉(zhuǎn)換模塊,還涉及所有同步節(jié)點(diǎn)的數(shù)據(jù)轉(zhuǎn)換模塊,導(dǎo)致數(shù)據(jù)庫開發(fā)維護(hù)成本高、擴(kuò)展性差。
基于標(biāo)準(zhǔn)數(shù)據(jù)格式轉(zhuǎn)換的數(shù)據(jù)流如圖1所示。數(shù)據(jù)發(fā)送前,主節(jié)點(diǎn)將主記錄轉(zhuǎn)換為標(biāo)準(zhǔn)數(shù)據(jù)格式,從節(jié)點(diǎn)在更新數(shù)據(jù)前,將接收的標(biāo)準(zhǔn)數(shù)據(jù)轉(zhuǎn)換為從記錄的數(shù)據(jù)格式。這樣n個(gè)數(shù)據(jù)節(jié)點(diǎn)的雙向同步只需要2*n個(gè)轉(zhuǎn)換模塊,增加、修改一個(gè)數(shù)據(jù)庫存儲(chǔ)模型,只需開發(fā)維護(hù)新數(shù)據(jù)模型與標(biāo)準(zhǔn)數(shù)據(jù)模型的數(shù)據(jù)轉(zhuǎn)換處理模塊,其它同步節(jié)點(diǎn)的數(shù)據(jù)轉(zhuǎn)換模塊保持不變。標(biāo)準(zhǔn)數(shù)據(jù)格式要包含同步數(shù)據(jù)表分組中所有數(shù)據(jù)表字段,并考慮一定的擴(kuò)展性,以保證數(shù)據(jù)轉(zhuǎn)換不會(huì)造成數(shù)據(jù)丟失,各同步數(shù)據(jù)表分組的標(biāo)準(zhǔn)數(shù)據(jù)格式互不相同。
2.3模型描述
同步模型分為3層:同步控制層、轉(zhuǎn)換層、傳輸層。
(1)同步控制層。管理數(shù)據(jù)同步任務(wù)啟動(dòng)和數(shù)據(jù)同步更新,主節(jié)點(diǎn)啟動(dòng)數(shù)據(jù)同步任務(wù),保存記錄同步發(fā)送信息;從節(jié)點(diǎn)更新本地?cái)?shù)據(jù)庫,保存主從記錄映射信息。
(2)數(shù)據(jù)轉(zhuǎn)換層。主節(jié)點(diǎn)將主記錄轉(zhuǎn)換為標(biāo)準(zhǔn)數(shù)據(jù)格式,從節(jié)點(diǎn)將標(biāo)準(zhǔn)格式數(shù)據(jù)轉(zhuǎn)換為從記錄的本地格式。
(3)傳輸層。將傳輸數(shù)據(jù)由主節(jié)點(diǎn)通過網(wǎng)絡(luò)發(fā)送到所有同步從節(jié)點(diǎn)。
主、從同步節(jié)點(diǎn)各層功能邏輯對(duì)應(yīng),互相協(xié)作完成主從數(shù)據(jù)庫同步。將主從同步節(jié)點(diǎn)互換,并增加相應(yīng)的處理模塊,即可實(shí)現(xiàn)兩個(gè)異構(gòu)數(shù)據(jù)庫的雙向同步。
2.4同步基本流程
假設(shè)主數(shù)據(jù)庫同步數(shù)據(jù)表是tm,從數(shù)據(jù)庫同步數(shù)據(jù)表是ts,如果對(duì)數(shù)據(jù)表tm進(jìn)行操作(對(duì)數(shù)據(jù)表變化捕獲參考相關(guān)文獻(xiàn)),則數(shù)據(jù)同步基本流程如下所示。
2.4.1主節(jié)點(diǎn)基本流程
(1)主節(jié)點(diǎn)獲取表tm操作的相關(guān)信息(包括記錄關(guān)鍵字ID、操作類型)如果是新增記錄,則讀取tm的同步數(shù)據(jù)庫節(jié)點(diǎn)配置信息,每個(gè)同步數(shù)據(jù)節(jié)點(diǎn)構(gòu)造一條同步發(fā)送數(shù)據(jù)并保存到同步發(fā)送表中。
(2)如果是新增或修改操作,查詢表tm,獲取記錄的實(shí)體數(shù)據(jù)并轉(zhuǎn)換為對(duì)應(yīng)的標(biāo)準(zhǔn)數(shù)據(jù)格式。
(3)將實(shí)體標(biāo)準(zhǔn)數(shù)據(jù)(如果是刪除操作,標(biāo)準(zhǔn)數(shù)據(jù)為null)、同步控制數(shù)據(jù),包括主節(jié)點(diǎn)IP、數(shù)據(jù)庫名、數(shù)據(jù)表名、記錄關(guān)鍵字ID、操作類型,組合成傳輸數(shù)據(jù),查詢同步發(fā)送表獲取記錄的同步節(jié)點(diǎn)信息,依次調(diào)用相應(yīng)數(shù)據(jù)傳輸服務(wù)代理方法,將傳輸數(shù)據(jù)發(fā)送到從節(jié)點(diǎn)。
2.4.2從節(jié)點(diǎn)基本流程
(1)接收主節(jié)點(diǎn)發(fā)送的傳輸數(shù)據(jù)。
(2)解析同步傳輸數(shù)據(jù),如果操作類型是新增或修改,將標(biāo)準(zhǔn)數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的從記錄數(shù)據(jù)格式。
(3)如果是新增記錄,增加記錄到表ts,獲取新增同步記錄的主關(guān)鍵字ID,并將主從記錄映射關(guān)系保存到主從記錄映射表中;如果是更新記錄,查詢主從記錄映射表,獲取同步記錄在ts的對(duì)應(yīng)記錄,對(duì)該記錄執(zhí)行相同更新操作。
3設(shè)計(jì)與實(shí)現(xiàn)
設(shè)計(jì)與實(shí)現(xiàn)主要包括3個(gè)關(guān)鍵方面:①同步發(fā)送表設(shè)計(jì);②主從記錄映射表設(shè)計(jì);③數(shù)據(jù)傳輸服務(wù)。
3.1同步發(fā)送數(shù)據(jù)表
同步發(fā)送數(shù)據(jù)表保存特定表記錄的同步數(shù)據(jù)庫節(jié)點(diǎn)信息,為同步更新操作提供同步信息,數(shù)據(jù)表結(jié)構(gòu)定義如表1所示。其中,SlaveNode記錄同步從節(jié)點(diǎn)IP地址,SlaveDbName記錄同步從數(shù)據(jù)庫表名,這樣同一記錄可同步到多個(gè)節(jié)點(diǎn)的多個(gè)數(shù)據(jù)庫中。MasterKeyId是主記錄關(guān)鍵字ID,如果主數(shù)據(jù)表主關(guān)鍵字是單屬性,MasterKeyId直接保存主記錄關(guān)鍵字ID,如果主數(shù)據(jù)表主關(guān)鍵字是多屬性,則MasterKeyld是多屬性組合,組合規(guī)則由系統(tǒng)自行確定,只要保證MasterKeyld的唯一性,如主數(shù)據(jù)表關(guān)鍵字屬性包括“keyl”和“key2”,自定義組合規(guī)則是在關(guān)鍵字之間加上“#”作為分隔符,則Masterkeyld為"keyl#key2”。
3.2主從記錄映射數(shù)據(jù)表
主從記錄映射數(shù)據(jù)表保存同步記錄在主數(shù)據(jù)庫節(jié)點(diǎn)與從數(shù)據(jù)庫節(jié)點(diǎn)間的對(duì)應(yīng)關(guān)系,為同步更新操作提供主記錄在同步從數(shù)據(jù)庫節(jié)點(diǎn)中的對(duì)應(yīng)記錄,數(shù)據(jù)表結(jié)構(gòu)見表2。其中,MasterNode字段記錄主節(jié)點(diǎn)IP地址,MasterDb-Name記錄主數(shù)據(jù)庫名,則從數(shù)據(jù)庫節(jié)點(diǎn)可以從多個(gè)節(jié)點(diǎn)、節(jié)點(diǎn)的多個(gè)數(shù)據(jù)庫中同步更新數(shù)據(jù)。SlaveKeyId字段記錄同步記錄在從數(shù)據(jù)表中對(duì)應(yīng)記錄的關(guān)鍵字值,如果從數(shù)據(jù)表主關(guān)鍵字是多屬性,處理方式與同步發(fā)送數(shù)據(jù)表相同,只需保證可從SlaveKeyId值還原出原始的多個(gè)關(guān)鍵字值。
3.3數(shù)據(jù)傳輸服務(wù)
數(shù)據(jù)傳輸可以采用不同的實(shí)現(xiàn)技術(shù),如JMS、SOA、web中間件等,本文采用WCF實(shí)現(xiàn)數(shù)據(jù)傳輸服務(wù)。WCF(Windows Communication Foundation)是由微軟開發(fā)的一系列支持?jǐn)?shù)據(jù)通信的應(yīng)用程序框架,WCF以契約(Contraet)定義雙方溝通的協(xié)議。
3.3.1數(shù)據(jù)契約
數(shù)據(jù)契約(Data Contract)定義雙方信息交換的格式和內(nèi)容,數(shù)據(jù)傳輸服務(wù)的數(shù)據(jù)契約包含記錄實(shí)體和同步控制數(shù)據(jù)契約。記錄實(shí)體數(shù)據(jù)契約定義記錄實(shí)體數(shù)據(jù)格式,契約成員變量與實(shí)體標(biāo)準(zhǔn)數(shù)據(jù)格式的成員變量——對(duì)應(yīng),不同實(shí)體數(shù)據(jù)契約的定義和命名不同。同步控制數(shù)據(jù)契約定義同步任務(wù)控制信息,所有同步任務(wù)的同步控制數(shù)據(jù)契約定義與命名相同,同步控制數(shù)據(jù)契約定義如下:
3.3.2服務(wù)契約
服務(wù)契約(Service Contract)定義服務(wù)向外公開的功能,服務(wù)由從節(jié)點(diǎn)實(shí)現(xiàn),主節(jié)點(diǎn)調(diào)用服務(wù)代理(WCF ServiceProxy)執(zhí)行。數(shù)據(jù)傳輸服務(wù)契約功能是將數(shù)據(jù)從主節(jié)點(diǎn)傳輸?shù)綇墓?jié)點(diǎn),主節(jié)點(diǎn)根據(jù)同步節(jié)點(diǎn)IP和同步數(shù)據(jù)庫名構(gòu)造相應(yīng)服務(wù)終結(jié)點(diǎn)數(shù)據(jù)。系統(tǒng)要為每個(gè)從同步數(shù)據(jù)庫節(jié)點(diǎn)定義一個(gè)服務(wù)契約接口,為數(shù)據(jù)庫每個(gè)同步數(shù)據(jù)表定義一個(gè)數(shù)據(jù)傳輸方法。
4結(jié)語
本文提出的異構(gòu)數(shù)據(jù)庫同步更新方案,通過記錄同步發(fā)送和主從記錄映射數(shù)據(jù),解決了現(xiàn)有同步模型中數(shù)據(jù)無法同步更新的問題,并用實(shí)例證明該同步更新方案可行。在數(shù)據(jù)存儲(chǔ)中,一個(gè)實(shí)體數(shù)據(jù)可能分散在不同的數(shù)據(jù)表中,每次單獨(dú)同步一個(gè)數(shù)據(jù)表會(huì)破壞實(shí)體數(shù)據(jù)的一致性,該方案可實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫單表間同步,但還不適用于多表同步。因此下一步研究對(duì)象為多對(duì)多、一對(duì)多、多對(duì)一數(shù)據(jù)表同步。