本篇文章是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实例使用第一个分发服务器。在下一篇我们将使用第二个实例创建我们的发布服务器。
现在分发服务器上看不到很多东西,没有任何正在运行的代理,也没有显示其他活动。现在在服务器上有一个分发数据库,但是它隐藏在系统数据库中。
唯一可见的变化是在复制文件夹上右击,包含一个条目是"发布服务器属性…",而不是之前的"配置发布…"
是不是有点失落——花费那么多努力却没有任何显示。记住分发服务器是事务复制中最重要的部分。没有它任何数据都不能够移动。这部分的工作会在第三篇得到回报。