2. 复制拓扑与发布订阅模型

SQL Server 复制在物理上由三类服务器角色协作完成:发布服务器(Publisher)、分发服务器(Distributor)和订阅服务器(Subscriber)。理解这三者的职责边界,以及订阅采用推送还是请求、分发采用集中还是远程,是设计复制拓扑的第一步。拓扑选错,后期往往不是改几个参数能补救的,而需要重建发布与订阅。

三类角色的职责划分

发布服务器是数据的源头。它维护被复制的对象(表、视图、存储过程等),把哪些对象、哪些列、哪些行纳入复制范围定义为“项目(Article)”,再把一组项目组织成“发布(Publication)”。发布服务器还负责记录事务日志中需要传播的变更,供日志读取代理或快照代理采集。

分发服务器是复制的中转与调度中心。它持有分发数据库(默认为 distribution),用于暂存待传播的事务命令或快照数据,并运行分发代理把数据投递到订阅端。分发服务器同时承担元数据管理、代理作业调度和冲突/延迟监控的职责。可以说,分发数据库是复制的“缓冲区”和“账本”。

订阅服务器是数据的接收方。它保存订阅数据库,通过订阅(Subscription)与某个发布建立对应关系。订阅服务器不参与变更的产生,只负责接收并应用变更(事务复制)或接收整份数据(快照复制)。

三者的关系可以概括为:发布服务器产生变更,分发服务器缓存并转发变更,订阅服务器应用变更。下面这张图展示了集中分发拓扑下三者的连接关系与数据流向。

发布服务器 Publisher 发布 Publication 项目 Article 事务日志读取 分发服务器 Distributor 分发数据库 distribution 分发代理作业 调度与监控 订阅服务器 Subscriber 订阅 Subscription 订阅数据库 应用变更 变更/快照 分发投递 推送订阅 Push • 分发服务器主动向订阅端投递 • 分发代理在分发服务器运行 • 适合订阅端多、集中管控场景 • 订阅端无需常驻代理作业 • 分发端负载较高 请求订阅 Pull • 订阅服务器主动拉取变更 • 分发代理在订阅服务器运行 • 适合订阅端分散、自治场景 • 订阅端需可访问分发数据库 • 分发端负载较低

推送订阅与请求订阅的差异

订阅的“推”与“拉”,本质区别在于分发代理运行在哪里,以及谁发起同步动作。

推送订阅(Push Subscription)由分发服务器主动发起。分发代理作业运行在分发服务器上,按调度周期把变更推送到订阅端。它的优点是集中管理:管理员在分发端就能看到所有订阅的同步状态,新增订阅端时无需在订阅端部署代理作业。代价是分发服务器的 CPU、内存和网络出口压力随订阅数量线性增长。推送订阅适合订阅端数量较多、由同一团队统一运维的场景,例如总部向多个门店分发商品主数据。

请求订阅(Pull Subscription)由订阅服务器主动发起。分发代理作业运行在订阅服务器上,订阅端按自己的调度去分发数据库拉取变更。它的优点是分散负载:每个订阅端自行承担同步开销,分发端只负责写入分发数据库。代价是订阅端必须能访问分发服务器,且每个订阅端都要单独配置和维护代理作业。请求订阅适合订阅端数量少、地理位置分散、网络条件各异或需要订阅端自主控制同步时机的场景,例如多个分支机构各自按本地业务窗口拉取数据。

选择时可以用一个简单判断:如果订阅端多且集中管控,选推送;如果订阅端少且分散自治,选请求。两者并非互斥,同一个发布下可以混合使用。

集中分发与远程分发的选型

分发服务器的部署位置决定了拓扑形态。

集中分发(Central Distributor)指发布服务器与分发服务器位于同一台 SQL Server 实例。这是默认且最常见的部署方式。它的优点是配置简单、发布到分发的本地事务开销小、故障排查路径短。缺点是发布服务器的负载会叠加分发压力,当发布数量多、订阅端多时,单实例容易成为瓶颈。

远程分发(Remote Distributor)指分发服务器独立于发布服务器,部署在另一台实例上。它的优点是负载分离:发布服务器专注事务处理,分发服务器专注缓存与投递,二者可分别扩容。缺点是跨实例通信增加网络开销,且分发服务器一旦故障会影响所有发布。远程分发适合发布服务器本身负载已较高、或需要为多个发布服务器统一提供分发服务的场景。

选型时可参考以下判断依据:

判断维度集中分发远程分发
发布服务器负载较低时适用较高时适用
发布数量少量多个发布服务器共享
网络条件本地,延迟低需评估跨机延迟
运维复杂度低较高
故障影响面单发布所有关联发布
在实际工程中,一个常见组合是:远程分发 + 推送订阅,用于总部集中向多个区域分发数据;另一个常见组合是集中分发 + 请求订阅,用于发布端压力可控、订阅端需要自主拉取的场景。拓扑没有绝对优劣,关键是让分发代理的运行位置与运维边界、网络边界一致。

一个可参考的拓扑配置示例

假设某企业有 1 台总部数据库服务器 SRV-PUB、1 台独立分发服务器 SRV-DIST、3 台门店订阅服务器 SRV-SUB01~03。总部希望统一管控同步,门店不承担代理运维。可设计为:

发布服务器:SRV-PUB
分发服务器:SRV-DIST(远程分发)
分发数据库:distribution
发布:Pub_Product(事务复制)
订阅:Push_Sub_01 / Push_Sub_02 / Push_Sub_03(推送订阅)
分发代理运行位置:SRV-DIST
同步周期:每 30 秒

配置完成后,可在分发服务器上通过 sp_replmonitorhelpsubscription 查看各订阅的同步状态与延迟。若某门店订阅长期处于“正在同步”或延迟持续增大,应优先检查该门店到分发服务器的网络质量,而不是直接调整发布端参数。判断拓扑是否合理的核心指标是:分发数据库的待分发命令数是否稳定、各订阅端延迟是否在业务可接受范围内、分发服务器资源是否留有冗余。