复制(6)——分发者(Distributor)

时间:2023-03-09 06:40:02
复制(6)——分发者(Distributor)

如简介中提到,分发者(Distributor)是SQLServer 复制过程的核心组件。因为它是控制和执行实际的数据移动的过程,并且存放了发布(Publications)和订阅(Subscriptions)信息的地方(实际上就是系统库的Distribution数据库中)。

术语

发布(Publication)、分发(Distribution)、订阅(Subscription)是复制(replication)的专用术语,并不用于数据库对象或者数据库。你可能会看到“一个表是发布中的一部分”,但是表完全可以独立于复制。另外,复制也有专用的引擎(agent)和作业(jobs)。

分发数据库(Distribution)

  当分发配置成功后,在当前实例的【系统数据库】文件夹下就会出现一个新的数据库,叫Distribution,如图1:

复制(6)——分发者(Distributor)

图1

  如果分发是配置在一个单独的实例上,可以有多个分发数据库,每个发布者对应一个分发库。这个库包含了所有发布和项目(articles)的元数据,如果复制类型为事务复制,也会把所有需要被复制的命令存放在里面,包含所有需要重新执行的命令。这个数据库可能会变得很大,所以要监控磁盘空间。

快照文件夹(Snapshot Folder):

  快照文件夹用于在快照复制中,保持被复制表的快照,每次快照复制运行时,一个被复制的表(或者其他对象)的快照就会被保存在快照文件夹中。这个过程是使用SQLServer的BCP工具实现的。快照文件夹可以是分发者的本地文件夹或者网络中的共享文件夹。用于执行快照引擎(snapshot agent)的windows 帐号必须对这个文件夹具有写权限。其他引擎的帐号必须对快照文件夹最少有读的权限。快照文件夹主要用于快照复制。但是其他类型的复制同样会使用快照来初始化同步过程。

引擎(Agents):

  整个复制过程并不是由SQLServer自己执行的,而是包含一系列的复制引擎。标准配置中,这些过程是有SQLServer agent的jobs来实现。但是并不是必须的,因为这些引擎是独立的,可以使用命令行来执行。如果是pull订阅,所有引擎都在分发服务器。每个的pull订阅会单独执行自己的分发引擎。用于从分发者中提取数据。

最佳实践:

  通常情况下,复制运行在本地分发模式下,所有的分发都活动在发布者上,并且容易使用,但是会对发布服务器产生影响,如果分发压力已经影响了性能,最好可以考虑分到独立的服务器。使其对发布者最小化影响。

移除复制:

步骤1:拆分分发者到独立的服务器:

使用复制(2)——事务复制实操中的环境,我们现在来移除已有的复制,最简单的移除是连到SSMS,然后右键【复制】文件夹,选择生成脚本,如图2:

复制(6)——分发者(Distributor)图2

步骤2:点开之后,可以看到有一个发布源【AdventureWorks2008R2】,现在我们选择删除这个组件并把脚本存到一个新页面,如图3:

复制(6)——分发者(Distributor)

图3

  如果你的环境有多个SQLServer实例,需要重复这一步直到全部发布卸载为止。然后执行脚本,让SQLServer自己卸载复制功能。

配置分发:

  我们创建一个新的虚拟机来做独立的分发服务器,简单配置一下即可。这里服务器叫做Demo。在TestServer2中连到Demo服务器,然后右键【复制】文件夹,选择【配置分发】:

复制(6)——分发者(Distributor)

  和前面配置事务复制的步骤类似,只是这里使用独立的服务器,所以配置分发的时候要看清楚,我们使用Demo作为分发服务器:

复制(6)——分发者(Distributor)

创建快照文件夹:

  我们在F盘F:\SnapShots创建一个快照文件夹,配置参考事务复制的配置,这里使用Distribution1作为新数据库名:

复制(6)——分发者(Distributor)

复制(6)——分发者(Distributor)

复制(6)——分发者(Distributor)

复制(6)——分发者(Distributor)

配置发布:

  现在返回发布数据库,也就是TestServer2,选择配置分发,这里选择Demo服务器作为分发服务器:

复制(6)——分发者(Distributor)

复制(6)——分发者(Distributor)

复制(6)——分发者(Distributor)

复制(6)——分发者(Distributor)

复制(6)——分发者(Distributor)至此,对分发者的配置完成。但是对分发的讨论还会继续,具体在后续的篇章中会提及。