陳瀟
摘? 要:隨著企業(yè)對信息系統(tǒng)的依賴性日益增加,數(shù)據(jù)庫作為信息系統(tǒng)的核心承擔著重要作用。為了緩解服務器訪問壓力,提升讀寫效率,很多數(shù)據(jù)庫管理員選擇搭建服務器集群。通過數(shù)據(jù)主從復制技術可以實現(xiàn)集群內(nèi)部服務器之間數(shù)據(jù)的同步,實現(xiàn)負載均衡。本文對SQL Server數(shù)據(jù)庫發(fā)布/訂閱模式下的三種同步方案進行研究,并通過事務發(fā)布方式實現(xiàn)數(shù)據(jù)的同步。
關鍵詞:SQL Server;數(shù)據(jù)同步;主從復制
中圖分類號:TP392? ? ?文獻標識碼:A
Research and Application of Data Synchronization Scheme Based on SQL Server
CHEN Xiao
(Xuzhou Finance and Economics Branch,Jiangsu Union Technical Institute,Xuzhou 221008,China)
Abstract:With the increasing reliance on information systems in the enterprises,database,as the core of information systems,is undertaking the extremely vital role.To alleviate the pressure of read and write access and enhance the effect of application responses,many database administrators tend to build server clusters to accomplish data synchronization between the servers and load balancing by using the technology of data master-slave replication.This paper studies three replication schemes of SQL Server database publish/subscribe model,and accomplishes data synchronization through publish/subscribe model.
Keywords:SQL Server;data synchronization;master-slave replication
1? ?引言(Introduction)
隨著企業(yè)對信息系統(tǒng)的依賴性日益增加,數(shù)據(jù)庫作為信息系統(tǒng)的核心承擔著重要作用。為了保證系統(tǒng)的高可用性和穩(wěn)定性,很多企業(yè)擴展單臺SQL Server服務器,構建服務器集群。服務器之間數(shù)據(jù)同步是保證集群數(shù)據(jù)一致性的基礎,各服務器間通過相應的策略同步數(shù)據(jù)[1]。在業(yè)務復雜的系統(tǒng)中,主數(shù)據(jù)庫主要負責寫數(shù)據(jù),從數(shù)據(jù)庫主要負責讀數(shù)據(jù),這樣能有效地減輕單臺服務器讀寫壓力。數(shù)據(jù)同步還應用于以下場合:
(1)數(shù)據(jù)匯總。如某個公司在不同地區(qū)設置銷售分公司,利用數(shù)據(jù)同步可以將各地區(qū)銷售分表進行匯總,形成公司銷售總表。另一種情況是對水平切分(如按順序切分、Hash散列切分)的表進行數(shù)據(jù)統(tǒng)一,切分后可以利用數(shù)據(jù)同步進行匯總。
(2)業(yè)務拆分。根據(jù)不同的業(yè)務進行劃分。如企業(yè)可以劃分為供內(nèi)網(wǎng)辦公用服務器,外網(wǎng)客戶訪問服務器,備份服務器等。利用同步方案可以保證各服務器的數(shù)據(jù)一致性。
(3)故障轉(zhuǎn)移。建立數(shù)據(jù)同步機制后,如果主服務器出現(xiàn)故障則可以隨時切換其他服務器保證業(yè)務正常運行。
2? ?發(fā)布/訂閱模式(Publish/subscribe model)
SQL Server提供的多種數(shù)據(jù)同步的模式包括:鏡像方式、log shipping、發(fā)布/訂閱和故障集群轉(zhuǎn)移等。本文主要介紹通過發(fā)布/訂閱方式實現(xiàn)數(shù)據(jù)庫主從同步。
發(fā)布/訂閱方式是常見的一種主從同步模式,主服務器進行消息發(fā)布,從服務器進行訂閱,當主服務器中數(shù)據(jù)發(fā)生變化時,就將消息發(fā)送至訂閱服務器,訂閱服務器接收消息后就開始從發(fā)布服務器向訂閱服務器進行數(shù)據(jù)傳遞,進而在兩者之間實現(xiàn)數(shù)據(jù)同步。SQL Server中的發(fā)布模式有:快照發(fā)布、事務發(fā)布、合并發(fā)布。
2.1? ?快照發(fā)布
快照發(fā)布是完全按照數(shù)據(jù)和數(shù)據(jù)庫對象出現(xiàn)時的狀態(tài)來復制和分發(fā)它們的過程[2]。首先在某一時刻將發(fā)布數(shù)據(jù)庫進行快照后產(chǎn)生鏡像文件,然后在約定的時刻或時間間隔內(nèi)由分發(fā)代理程序?qū)⑽募椭频接嗛啍?shù)據(jù)庫,如圖1所示。訂閱服務器復制的內(nèi)容是發(fā)布數(shù)據(jù)庫某一時刻的狀態(tài)。
快照方式不實時進行數(shù)據(jù)同步,而是每隔一個時段或在某一個時間點進行數(shù)據(jù)庫復制,同步方式為單向同步。優(yōu)點是數(shù)據(jù)復制方式穩(wěn)定,不必監(jiān)視對數(shù)據(jù)的更新。由于是將數(shù)據(jù)庫復制到訂閱服務器,所以在大數(shù)據(jù)量的同步場景下存在以下缺點:占用網(wǎng)絡帶寬較大、數(shù)據(jù)同步周期較長[3]??煺辗绞竭m用于以下場景:
(1)主庫數(shù)據(jù)量小、更新不頻繁。例如,學生管理系統(tǒng)中的學生表在每學期開學后都要進行一次更新,因為更新周期相對固定,所以可以在主庫學生表更新數(shù)據(jù)后從庫進行快照復制。
(2)主從庫接受同步延遲??煺辗绞接捎趶椭茢?shù)據(jù)量大導致延遲較高,可以利用讀寫較少的時間(如深夜)進行快照復制,將影響范圍縮減至最低。
2.2? ?事務發(fā)布
事務發(fā)布是將發(fā)布服務器的初始快照將復制到訂閱服務器。訂閱服務器接收到初始數(shù)據(jù)后,代理服務會連續(xù)監(jiān)測數(shù)據(jù)變化,當發(fā)布服務器上發(fā)生數(shù)據(jù)修改時,會將這些新增的事務傳遞給日志代理,然后日志代理通知訂閱服務器,訂閱服務器進行新增事務的執(zhí)行,如圖2所示。
主從服務器之間通過新增事務復制的方式進行主從同步,發(fā)布數(shù)據(jù)庫上增刪改等操作的事務日志會在短時間內(nèi)復制到訂閱數(shù)據(jù)庫。相對快照復制,事務復制優(yōu)點是復制內(nèi)容小、數(shù)據(jù)傳遞快,所以從庫更新延遲小,對大數(shù)據(jù)量的同步有可靠保證。缺點是如果主庫進行讀寫操作頻繁,則同步過程中會對服務器性能造成影響。由于發(fā)布和訂閱服務之間是實時進行事務傳遞,所以要保證兩者之間相互連接的網(wǎng)絡穩(wěn)定可靠[4]。這種同步方式適用于以下應用場景:
(1)要求主從庫同步延遲小。因為復制的內(nèi)容是數(shù)據(jù)庫更改的增量,且事務日志內(nèi)容較小,所以可以在較短的時間實現(xiàn)同步。
(2)主庫頻繁進行DML操作(增加、刪除、修改)。如果采用快照方式同步,則同步時延過高,不能做出及時響應。如鐵路票務系統(tǒng)數(shù)據(jù)庫中的訂票信息表頻繁進行訂票和改簽操作(增加、修改),如同步不及時則會造成主從庫查詢余票結果不一致的情況。
(3)數(shù)據(jù)同步方式為單向。同步的方向是由發(fā)布同步至訂閱服務器,訂閱服務器上的數(shù)據(jù)庫為只讀狀態(tài)。但如果訂閱數(shù)據(jù)庫上產(chǎn)生更改,則不會將事務回傳至發(fā)布服務器。
2.3? ?合并發(fā)布
快照發(fā)布和事務發(fā)布數(shù)據(jù)同步的方式都是單向,即從庫復制主庫數(shù)據(jù)。合并發(fā)布數(shù)據(jù)同步是雙向的,訂閱數(shù)據(jù)庫復制到發(fā)布數(shù)據(jù)庫的快照后,可以各自進行讀寫操作[5]。在各服務器上產(chǎn)生的數(shù)據(jù)更改操作會被SQL Server監(jiān)視,訂閱服務器和發(fā)布服務器連接時,交換自上次發(fā)布快照以來各自發(fā)生的更改。這種復制方式的優(yōu)點是允許在主從服務器上分別進行讀寫操作,從庫獨立性較高。缺點是在讀寫量極大的情況下數(shù)據(jù)合并更新可能會產(chǎn)生沖突。合并發(fā)布方式適用于以下場景:
(1)接受一定的同步延遲。集群訂閱服務之間的同步不是實時進行,某個訂閱服務器發(fā)生更改后,會脫機進行數(shù)據(jù)更改,并將更改同步到發(fā)布服務器和其他訂閱服務器,所以會造成一定的時間延遲。
(2)應用程序訪問最終更改結果。例如訂單管理系統(tǒng)數(shù)據(jù)庫,如果同步前訂閱數(shù)據(jù)庫中的訂單表中數(shù)據(jù)進行了多次更改,則與發(fā)布數(shù)據(jù)庫同步時只同步最后一次的更改結果,而不會反映中間的修改過程[6]。
(3)可在主從服務器上分別進行讀寫操作。不同于前兩種同步方式的單向性,合并發(fā)布方式中發(fā)布訂閱數(shù)據(jù)庫都可以進行讀寫操作。例如電子商務系統(tǒng)后臺數(shù)據(jù)庫可以分布在不同服務器上,各服務器都可接受前臺應用程序的I/O操作。
3 使用事務發(fā)布方式實現(xiàn)數(shù)據(jù)同步(Data synchronization through transaction publishing)
SQL Server中要進行數(shù)據(jù)同步需要滿足以下條件:被同步的數(shù)據(jù)表需要有主鍵,如果沒有主鍵則會增加一個int類型的自增列id(增量為1);SQL Server代理服務必須啟動;在進行SQL Server注冊時,發(fā)布服務器和訂閱服務器必須使用計算機名稱,不能使用IP地址或別名注冊。
本文將采用事務發(fā)布模式實現(xiàn)主從服務器上對應的數(shù)據(jù)庫E_business_DB(電子商務數(shù)據(jù)庫)數(shù)據(jù)同步。
3.1? ?主庫建立發(fā)布
(1)E_business_DB是主數(shù)據(jù)庫,E_business_DB_R是被同步的數(shù)據(jù)庫既從庫,初始化狀態(tài)下主庫和從庫中的userInfo表(用戶信息表)數(shù)據(jù)一致。
(2)將主庫E_business_DB進行發(fā)布,并設置發(fā)布數(shù)據(jù)庫并選擇發(fā)布類型為“事務發(fā)布”,這樣發(fā)布服務器將事務流式地傳送到訂閱服務器。
(3)根據(jù)需要選擇要發(fā)布數(shù)據(jù)庫對象,如圖3所示。
(4)在快照代理設置內(nèi)容中選擇“立即創(chuàng)建快照”,也可以在“計劃在下時間運行快照代理”中設置運行時間。
(5)指定運行時的數(shù)據(jù)庫賬戶并進行代理安全性設置后,數(shù)據(jù)庫即可發(fā)布成功。
快照發(fā)布的流程和事務發(fā)布類似,區(qū)別主要在主從數(shù)據(jù)庫同步的及時性,快照發(fā)布在規(guī)定時間或重啟代理服務時會進行數(shù)據(jù)同步[7]。
3.2? ?從庫進行訂閱
(1)在從庫E_business_DB_R上建立訂閱,選擇主數(shù)據(jù)庫創(chuàng)建的發(fā)布,設置在分發(fā)服務器上運行所有代理。
(2)選擇訂閱數(shù)據(jù)庫E_business_DB后,設置運行分發(fā)代理的計算機賬戶和連接的訂閱服務器賬戶,如圖4所示。
(3)同步計劃中選擇代理計劃選項為“連續(xù)運行”;在初始化訂閱頁面中設置初始化時間,確認訂閱信息后即可創(chuàng)建訂閱。訂閱成功后會在主庫中顯示數(shù)據(jù)庫訂閱信息。
3.3? ?主從庫數(shù)據(jù)同步
在主庫的userInfo(用戶信息)表中增加2條記錄,使記錄數(shù)為12,如圖5所示。查詢從庫中的userInfo表,發(fā)現(xiàn)表中數(shù)據(jù)行數(shù)已經(jīng)和主庫表一致,如圖6所示。說明主庫與從庫已經(jīng)完成數(shù)據(jù)同步。
4? ?結論(Conclusion)
通過主從復制技術可以實現(xiàn)集群內(nèi)服務器間的數(shù)據(jù)同步。數(shù)據(jù)庫管理員在選擇同步方案時,需要綜合考慮數(shù)據(jù)量、同步延遲、網(wǎng)絡可靠性等影響因素[8]。結合具體業(yè)務的應用場景選擇合適方案,從而緩解單臺服務器讀寫壓力,實現(xiàn)集群間負載均衡。
參考文獻(References)
[1] 夏明慧.分布式數(shù)據(jù)庫數(shù)據(jù)同步的應用分析[J].智能城市,2016(03):82.
[2] 季剛.基于存儲過程的主從服務器數(shù)據(jù)庫同步的實現(xiàn)[J].計算技術與自動化,2012,31(3):114-116.
[3] 景慎艷.分布式數(shù)據(jù)庫同步技術及其應用[J].計算機與自動化技術,2008,34(12):48-50.
[4] 劉娟娟,劉帥.數(shù)據(jù)庫同步技術的研究與實現(xiàn)[J].軟件工程,2017,20(1):1-4.
[5] 肖剛.異構數(shù)據(jù)庫更新同步研究與實現(xiàn)[J].數(shù)字通信世界,2017(07):47.
[6] 李偉洪.服務器負載均衡的實現(xiàn)與分析[J].網(wǎng)絡安全技術與應用,2019(07):12-14.
[7] 李寧.一種異構關系型數(shù)據(jù)庫間的數(shù)據(jù)同步方案[J].福建電腦,2018(10):114-117.
[8] 劉維志.數(shù)據(jù)庫應用的高可用性及實現(xiàn)技術研究[J].信息系統(tǒng)工程,2013(4):97;119.
作者簡介:
陳? 瀟(1983-),男,碩士,講師.研究領域:數(shù)據(jù)庫管理與應用,管理信息系統(tǒng)開發(fā).