簡介
SQL Server中的復制(Replication)是SQL Server高可用性的核心功能之一,在我看來,復制指的並不僅僅是一項技術,而是一些列技術的集合,包括從存儲轉發數據到同步數據到維護數據一致性。使用復制功能不僅僅需要你對業務的熟悉,還需要對復制功能的整體有一個全面的了解,本系列文章旨在對SQL Server中的復制進行一個簡單全面的探討。(PS:在我的上篇文章中我發現某些文章的圖片使用mspaint手繪更有感覺,但被很多人吐槽,因此在不考慮個人羞恥感的前提下,本系列文章中的一些圖片繼續使用mspaint)。
復制是什么
復制,英文是Replication,這個詞源自於拉丁文replicare,原意是重復。SQL Server中的復制也是這個意思,復制的核心功能是存儲轉發,意味着在一個在一個位置增刪改了數據以后,重復這個動作到其他的數據源,概念如圖1所示。
圖1.復制的基本概念
當然,上面的這個模型是復制最簡單的模型,實際中的模型可能會復雜很多,但是大多數使用復制的原因可以分為如下幾類:
1.負載均衡----通過將數據復制到其它數據庫服務器來減少當前服務器的負載,比如說最典型的應用就是分發數據來分離OLTP和OLAP環境。
2.分區----將經常使用的數據和歷史數據隔離,將歷史數據復制到其它數據庫中
3.授權----將一部分數據提供給需要使用數據的人,以供其使用
4.數據合並-每個區域都有其各自的數據,將其數據進行合並。比如一個大公司,每個地區都有其各自的銷售數據,總部需要匯總這些數據。
5.故障轉移----復制所有數據,以便故障時進行轉移。
雖然需要使用復制的原因多種多樣,但是在使用之前你首先要了解復制技術所需的組成元素。
復制的組成部分
復制的概念很像發行雜志的模型,從發行商那里出版后,需要通過報刊亭等地方分發到訂閱雜志的人手里。對於SQL Server復制來說,這個概念也是如此。對於SQL Server復制來說,發行商,報刊亭,訂閱者分別對應的是發布服務器,分發服務器,訂閱服務器。概念如圖2所示。
圖2.發布分發訂閱的基本概念
發布服務器
圖2中的發布服務器包含了需要被發布的數據庫。也就是需要向其它數據源分發內容的源數據庫。當然,被發布的數據首先需要被允許發布。關於這里的詳細設置會在文章后面提到。
分發服務器
圖2中的分發服務器包含了分發數據庫,分發數據庫的作用是存儲轉發發布服務器發過來的數據。一個分發服務器支持多個發布服務器,就像一個報刊亭可以出售多個出版社所出的雜志一樣。同理,分發服務器也可以和發布服務器是同一個實例,這就像出版商不通過報刊亭,自己直接販賣雜志一樣。
訂閱服務器
圖2中的訂閱服務器包含了發布服務器所發布的數據的副本。這個副本可以是一個數據庫,或者一個表,甚至是一個表的子集。根據不同的設置,有些發布服務器發布的更新到訂閱服務器就是只讀的(比如說用於出報表的OLAP環境),或者是訂閱服務器也可以進行更新來將這些改變提交到發布服務器。
發布和文章
發布指的是可以發布的文章的集合,這些文章包括表,存儲過程,視圖和用戶自定義函數,如圖3所示。
圖3.可以發布的內容
當我們發布表時,還可以根據限定條件只發布表的子集。
訂閱
訂閱是相對發布的一個概念,訂閱定義了訂閱服務器從哪個分發服務器接收發布。有兩類訂閱方式,推送訂閱(Push)和請求訂閱(Pull),根據名字就可以望文生義的知道,在推送訂閱的情況下,當發布服務器產生更新時,分發服務器直接更新訂閱的內容,而請求訂閱需要訂閱服務器定期查看分發服務器是否有可用更新,如果存在可用更新,則訂閱服務器更新數據。
復制類型
SQL Server將復制方式分為三大類,每一個發布只能有一種復制類型,分別為:快照復制,事務復制和合並復制。
快照復制
快照復制將發布的所有表做成一個鏡像,然后一次性復制到訂閱服務器。中間的更新不會像其它復制類型那樣自動傳送到訂閱服務器。由這個概念不難看出,快照復制的特點會是:
1.占用網絡寬帶,因為一次性傳輸整個鏡像,所以快照復制的內容不應該太大。
2.適合那些更新不頻繁,但每次更新都比較大的數據。比如企業員工信息表,每半年更新一次這類的業務場景。
3.適合訂閱服務器是OLAP只讀的環境。
來自MSDN的配圖能很好的闡述快照復制,如圖4所示。
圖4.快照復制
事務復制
事務復制就像其名字一樣,復制事務。在第一次設置好事務復制后,發布的表、存儲過程等將會被鏡像,之后每次對於發布服務器所做的改動都會以日志的方式傳送到訂閱服務器。使得發布服務器和訂閱服務器幾乎可以保持同步。因此,可以看出事務復制的特點是:
1.發布服務器和訂閱服務器內容基本可以同步
2.發布服務器,分發服務器,訂閱服務器之間的網絡連接要保持暢通。
3.訂閱服務器也可以設置成請求訂閱,使得訂閱服務器也可以不用一直和分發服務器保持連接。
4.適用於要求實時性的環境。
來自MSDN的配圖能很好的闡述事務復制,如圖5所示
圖5.事務復制
合並復制
合並復制即允許發布服務器更新數據庫,也允許訂閱服務器更新數據。定期將這些更新進行合並,使得發布的數據在所有的節點上保持一致。因此,有可能發布服務器和訂閱服務器更新了同樣的數據,當沖突產生時,並不是完全按照發布服務器優先來處理沖突,而是根據設置進行處理,這些會在后續文章中講到。
來自MSDN的配圖能很好的闡述合並復制,如圖6所示。
圖6.合並復制
建立一個簡單的事務復制
下面我進行一個簡單的事務復制。首先,在本地安裝兩個SQL Server實例,我本機安裝的兩個實例分別為SQL Server 2008R2和SQL Server 2012,其中,SQL Server 2008R2作為發布和分發服務器,SQL Server 2012作為訂閱服務器,如圖7所示。
圖7.復制的兩個實例
首先在SQL Server 2008R2上配置發布服務器和分發服務器,選擇配置分發,如圖8所示。
圖8.配置分發
將發布服務器和分發服務器選擇為同1台,如圖9所示。
圖9.設置發布服務器和分發服務器為同一台服務器
設置快照文件夾,由上面MSDN的圖可知,快照代理是需要在分發服務器上暫存快照的,設置這個目錄,如圖10所示。
圖10.設置快照文件夾
這里值得注意的是,需要給這個目錄對於Everyone設置讀取權限,如圖11所示。
圖11.設置讀取權限
下一步配置分發向導就按照默認值來,如圖12所示。
圖12.配置分發向導
剩下的步驟都保持默認值,最后成功在SQL Server 2008R2實例上配置發布服務器和分發服務器,如圖13所示。
圖13.成功配置發布和分發服務器
下面就要建立一個發布了,選擇新建發布,如圖14所示。
圖14.新建發布
一路next,在選擇發布類型時選擇事務發布,如圖15所示。
圖15.選擇事務發布
發布用於測試的一個表,只有兩個列,一個為自增的int型主鍵id,另一個為隨便設置的列,如圖16所示。
圖16.設置發布的表(文章)
下一個頁面不過濾文章,直接保持默認值下一步。在下一個窗口中選擇立即創建快照並初始化..如圖17所示。
圖17.立即創造快照並初始化
安全設置保持和SQL Server Agent一樣的賬戶,如圖18所示。
圖18.快照代理和日志讀取代理設置和SQL Server Agent同一個賬戶
剩下的步驟一路下一步,設置好發布名稱后,成功創建發布,如圖19所示。
圖19.成功創建發布
下面我們來在SQL Server 2012的實例上創建訂閱,選擇新建訂閱,如圖20所示。
圖20.新建訂閱
在歡迎界面選擇下一步后,選擇剛剛創建的發布,如圖21所示。
圖21.選擇發布服務器
下一步選擇推送訂閱,以便發布服務器所做的改動能自動更改到訂閱服務器,如圖22所示。
圖23.選擇推送訂閱
選擇保持連接,下一步保持默認值,然后在分發代理安全性下選擇模擬進程賬戶。如圖24所示。
圖24.選擇模擬進程賬戶
保持默認值,一路下一步直到訂閱創建完成,如圖25所示。
圖25.創建訂閱成功
現在我們進行測試,向表中插入100條數據,監視狀態,發現100個事務已經成功傳到了訂閱服務器,如圖26所示。
圖26.插入的100條數據已經成功傳送到訂閱服務器
現在我們再來看訂閱服務器(SQL Server 2012),在發布服務器插入的100條數據已經成功存在於訂閱服務器,如圖27所示。
圖27.100條數據已經成功發布到了訂閱服務器
總結
本文對SQL Server的復制進行了大致的講解,並實現了一個簡單的復制。復制的概念需要對SQL Server的各個方面都要有所涉獵,本系列文章的下一篇將會將復制應用的一些模式。