簡介
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的各個方面都要有所涉獵,本系列文章的下一篇將會將複製應用的一些模式。