SQL Server 的分散式資料複寫技術
作者:楊先民
本頁(yè)內(nèi)容
前言
資料庫(kù)複寫(xiě)(Replication)的介紹與使用時(shí)機(jī)
如何建置資料庫(kù)複寫(xiě)
複寫(xiě)代理程式 (Replication Agent) 的功能
複寫(xiě)的種類(lèi)與使用的時(shí)機(jī)
設(shè)計(jì)一個(gè)安全的複寫(xiě)環(huán)境(Secure Replication)
結(jié)論
前言
經(jīng)常有朋友希望能夠?qū)⒐緝?nèi)部的資料庫(kù)分散到其他臺(tái)的 SQL Server 資料庫(kù)系統(tǒng),原因可能是因?yàn)槠匠](méi)有備份資料庫(kù)的習(xí)慣,希望能夠利用資料庫(kù)分散的方式,把資料「?jìng)浞荨沟搅硗庖慌_(tái)機(jī)器中,以達(dá)到實(shí)質(zhì)備份的目的。
在企業(yè)內(nèi)部有非常多機(jī)會(huì)可能需要將資料分散,本期文章將為您探討 SQL Server 中資料庫(kù)的複寫(xiě) (Replication) 技術(shù)。
本期文章會(huì)討論以下的主題:
-
資料庫(kù)複寫(xiě)(Replication)的介紹與使用時(shí)機(jī)
-
如何建置資料庫(kù)複寫(xiě)
-
介紹複寫(xiě)代理程式(Replication Agent)的功能
-
設(shè)計(jì)一個(gè)安全的複寫(xiě)環(huán)境(Secure Replication)
?
資料庫(kù)複寫(xiě)(Replication)的介紹與使用時(shí)機(jī)
我們?nèi)舨幌忍岬?SQL Server 資料庫(kù)所提供的複寫(xiě)技術(shù),光就名詞上來(lái)定義複寫(xiě)的動(dòng)作,實(shí)際上複寫(xiě)只是很單純的將 A 資料庫(kù)的內(nèi)容複製一份到 B資料庫(kù),換句話說(shuō),無(wú)論是 A 資料庫(kù)或是 B 資料庫(kù),都會(huì)有一模一樣的資料。
得知了這樣的理論之後,我們想看看,其實(shí)在實(shí)務(wù)中,有很多中方式能夠達(dá)到上述的情境,例如:
(a) 定期利用 DTS 將資料複製到第二臺(tái)機(jī)器中。
(b) 定期備份 A 的資料庫(kù)到 B 的資料庫(kù)。
(c) 用 SQL Server 所提供的複寫(xiě)功能。
換句話講,資料庫(kù)複製一份的觀念,並不是只能利用 SQL Server 所提供的複寫(xiě)功能才能達(dá)到,應(yīng)該會(huì)有很多種方法,都能達(dá)到類(lèi)似的相同功能。
但是,為什麼會(huì)需要用到 SQL Server 所提供的複寫(xiě)功能呢?主要的原因是資料的自治 (Autonomy) 與延遲 (Latency) 上的考量。
SQL Server 所提供的複製機(jī)制,主要的考量點(diǎn)在於時(shí)間上的差異,也就是「同一時(shí)間,未必能看到兩臺(tái) SQL Server 有相同的資料」,但是卻能夠確保最後的資料是一致的。
由這樣的理論來(lái)看,複製複寫(xiě)能夠應(yīng)用的商業(yè)環(huán)境就有以下情形:
(a) 有多人需要存取或多臺(tái)資料庫(kù)需要相同資料庫(kù)的環(huán)境:
讓遠(yuǎn)端使用者就地利之便取得資料,避免透過(guò)不穩(wěn)定或慢速的網(wǎng)路存取資料。
行動(dòng)裝置的使用者 (例如 Pocket PC) 在離線狀態(tài)時(shí)也能使用資料庫(kù),並且在重新與網(wǎng)路連接時(shí)再將異動(dòng)的資料同步回主資料庫(kù)中。
(b) 需要提升效能的環(huán)境
將需要大量讀取的資料放在一臺(tái)機(jī)器,而需要大量寫(xiě)入的資料放在另一臺(tái)機(jī)器,讓使用者可以執(zhí)行查詢與分析,不需要中斷原先資料庫(kù)的交易處理。
根據(jù)不同業(yè)務(wù)單位所需要的資料不同,而進(jìn)行資料的散佈,例如會(huì)計(jì)部門(mén)只需要會(huì)計(jì)的相關(guān)資訊,就不需要散佈人事相關(guān)會(huì)用到的資料。
(c) 可以當(dāng)作待命伺服器
一般的小企業(yè)沒(méi)有錢(qián)建立叢集伺服器,但又希望資料庫(kù)能夠有備援的機(jī)制,這時(shí)可以利用複寫(xiě)達(dá)成這樣的功能。
?
如何建置資料庫(kù)複寫(xiě)
在建置 SQL Server 2000 的複寫(xiě)之前,首先必需了解一些複寫(xiě)的基本術(shù)語(yǔ),我們只要將複寫(xiě)當(dāng)成是一般出版業(yè)的相關(guān)名詞即可,請(qǐng)先參照?qǐng)D一的內(nèi)容。
圖一:複寫(xiě)之中三個(gè)關(guān)係的示意圖。
複寫(xiě)在建置之前,必需先確定三種角色,分為是發(fā)行者 (Publisher)、散發(fā)者 (Distributor)、訂閱者 (Subscriber)。
發(fā)行者(Publisher):
-
維護(hù)來(lái)源資料庫(kù)。
-
確保發(fā)行集資料可用於進(jìn)行複寫(xiě)作業(yè)。
-
維護(hù)該站臺(tái)中關(guān)於發(fā)行集的所有資訊。
-
偵測(cè)有異動(dòng)的發(fā)行集資料。
-
將有異動(dòng)的資料傳送給散發(fā)者(可以是位於同一臺(tái)或是不同的伺服器上)。
散發(fā)者(Distributor):
-
包含有散佈系統(tǒng)資料庫(kù)(Distribution System Database)。
-
負(fù)責(zé)儲(chǔ)存歷程記錄資料及/或交易與中繼資料。
-
可支援多個(gè)發(fā)行者。
訂閱者(Subscriber):
-
接收複寫(xiě)資料(也就是發(fā)行集)的伺服器。
-
保存資料副本。
在發(fā)行者-訂閱者(Publisher-Subscriber)的觀念中,資料是組織成為發(fā)行集(Publication)與發(fā)行項(xiàng)(Article)。
如果你以「書(shū)店買(mǎi)書(shū)」的觀念來(lái)看這些專(zhuān)有名詞的話,問(wèn)題就簡(jiǎn)單多了,首先發(fā)行者就是書(shū)店的老闆,他可以決定要賣(mài)什麼書(shū)給你 (發(fā)行項(xiàng)),但書(shū)依規(guī)定是要放在一個(gè)專(zhuān)櫃中出售的 (發(fā)行集),客人可以上門(mén)來(lái)買(mǎi)書(shū),或是老闆定期將新的書(shū)用快遞 (散發(fā)者) 寄送到訂閱者的手中。
在定義完角色之後,接下來(lái)再定義要發(fā)行何種內(nèi)容,就是所謂的發(fā)行項(xiàng)與發(fā)行集:
發(fā)行項(xiàng) (Article):
發(fā)行項(xiàng)可以是整個(gè)資料表、資料表的特定部分資料、預(yù)存程序、檢視表、預(yù)存程序、或是使用者自訂函數(shù)等等。
何謂發(fā)行集 (Publication):
發(fā)行集是一個(gè)或是多個(gè)發(fā)行項(xiàng) (Article) 的集合。也是訂閱資料的基本單位。舉例來(lái)說(shuō):你可以建立一個(gè) Products 發(fā)行集,包含有資料表、預(yù)存程序以及與訂單有相關(guān)的資料。
複寫(xiě)必須要以發(fā)行集為單位,當(dāng)作訂閱的基本單位,不可以單獨(dú)僅訂閱特定的發(fā)行項(xiàng)。若要複寫(xiě)的發(fā)行項(xiàng)有引用其他的資料庫(kù)物件,則也必須發(fā)行該物件所引用的物件。例如,如果發(fā)行特定一個(gè)檢視表(View),則必須將該檢視表所引用資料表,當(dāng)作此發(fā)行集的一部份。
訂閱 (Subscription):
訂閱是向複製資料庫(kù)的一項(xiàng)請(qǐng)求。可由「發(fā)行者」或「訂閱者」來(lái)發(fā)起此一程序。如果是由「發(fā)行者」發(fā)起的程序,稱(chēng)為發(fā)送訂閱 (push),如果是由「訂閱者」發(fā)起的程序,稱(chēng)為提取訂閱 (pull),有關(guān)發(fā)送訂閱與提取訂閱,如圖二:
圖二:發(fā)送訂閱以及提取訂閱。
如果把複寫(xiě)當(dāng)成是購(gòu)買(mǎi)書(shū)籍的話,發(fā)送訂閱就像雜誌社定期送書(shū)到讀者家中,而提取訂閱則是讀者自己走到書(shū)店買(mǎi)書(shū),選用的時(shí)機(jī)如下表一:
| 誰(shuí)發(fā)起訂閱工作 | 發(fā)行者 | 訂閱者 |
| 安全性 | 較高 (必需由發(fā)行者設(shè)定) | 較低 (允許匿名訂閱) |
| 訂閱者機(jī)器需求 | 較低 | 較高 |
| 容納訂閱數(shù)量 | 較低 | 較高 |
表一:發(fā)送訂閱以及提取訂閱的比較。
?
複寫(xiě)代理程式 (Replication Agent) 的功能
SQL Server 的複寫(xiě)機(jī)制,實(shí)際上是透過(guò)代理程式 (Agent) 來(lái)幫忙完成的,換句話說(shuō),在使用複寫(xiě)功能時(shí),必需要將 SQL Server Agent 服務(wù)啟動(dòng),才能順利進(jìn)行複寫(xiě)的工作。
SQL Server 所提供的複寫(xiě)有三種類(lèi)型,底層都有搭配的代理程式,如表二:
| 快照集代理程式 | 快照集代理程式 | 快照集代理程式 |
| 散發(fā)代理程式 | 散發(fā)代理程式 | ? |
| ? | 記錄讀取代理程式 | 合併代理程式 |
| ? | 佇列助讀員代理程式 | ? |
表二:各種複寫(xiě)對(duì)應(yīng)到代理程式。
快照集代理程式:
這個(gè)代理程式主要會(huì)向雙方的機(jī)器確認(rèn)彼此的架構(gòu),並且傳遞發(fā)行者目前資料到訂閱者的機(jī)器中。
散發(fā)代理程式:
發(fā)行者透過(guò)散發(fā)代理程式定期將資料傳送到訂閱者的機(jī)器中。
記錄讀取代理程式:
這個(gè)代理程式守候在交易日誌 (log) 中,查詢是否有新增修改以及刪除的記錄。
佇列助讀員代理程式:
所有交易的動(dòng)作都是循序的,為了確保 SQL Server 不會(huì)漏掉任何一筆交易記錄,得利用佇列助讀員確保最後資料一定會(huì)傳送到訂閱者資料庫(kù)。
合併代理程式:
用來(lái)處理合併式複寫(xiě)的動(dòng)作,以及衝突管理。
?
複寫(xiě)的種類(lèi)與使用的時(shí)機(jī)
由上得知,SQL Server 內(nèi)是利用代理程式定期做資料的複製複寫(xiě)工作,而隨代理程式的不同,而有三種的複寫(xiě)種類(lèi):
快照式 (Snapshot) 複寫(xiě)
Snapshot,翻譯成快照,就好像照相一樣,將目前資料庫(kù)裡面當(dāng)下的所有資料喀嚓照下來(lái),然後原封不動(dòng)的寫(xiě)到另一臺(tái)機(jī)器中。快照式複寫(xiě)的使用時(shí)機(jī)是原本資料庫(kù)的內(nèi)容不常更新時(shí),而因?yàn)橘Y料量的關(guān)係,會(huì)花較長(zhǎng)的時(shí)間將資料傳送到訂閱者機(jī)器,而設(shè)定快照式複寫(xiě)時(shí),資料庫(kù)的欄位不需要設(shè)定主鍵 (Primary Key)。
交易式 (Transactional) 複寫(xiě)
交易式複寫(xiě)顧名思義是當(dāng)發(fā)行者資料庫(kù)有任何交易動(dòng)作 (例如新增、修改、刪除動(dòng)作),都會(huì)被散發(fā)到訂閱者資料庫(kù)中。當(dāng)使用交易式複寫(xiě)時(shí),資料的初始快照集會(huì)先傳送到訂閱者機(jī)器中,之後的交易記錄就會(huì)循序的傳送到訂閱者機(jī)器中。
選用交易式複寫(xiě)的時(shí)機(jī)在於,資料複寫(xiě)的延遲性能壓到最小,兩臺(tái)機(jī)器資料一樣的時(shí)間能夠愈短,愈能做有效的資料處理,但在設(shè)定交易式複寫(xiě)時(shí),要確定資料表上有設(shè)定主鍵。
合併式 (Merge) 複寫(xiě)
合併式複寫(xiě),是能夠讓訂閱者與發(fā)行者,可以互相修改彼此的資料。就好像現(xiàn)在的手機(jī)都有通訊錄,能和桌上型電腦的 Outlook 同步是一樣的道理。當(dāng)你修改手機(jī)上的資料,可以同步到桌上型的 Outlook,而修改桌上型 Outlook 資料,也可以同步到手機(jī)上。
在使用合併式複寫(xiě)的時(shí)機(jī)在於,雙方的資料庫(kù)需要互相異動(dòng),並且訂閱者常會(huì)處?kù)峨x線的網(wǎng)路環(huán)境下,例如業(yè)務(wù)帶著客戶資料外出,可能會(huì)修改一些資料,最後再同步回發(fā)行者資料庫(kù)中。
?
設(shè)計(jì)一個(gè)安全的複寫(xiě)環(huán)境(Secure Replication)
設(shè)計(jì) SQL Server 的複寫(xiě)工作之前,首先請(qǐng)先確認(rèn)環(huán)境的建置,大多數(shù)無(wú)法順利建立複寫(xiě)的原因,是因?yàn)榘踩缘脑O(shè)定不正確,而導(dǎo)致複寫(xiě)無(wú)法順利設(shè)定完成。
在設(shè)定複寫(xiě)環(huán)境之前,我們只要想一下複寫(xiě)的動(dòng)作,自然就會(huì)了解為何安全性是如此的重要。
如果複寫(xiě)的環(huán)境設(shè)定不出來(lái),不妨先簡(jiǎn)化環(huán)境的設(shè)定。舉例來(lái)說(shuō),先把發(fā)行者、散發(fā)者與訂閱者三種角色都由一臺(tái) SQL Server 扮演,這樣就一定能先測(cè)試成功,再來(lái)再慢慢的增加難度,以期能達(dá)到發(fā)行者、散發(fā)者與訂閱者分別用一臺(tái)機(jī)器來(lái)扮演。
你可以用下面的步驟來(lái)檢視一下你的權(quán)限是否有設(shè)定正確:
A 機(jī)器要傳送資料到 B 機(jī)器,尤其是要利用代理程式幫忙傳送,一定得設(shè)定好權(quán)限。所以 SQL Server Agent 的登入帳號(hào)的權(quán)限不能太小,如果 A 機(jī)器與 B 機(jī)器都沒(méi)有加入網(wǎng)域的話,那麼你所設(shè)定的登入帳號(hào)必需要能完全存取 C:\Program Files\Microsoft SQL Server\MSSQL\REPLDATA 目錄的權(quán)限,如圖三與圖四。
圖三:到控制臺(tái)的服務(wù),檢查一下登入帳號(hào)。
圖四:設(shè)定 REPLDATA 的權(quán)限,確定登入帳號(hào)能完全控制。
如果 A 機(jī)器與 B 機(jī)器有加入到網(wǎng)域,則 A 機(jī)器的登入帳號(hào)就用網(wǎng)域帳號(hào)進(jìn)行登入,同樣的也必需要設(shè)定 REPLDATA 目錄的安全性。
將你要設(shè)定的散發(fā)者與訂閱者機(jī)器,利用 Enterprise Manager 註冊(cè)進(jìn)來(lái)。
接下來(lái)就可以利用精靈來(lái)設(shè)定複寫(xiě)了。
複寫(xiě)的設(shè)定的步驟如下:
建立發(fā)行集。
設(shè)定 push 或是 pull 發(fā)行集。
因?yàn)檫@兩個(gè)動(dòng)作所要做的步驟都是用精靈完成,而每個(gè)步驟所要做的事情都蠻重要的,所以就用一個(gè)步驟一個(gè)步驟介紹,分別是圖五到圖二十。
圖五:利用工具 → 複寫(xiě)建立與管理發(fā)行集。
圖六:選擇想要散發(fā)的資料庫(kù),然後按下建立發(fā)行集。
精靈的好處在這裡,如果你並沒(méi)有完成一些工作,某些按鈕就沒(méi)有辦法按下。
圖七:選擇散發(fā)者的機(jī)器,如果你事先已經(jīng)將其他臺(tái)的 SQL Server 先註冊(cè)進(jìn)來(lái)的話,你可以選擇其他臺(tái) SQL Server 當(dāng)作散發(fā)伺服器,如果沒(méi)有的話,你也可以用本機(jī)電腦作為散發(fā)者, SQL Server 會(huì)幫你在該臺(tái)機(jī)器中建立一個(gè) distribution 資料庫(kù)。
圖八:預(yù)設(shè)會(huì)將所有資料庫(kù)的資料,利用快照集資夾進(jìn)行傳送,所以要先確認(rèn)一下這個(gè)資料夾是否 SQL Server Agent 具備有存取的權(quán)限,換句話來(lái)說(shuō),資料之間的搬移複製動(dòng)作,都是透過(guò)這個(gè)資料夾暫存相關(guān)的資訊。
圖九:選擇要散發(fā)的資料庫(kù),這裡是以 Northwind 資料庫(kù)為例。
圖十:你可以選擇 SQL Server 複寫(xiě)的對(duì)象是何種類(lèi)型的資料庫(kù),可以是 SQL Server 2000、SQL Server 7.0 或是非 SQL Server 的關(guān)連式資料庫(kù),例如你可以選擇是 Oracle,或是 Access 資料庫(kù)。(不過(guò)若是選擇異質(zhì)資料庫(kù),則只能用 push 的方式將資料發(fā)送到異質(zhì)資料庫(kù),而不能使用 pull 的方式提取資料庫(kù))。
圖十一:選擇想要散發(fā)的資料表或是檢視表、預(yù)存程序,如果是交易式複寫(xiě),則資料表必需要有主索引鍵。
圖十二:設(shè)定發(fā)行集的名稱(chēng),因?yàn)橐粋€(gè)資料庫(kù)可能會(huì)有數(shù)個(gè)發(fā)行集。
圖十三:精靈正在建立發(fā)行集的設(shè)定。
圖十四:設(shè)定完發(fā)行集後,就可以設(shè)定資料集的訂閱工作,只要選擇發(fā)行集名稱(chēng),再按下「發(fā)送新的訂閱」,就會(huì)出現(xiàn)設(shè)定精靈。
圖十五:從清單選出訂閱者的名稱(chēng),如果訂閱者名稱(chēng)很多,則必需一個(gè)一個(gè)先將這些訂閱者利用 Enterprise Manager 註冊(cè)進(jìn)來(lái)。
圖十六:選擇要複寫(xiě)到訂閱者機(jī)器上的哪一個(gè)資料庫(kù)。
圖十七:選擇更新訂閱的頻率,如果是交易式複寫(xiě)的話,可以選擇「連續(xù)」,不然可以使用排程,使得快照集資料定期傳送到訂閱者端。
圖十八:如果訂閱者端沒(méi)有資料,則要選擇初始化結(jié)構(gòu)描述與資料,以及啟動(dòng)快照集代理程式以立即開(kāi)始初始化處理,這樣訂閱者端資料庫(kù)才會(huì)初始資料。
圖十九:精靈開(kāi)始執(zhí)行,將訂閱者端的資料初始化。
圖二十:可以在複寫(xiě)監(jiān)視器中,查看發(fā)行集是否已經(jīng)產(chǎn)生了快照集,並且將資料傳送到訂閱者的資料庫(kù)端。
這時(shí)後,可以透過(guò)複寫(xiě)監(jiān)視器中,看到 test 資料庫(kù)已經(jīng)將快照集準(zhǔn)備好了,可以切換到 test 資料庫(kù)看一下裡面的內(nèi)容,如圖二十一:
圖二十一:在 test 資料庫(kù)中的 Employees 資料庫(kù),目前已經(jīng)將整個(gè)快照集的資料收集過(guò)來(lái)。
圖二十一的快照集產(chǎn)生出來(lái)的速度,端看你的資料量多寡,以及與訂閱者端網(wǎng)路的頻寬決定,所以快照集代理程式這個(gè)動(dòng)作,在實(shí)務(wù)上是最花費(fèi)時(shí)間的動(dòng)作。
不管你是使用哪一種複寫(xiě)方式,都會(huì)有快照集的產(chǎn)生,之後資料間的異動(dòng),就看複寫(xiě)的特性了。
本例是用交易式的複寫(xiě),所以我在發(fā)行者端 Employees資料庫(kù)做個(gè)異動(dòng)之後,再檢查複寫(xiě)監(jiān)視器,即可看到如圖二十二的內(nèi)容:
圖二十二:交易複寫(xiě)的改變。
由圖二十二可以發(fā)現(xiàn),只要發(fā)行者有任何異動(dòng),都會(huì)被記錄助讀員發(fā)現(xiàn),進(jìn)而將該筆交易資料送到訂閱者資料庫(kù)中,完成資料庫(kù)複寫(xiě)的工作。
?
結(jié)論
資料庫(kù)複寫(xiě)機(jī)制,是一個(gè)相當(dāng)實(shí)用的功能,它的運(yùn)用範(fàn)圍非常的廣泛,也適用在各種不同的環(huán)境之下,如果企業(yè)中的資料,因?yàn)椴煌蚨稚⒊啥鄠€(gè)地方存放,可以考慮使用 SQL Server 2000 所提供的複寫(xiě)機(jī)制完成你的需求。
?
PS【轉(zhuǎn)者加】:以下語(yǔ)句可以查找 Local Publications 和 Local Subscriptions
--發(fā)行集
select publisher_db,publication,description from distribution.dbo.MSpublications
--訂閱集
select name,publication,subscriber_db,creation_date from dbo.MSdistribution_agents
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jxcia_Lai/archive/2011/01/06/1927749.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server 的分散式資料複寫技術的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WebLogic自带的Web Servi
- 下一篇: 电脑设置用u盘启动怎么设置 如何用U盘启