侯超平
(桂林電子科技大學(xué), 廣西 桂林 541004)
Web環(huán)境下的分布式自治站點(diǎn)數(shù)據(jù)同步技術(shù)研究
侯超平
(桂林電子科技大學(xué), 廣西 桂林 541004)
本文對Web環(huán)境下典型的分布式自治站點(diǎn)系統(tǒng)拓?fù)浣Y(jié)構(gòu)及工作方式進(jìn)行研究。重點(diǎn)研究了同步周期、關(guān)鍵字同步?jīng)_突處理、更新數(shù)據(jù)捕獲、更新數(shù)據(jù)源識別等分布式自治站點(diǎn)數(shù)據(jù)同步過程中的關(guān)鍵問題,并設(shè)計(jì)了一個(gè)適用于分布式系統(tǒng)自治站點(diǎn)數(shù)據(jù)同步的技術(shù)方案。
分布式系統(tǒng);自治站點(diǎn);數(shù)據(jù)同步
1.1 分布式自治站點(diǎn)應(yīng)用場景
隨著企業(yè)信息化水平的提高及基于Web環(huán)境下的業(yè)務(wù)系統(tǒng)的發(fā)展,以往單一站點(diǎn)業(yè)務(wù)系統(tǒng)的服務(wù)模式已很難滿足業(yè)務(wù)系統(tǒng)的需要,具體表現(xiàn)為如下幾個(gè)方面:
(1)單一站點(diǎn)負(fù)載能力有限,無法滿足高并發(fā)的業(yè)務(wù)訪問需求。
(2)可靠性及可用性差,如果站點(diǎn)的軟、硬件出現(xiàn)故障,則整個(gè)業(yè)務(wù)系統(tǒng)癱瘓。
(3)位于不同網(wǎng)絡(luò)運(yùn)營商的用戶訪問業(yè)務(wù)站點(diǎn),可能會存在響應(yīng)時(shí)間長、互連互通等問題,用戶體驗(yàn)差。
考慮到以上問題,為了保障業(yè)務(wù)系統(tǒng)的快速響應(yīng)及高可用性,在進(jìn)行業(yè)務(wù)系統(tǒng)整體規(guī)劃時(shí)一般會采用分布式結(jié)構(gòu)進(jìn)行解決。分布式系統(tǒng)(distributed system)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng),其對于用戶而言具有較高的透明性和內(nèi)聚性[1]。比較常見的是分布式自治站點(diǎn)結(jié)構(gòu),一種典型的拓?fù)浣Y(jié)構(gòu)如圖1所示。
圖1中的分布式系統(tǒng)由一個(gè)超級站點(diǎn)及若干個(gè)普通站點(diǎn)所組成,每個(gè)站點(diǎn)均為一個(gè)獨(dú)立自治站點(diǎn),可以獨(dú)立為系統(tǒng)用戶提供業(yè)務(wù)服務(wù)。超級站點(diǎn)除了具有普通站點(diǎn)服務(wù)功能外,還擔(dān)負(fù)著整個(gè)業(yè)務(wù)系統(tǒng)入口及用戶首次業(yè)務(wù)請求至各站點(diǎn)負(fù)載均衡調(diào)度功能。
1.2 分布式自治站點(diǎn)系統(tǒng)工作原理及方式
以業(yè)務(wù)系統(tǒng)為用戶1進(jìn)行業(yè)務(wù)服務(wù)為例,其系統(tǒng)工作原理如圖2所示:
(1)用戶1向系統(tǒng)入口服務(wù)站點(diǎn)A(超級站點(diǎn))發(fā)出服務(wù)請求。
(2)服務(wù)站點(diǎn)A收到用戶1的服務(wù)請求后,根據(jù)當(dāng)前各站點(diǎn)的可用性狀況,將用戶1的服務(wù)請求重定向至可用性最優(yōu)的站點(diǎn)上(圖2中服務(wù)站點(diǎn)A向用戶1返回訪問請求重定向至服務(wù)站點(diǎn)B上的指令)。
(3)用戶1的web瀏覽器收到重定向至服務(wù)站點(diǎn)B的指令后,自動重新訪問服務(wù)站點(diǎn)B以取得業(yè)務(wù)服務(wù)。此后,用戶1將通過持續(xù)訪問服務(wù)站點(diǎn)B獲得系統(tǒng)服務(wù)。
(4)用戶1在服務(wù)站點(diǎn)B進(jìn)行業(yè)務(wù)操作期間,所產(chǎn)生的業(yè)務(wù)數(shù)據(jù)更新,將通過數(shù)據(jù)同步的方式同步至其它的服務(wù)站點(diǎn),以使用戶1下次業(yè)務(wù)請求被重定向至其它站點(diǎn)時(shí)可以繼續(xù)業(yè)務(wù)操作。
1.3 分布式自治站點(diǎn)系統(tǒng)特點(diǎn)
相對于傳統(tǒng)的單一業(yè)務(wù)站點(diǎn)的服務(wù)方案,分布式自治站點(diǎn)的方案具有以下特點(diǎn):
(1)高吞吐及高并發(fā)。用戶的業(yè)務(wù)請求被分散到各自治站點(diǎn)中,由各站點(diǎn)共同為業(yè)務(wù)用戶提供服務(wù),業(yè)務(wù)系統(tǒng)的負(fù)載能力可以得到大幅提升。
(2)負(fù)載均衡。負(fù)載均衡功能可以通過監(jiān)控各自治站點(diǎn)的性能情況,并將用戶訪問請求調(diào)度到綜合性能值最好的站點(diǎn)上,提高訪問響應(yīng)效能。
(3)高可用。某部分站點(diǎn)出現(xiàn)故障時(shí),可以離線處理故障,其它站點(diǎn)可以繼續(xù)承擔(dān)用戶業(yè)務(wù)訪問請求,避免單一站點(diǎn)模式中出現(xiàn)軟、硬件故障時(shí)造成業(yè)務(wù)系統(tǒng)癱瘓的問題。
(4)容災(zāi)性。由于各自治站點(diǎn)的業(yè)務(wù)數(shù)據(jù)進(jìn)行相互同步,所以理論上由n站點(diǎn)構(gòu)成的分布式自治系統(tǒng)中,將會有n-1個(gè)數(shù)據(jù)副本,具有很強(qiáng)的容災(zāi)性。
2.1 同步周期
由于分布式系統(tǒng)在數(shù)據(jù)同步時(shí)存在網(wǎng)絡(luò)延遲、I/O耗時(shí)等因素,無法保證副本數(shù)據(jù)和主節(jié)點(diǎn)時(shí)刻保持一致[2]。在自治站點(diǎn)之間一般采用弱一致性的辦法來進(jìn)行處理,最終保持各站點(diǎn)數(shù)據(jù)的一致性。在同步的時(shí)候,需要考慮在同步周期與系統(tǒng)開銷之間取得平衡,既能保證各自治站點(diǎn)數(shù)據(jù)及時(shí)相互同步,又能最大程度避免同步事務(wù)對系統(tǒng)資源消耗而造成服務(wù)響應(yīng)速度下降的問題。
2.2 關(guān)鍵字同步?jīng)_突處理
在分布式系統(tǒng)中,位于不同自治站點(diǎn)上的同一數(shù)據(jù)表新插入的記錄字段值可能會相同,如果字段為數(shù)據(jù)表的關(guān)鍵字,在各站點(diǎn)數(shù)據(jù)相互同步時(shí)就會產(chǎn)生關(guān)鍵字沖突,為了避免關(guān)鍵字沖突就必須要求數(shù)據(jù)表關(guān)鍵字段值全局唯一。從傳統(tǒng)單一服務(wù)站點(diǎn)結(jié)構(gòu)向分布式系統(tǒng)結(jié)構(gòu)改造,或全新設(shè)計(jì)分布式系統(tǒng)時(shí),要充分考慮該問題。為確保各站點(diǎn)同一數(shù)據(jù)表關(guān)鍵字段值全局唯一,通常進(jìn)行以下處理:為各業(yè)務(wù)數(shù)據(jù)表添加站點(diǎn)標(biāo)識字段(字段值為站點(diǎn)在分布式系統(tǒng)中的唯一編號),并將站點(diǎn)標(biāo)識字段與業(yè)務(wù)數(shù)據(jù)表原關(guān)鍵字一起構(gòu)成組合關(guān)鍵字,從而實(shí)現(xiàn)數(shù)據(jù)表記錄關(guān)鍵字段值全局唯一。
2.3 更新數(shù)據(jù)捕獲
用戶在站點(diǎn)上進(jìn)行業(yè)務(wù)操作時(shí)將會產(chǎn)生數(shù)據(jù)更新(新增、刪除、修改),這些數(shù)據(jù)更新操作需要被記錄下來形成更新日志,并將業(yè)務(wù)數(shù)據(jù)更新操作信息同步到其它各站點(diǎn)上,由運(yùn)行于其它站點(diǎn)上的程序執(zhí)行同樣的數(shù)據(jù)更新操作序列來實(shí)現(xiàn)數(shù)據(jù)同步,使各站點(diǎn)上的業(yè)務(wù)數(shù)據(jù)保持一致。常用的更新數(shù)據(jù)捕獲分為觸發(fā)器捕獲和DBMS的CDC功能兩類。
(1)觸發(fā)器捕獲。在業(yè)務(wù)數(shù)據(jù)表上部署insert、delete操作觸發(fā)器,當(dāng)產(chǎn)生事件觸發(fā)時(shí),通過觸發(fā)器記錄數(shù)據(jù)更新操作信息到更新日志中。
(2)CDC功能。較新版本的SQL Server或Oracle提供了一種叫做變更數(shù)據(jù)捕獲 CDC(Change Data Capture) 的功能,可以通過在數(shù)據(jù)庫中顯示開啟CDC 跟蹤功能及DBMS中的代理服務(wù)器功能,實(shí)現(xiàn)捕獲數(shù)據(jù)庫中表對象數(shù)據(jù)的變化情況。
2.4 更新數(shù)據(jù)源識別
在分布式系統(tǒng)中自治站點(diǎn)上的數(shù)據(jù)更新從數(shù)據(jù)源的角度可以分為兩種類型:
(1)站點(diǎn)上業(yè)務(wù)系統(tǒng)為用戶提供服務(wù)產(chǎn)生的數(shù)據(jù)更新,比如用戶增加或刪除業(yè)務(wù)數(shù)據(jù)等。
(2)其它站點(diǎn)向本站點(diǎn)傳送過來數(shù)據(jù)更新操作記錄日志,并根據(jù)日志記錄順序在本站點(diǎn)上執(zhí)行操作序列,實(shí)現(xiàn)數(shù)據(jù)同步而產(chǎn)生的數(shù)據(jù)更新。
對于由本站點(diǎn)產(chǎn)生的業(yè)務(wù)數(shù)據(jù)更新,需要將其記錄到數(shù)據(jù)更新日志表中,日志信息待傳送至其它站點(diǎn)上執(zhí)行,以保持各站點(diǎn)數(shù)據(jù)一致;而由其它站點(diǎn)同步到本站點(diǎn)的數(shù)據(jù)更新操作日志信息,僅需要根據(jù)更新操作日志信息執(zhí)行寫庫操作完成數(shù)據(jù)同步即可,無須再次將這部分?jǐn)?shù)據(jù)更新再次同步至其它站點(diǎn)上。那么各站點(diǎn)需要對這兩類數(shù)據(jù)更新的寫表操作進(jìn)行區(qū)別處理。
例如本站點(diǎn)業(yè)務(wù)系統(tǒng)執(zhí)行的新增插入記錄操作,需要通過觸發(fā)器記錄到數(shù)據(jù)更新日志表中(日志信息待同步至其它站點(diǎn)上);而由其它站點(diǎn)新增記錄數(shù)據(jù)同步到本站點(diǎn)上,在本站點(diǎn)執(zhí)行插入記錄操作實(shí)現(xiàn)數(shù)據(jù)同步時(shí),無須通過觸發(fā)器將這些操作記錄在數(shù)據(jù)更新日志表中(即不需要再次同步至其它站點(diǎn)),否則各站點(diǎn)上的同步更新數(shù)據(jù)會出現(xiàn)無限次相互循環(huán)同步的問題。
由于觸發(fā)器是由特定的數(shù)據(jù)操作事件來觸發(fā)的,事件本身并不能區(qū)別這兩類數(shù)據(jù)更新,所以必須在觸發(fā)器執(zhí)行的過程中進(jìn)行更新數(shù)據(jù)源識別,并進(jìn)行相應(yīng)處理。比較常用的識別更新數(shù)據(jù)源的辦法是,在數(shù)據(jù)庫管理系統(tǒng)中為不同類型的數(shù)據(jù)源分配不同的用戶賬號,比如站點(diǎn)上的業(yè)務(wù)系統(tǒng)連接數(shù)據(jù)庫時(shí)使用A賬號,數(shù)據(jù)同步程序連接數(shù)據(jù)庫時(shí)使用B賬號,通過識別數(shù)據(jù)庫連接賬號的方法來區(qū)別不同的數(shù)據(jù)更新類型,并在觸發(fā)器中進(jìn)行相應(yīng)處理。
3.1 站點(diǎn)同步流程
為了使設(shè)計(jì)方案適用于不同的數(shù)據(jù)庫管理系統(tǒng),具有通用性,方案使用Oracle、SQL Server、MySQL等多種數(shù)據(jù)庫均可支持的觸發(fā)器作為更新數(shù)據(jù)捕獲手段。各站點(diǎn)間的數(shù)據(jù)更新同步流程如圖3所示。
同步流程:
(1)業(yè)務(wù)系統(tǒng)對業(yè)務(wù)數(shù)據(jù)表進(jìn)行數(shù)據(jù)更新操作觸發(fā)數(shù)據(jù)表上的觸發(fā)器。
(2)觸發(fā)器通過數(shù)據(jù)庫連接用戶名識別出產(chǎn)生更新操作的數(shù)據(jù)源為業(yè)務(wù)系統(tǒng),則將數(shù)據(jù)更新操作寫入“數(shù)據(jù)更新日志表”。如果識別出的更新數(shù)據(jù)源為同步程序(其它站點(diǎn)向本站點(diǎn)同步數(shù)據(jù)),則觸發(fā)器不執(zhí)行任何操作。
(3)站點(diǎn)同步程序通過“數(shù)據(jù)更新日志表”及“業(yè)務(wù)數(shù)據(jù)表”將發(fā)生數(shù)據(jù)更新的記錄操作還原成等價(jià)的SQL語句。插入記錄操作還原成insert語句,刪除記錄操作還原成delete語句,更新記錄操作等價(jià)還原成delete或insert兩個(gè)語句。
(4)站點(diǎn)同步程序獲取“各站點(diǎn)信息表”中的各站點(diǎn)信息,通過Socket把業(yè)務(wù)系統(tǒng)數(shù)據(jù)更新操作等價(jià)SQL語句傳送到其它站點(diǎn)中,并由其它站點(diǎn)上的同步程序處理。
(5)當(dāng)本站點(diǎn)上的同步程序接收到從其它站點(diǎn)發(fā)送過來的數(shù)據(jù)更新等價(jià)SQL語句后,執(zhí)行這些SQL語句序列,實(shí)現(xiàn)其它站點(diǎn)發(fā)生的數(shù)據(jù)更新同步至本站點(diǎn)中。
3.2 核心工作表設(shè)計(jì)
系統(tǒng)工作表為同步操作提供必要的數(shù)據(jù)信息,最核心的兩個(gè)工作表為“各站點(diǎn)信息表”和“數(shù)據(jù)更新日志表”。
(1)“各站點(diǎn)信息表”為分布式系統(tǒng)中各個(gè)站點(diǎn)提供統(tǒng)一的全局站點(diǎn)信息視圖,該表在超級站點(diǎn)上維護(hù),站點(diǎn)的信息更新將同步至各站點(diǎn)中,數(shù)據(jù)同步程序?qū)⒏鶕?jù)該表中記錄的各站點(diǎn)信息把本站點(diǎn)產(chǎn)生的數(shù)據(jù)更新同步至其它站點(diǎn)上。各站點(diǎn)信息表結(jié)構(gòu)如表1所示。
表1 各站點(diǎn)信息表
(2)“數(shù)據(jù)更新日志表”用于記錄各業(yè)務(wù)數(shù)據(jù)表的數(shù)據(jù)更新操作情況,為同步程序定位發(fā)生數(shù)據(jù)更新的記錄提供關(guān)鍵字段值等信息,也為構(gòu)造出等價(jià)SQL語句過程提供基本信息。數(shù)據(jù)更新日志表結(jié)構(gòu)如表2所示。
表2 數(shù)據(jù)更新日志表
Web環(huán)境下的分布式自治站點(diǎn)業(yè)務(wù)系統(tǒng)相對于傳統(tǒng)的單一站點(diǎn)業(yè)務(wù)系統(tǒng)具有更強(qiáng)的負(fù)載能力、高可用及強(qiáng)容災(zāi)性等優(yōu)點(diǎn)。由于各站點(diǎn)均可獨(dú)立向業(yè)務(wù)用戶提供服務(wù),所以保持各站點(diǎn)的數(shù)據(jù)一致性是分布式自治站點(diǎn)業(yè)務(wù)系統(tǒng)的關(guān)鍵。本文研究了分布式自治站點(diǎn)的數(shù)據(jù)同步問題,重點(diǎn)研究了同步周期、關(guān)鍵字同步?jīng)_突處理、更新數(shù)據(jù)捕獲、更新數(shù)據(jù)源識別等關(guān)鍵問題,并設(shè)計(jì)了一個(gè)適用于分布式系統(tǒng)自治站點(diǎn)數(shù)據(jù)同步的技術(shù)方案。該方案給出了站點(diǎn)同步流程和核心工作表的設(shè)計(jì),在實(shí)現(xiàn)分布式系統(tǒng)承受更多業(yè)務(wù)負(fù)載的同時(shí),使各自治站點(diǎn)的數(shù)據(jù)同步過程能更有序、高效地執(zhí)行。
[1]劉塵塵.基于Android平臺的分布式文件系統(tǒng)協(xié)議研究[J].西昌學(xué)院學(xué)報(bào)(自然科學(xué)版),2012,26(02):82-84
[2]楊步濤.分布式數(shù)據(jù)庫的一致性探討(網(wǎng)絡(luò))[J].http://blog. csdn.net/yangbutao/article/details/8365695.
10.16640/j.cnki.37-1222/t.2016.22.115
侯超平(1981-),男,研究生,工程師,研究方向:分布式系統(tǒng)、云計(jì)算及虛擬化。