本篇文章是SQL Server Replication系列的第二篇,詳細內容請參考原文。
分發服務器是SQL Server復制的核心組件。分發服務器控制並執行數據從一個服務器移動到另一個服務器的進程。它將發布和訂閱的信息存儲在分發數據庫。幾個代理促進真實數據的移動。
術語
在這一系列你會看到"分發服務器","發布服務器","訂閱服務器"。They always refer to a SQL Server instance together with the machine it is on.因此如果你看到術語"database on the subscriber",它指的就是扮演訂閱角色的數據庫實例上的一個數據庫。如果你看到術語"file on the distributor",它描述的是用於分發的數據庫實例所在機器上的一個文件。
復制設置所涉及的數據庫被稱為"發布數據庫","分發數據庫","訂閱數據庫"——根據數據庫所在實例扮演的角色。
復制代理或SQL代理作業一直被稱為代理或作業,所以distributor不是指分發代理或用於執行分發代理的SQL代理作業。相反,distributor通常是指SQL Server實例或實例所運行的機器。
分發數據庫
當分發配置,SQL Server創建一個分發數據庫。分發數據庫會分類到系統數據庫下,因此要在對象資源管理器找到它,你得進入到系統數據庫。
一個分發服務器(distributor)是一個數據庫實例,並且實例上可以有多個分發數據庫。每一個發布服務器(publisher)只與單一的分發數據庫關聯。
The distribution database contains metadata about all publications and articles of the publishers that are associated with the particular distribution database.分發數據庫還包含復制進程的進度與狀態的元數據。在事務復制中它還額外包含所有需要發布的命令,包括所有必要重新執行命令的數據。
因為這些原因,分發數據庫可能變得非常大,因此確保你的磁盤上有足夠的空間。
快照文件夾
在快照復制,不是這一系列的,但為了了解快照文件夾的作用我們需要稍微學習下這部分知識。
快照復制用快照文件夾保存復制的表的快照。每一次快照復制運行,所有復制的表的快照保存到快照文件夾。這是使用SQL Server BCP完成的。
快照文件夾可以是分發服務器上的一個本地文件夾或者網絡上一個網絡共享。用於執行快照代理的Windows帳戶需要有對這個文件夾/共享的寫入權限。大部分其他代理需要對共享有讀的權限。
快照主要用於快照復制,但是其他復制同樣使用快照初始化同步相關表。如果復制中的數據庫不同步了,可以在任何時間觸發重新同步(詳細參考第九篇)。
代理
所有的復制進程並不是由SQL Server自己執行的。Replication instead consists of several independent processes that are called replication agents. 如果你遵循這系列的步驟配置復制,那些進程都是由SQL Server代理作業控制和執行的。當然,你也可以不遵循這種模式,代理是獨立的,因此你可以從命令行執行它們。
除了請求訂閱(pull),所有的代理都運行在分發服務器上。每一個請求訂閱服務器自己執行分發代理,從分發服務器請求數據。"請求訂閱"在第一篇簡單的介紹了,在第四篇將詳細闡述。
最佳實踐
通常,復制是配置成"本地分發"模式。在本地分發模式中,所有分發部分都是在發布服務器上存在和執行的。It is easier to start out using this model so you often find it in use.但是需要關注發布服務器的性能。如果這種性能的影響變得太大以致難以忍受,那就有必要把分發移到它自己的服務器上。將分發單獨放到另一台機器,對發布服務器影響最小。
如果你有很多發布服務器(publishers)使用同一個分發服務器(distributor),分發數據庫可能成為一個瓶頸。為了避免這個,你應該為每個發布數據庫實例創建一個分發數據庫。
移除復制
為了能夠演示下面的例子,你需要在沒有配置發布的實例開始。如果你的機器配置了舊的復制(可能你參考第一篇創建的),你需要把它們刪除。確保服務器上所配置的復制是你不再需要的。重新創建一個被誤刪的復制是非常耗時的。
移除復制的最簡單的方法是,連接到對應實例,在對象資源管理器下右擊復制文件夾。在彈出的菜單選擇"生成腳本",如圖2.1所示
圖2.1 生成腳本
你會看到圖2.2所示的畫面,你可以選擇生成創建或刪除復制組件的腳本。選擇"用於刪除或禁用組件",然后選擇列表中所有的組件,點擊生成腳本->在"新建查詢"窗口中打開。這將生成刪除所選復制組件的腳本。
圖2.2 刪除所有組件的腳本
如果你打算移除的復制涉及多個數據庫實例,你應該在所有實例上執行這個步驟。按照訂閱服務器->發布服務器->分發服務器的順序。如果任何步驟出現錯誤,確保你按照正確的順序操作實例。在你再次執行前重新生成腳本。這樣就能完全移除復制。
配置分發
說在前面,譯文的第二~第五篇的截圖是在同一台機器,兩個實例得到的。WORK\SQL12(分發服務器)、WORK\SQL08R2(發布服務器+訂閱服務器),不影響文章的閱讀。
為了能夠展現和介紹安全最佳實踐並指出安裝復制的需求,從現在開始所有的例子,假設發布服務器、分發服務器和訂閱服務器是三個不同的機器。如果你想遵循這些例子,我建議你也這樣設置。你現在需要識別這三台服務器,在這一篇配置分發需要在其他機器上執行步驟。
如果你有閱讀這一系列的第一篇,你會注意到很多頁面在這里會重現。然而,盡管我們操作相同的對話框,但還是有部分改變(我們在三個分開的機器上處理)。
SSMS連接到分發的數據庫實例,右擊復制並選擇"配置分發…",如圖2.3所示
圖2.3 分發服務器上配置分發
下一步你會看到配置分發向導,第一個需要做選擇的是分發頁面(圖2.4)。我們打算把它充當自己的分發服務器,因此選擇第一個選項
圖2.4 選擇分發服務器
下一個頁面(圖2.5),詢問快照文件夾存儲位置。
快照文件夾可以是分發服務器上的一個本地文件夾或者網絡上一個網絡共享。如果你計划使用請求訂閱,這個文件夾必須是一個網絡共享。
這里最佳的實踐是在分發服務器上創建一個網絡共享。That gives direct and therefore fast access to most of the processes involved in replication but also allows for scenarios like pull subscriptions that require remote access.
確保共享有足夠的空間保存復制表的BCP副本。詳細關於誰需要對這個文件夾/共享有訪問權限會在后面合適的時間講解。
圖2.5 快照文件夾
下一個頁面是關於分發數據庫的詳細信息。你可以提供一個名稱,以及分發數據文件和日志文件的存儲位置。
依據使用這個分發數據庫的發布服務器數量,發布項目的數量,更重要的是這些項目的變更頻率,這個數據庫可能會變得非常大和繁忙。Follow the standard best practices for placing and sizing of busy databases when picking a location for the distribution database files.
這個向導不允許創建多個分發數據庫。詳細介紹創建多個分發數據庫和它的好處將在下面的"多分發數據庫"章節找到
圖2.6 分發數據庫
下一步,如圖2.7所示,配置發布服務器。每一個發布服務器需要與分發服務器注冊。這個頁面顯示所有已經與分發服務器注冊過的發布服務器列表。因為我們剛創建分發服務器,這個列表只有分發它自己。點擊添加按鈕,選擇添加SQL Server發布服務器。一個連接對話框讓你連接你的發布數據庫實例。你也可以去掉分發自己前面的勾選,這樣就會把這個實例配置成分發,但是沒有任何發布。
如果你添加的實例和分發不是同一個,下一個頁面(圖2.8)會要求你輸入一個分發服務器密碼。這個密碼用於發布服務器與分發服務器之間通信安全。每一次你創建一個發布服務器並連接到這個分發服務器,你需要輸入這個密碼。因此確保你把它保存在安全的地方。
圖2.7 注冊發布服務器
圖2.8 分發服務器密碼
發布服務器上配置分發
為了連接發布服務器到分發服務器,發布服務器需要在分發服務器上注冊。如何配置在前面的章節已經提到過。但是單獨這樣還不夠,分發服務器同樣需要在發布服務器上注冊。建立這個鏈接的步驟是本節的主題。
SSMS連接到發布數據庫實例,右擊復制並選擇"配置分發…"打開配置分發向導。這次在分發頁面不要選擇第一項,相反選擇"使用以下服務器"然后點擊添加按鈕,如圖2.9所示
圖2.9 使用遠程分發服務器
在連接對話框中連接到分發服務器(實例)。下一個頁面,如圖2.10所示,詢問管理密碼。這里輸入我們在之前配置分發時的密碼
圖2.10 管理密碼
這個步驟之后分發就配置完成。
多分發數據庫
如果你想使用一個分發服務器來對應多個發布服務器,最好是為每一個發布服務器使用單獨的分發數據庫。這不僅減少分發數據庫上的連接,還能提高解決可能出現的某些問題並從災難中恢復的能力。
為了創建一個額外的分發數據庫,對象資源管理器下連接到分發服務器,右擊復制,選擇分發服務器屬性,打開屬性對話框。這里你可以看到已經安裝的分發數據庫。列表下方的新建按鈕,可以打開新建分發數據庫頁面,如圖2.11所示
圖2.11 創建分發數據庫
這里你可以設置分發數據庫的名稱以及文件位置。你還可以設置保持期的值。這些會在第四篇解釋。目前你可以保留默認設置。
在你創建一個新的分發數據庫后,在"分發服務器屬性"點擊"發布服務器"頁簽。點擊添加->添加SQL Server發布服務器,你就可以在這個分發服務器上注冊其他發布服務器,如圖2.12所示
圖2.12 注冊發布服務器
在你連接到新發布服務器后,它就會添加到已注冊發布服務器列表並且顯示在分發服務器屬性頁面。現在你可以為新發布服務器選擇分發數據庫(圖2.13所示)。確保你選擇了正確的數據庫,因為一旦你點擊了"確定",這個選項就不能更改。為一個已存在的發布服務器更改分發數據庫的唯一方法是,完整的刪除發布服務器上所有發布設置,然后從分發服務器的已注冊發布服務器列表刪除發布服務器。在刪除之后你就可以重新開始並選擇一個不同的分發數據庫。
圖2.13 選擇分發數據庫
測試變更分發數據庫,Step1:發布服務器->復制(右擊)->禁用發布和分發;Step2:分發服務器exec sp_dropdistpublisher @publisher = N'WORK\SQL08R2'。這樣之后就可以在分發服務器屬性重新添加發布數據庫。
更多關於如何處理多分發數據庫的內容請參考"Scaling out the distribution database"
總結
在這一篇中我們准備了一個SQL Server實例作為復制的分發服務器。我們同樣准備了另一個SQL Server實例使用第一個分發服務器。在下一篇我們將使用第二個實例創建我們的發布服務器。
現在分發服務器上看不到很多東西,沒有任何正在運行的代理,也沒有顯示其他活動。現在在服務器上有一個分發數據庫,但是它隱藏在系統數據庫中。
唯一可見的變化是在復制文件夾上右擊,包含一個條目是"發布服務器屬性…",而不是之前的"配置發布…"
是不是有點失落——花費那么多努力卻沒有任何顯示。記住分發服務器是事務復制中最重要的部分。沒有它任何數據都不能夠移動。這部分的工作會在第三篇得到回報。