决定 SQL Server 订阅形态的是代理的位置,而不是数据的位置。运行代理的机器负责建立连接、以特定账户运行,并在同步停滞时承担责任。在站点到站点 VPN 上,这一差别就是设计本身,而不是细节。先画代理连接,再画网络。

三个角色,而不是两个

Publisher 拥有文章数据,Distributor 拥有分发数据库,Subscriber 接收更改。Log Reader Agent 在 Distributor 上运行以进行事务复制。Distribution Agent 的位置会随订阅类型改变,因此它决定了网络设计。在讨论 VPN 规则之前,先把这些角色理清。

推送订阅在 Distributor 上运行 Distribution Agent,拉取订阅在 Subscriber 上运行它,正如 Microsoft 的订阅文档所述。网络对话中的一切,都取决于那是哪台机器。为每个订阅记下四项事实:代理的主机、它的进程身份、它使用的数据库登录,以及它必须到达的资源。告诉你要让哪个方向工作的,是这些事实,而不是图上的箭头。

推送意味着代理住在 Distributor 上

在推送订阅中,Distributor 跨越 VPN 打开到 Subscriber 的连接。订阅方一侧的侦听器、防火墙和 SQL 登录必须接受来自远端的连接。Distributor 的服务账户还需要在订阅方数据库上获得权限。在创建订阅之前就规划好这条入站路径,因为事后才发现,通常意味着要重建订阅。

快照交付增加了一条稳态复制从不使用的路径。如果快照放在文件共享上,Distribution Agent 会从该共享读取,而订阅方的账户必须能到达同一个 UNC 路径。持续数周的更改流并不能说明重新初始化是否可行。这就是快照共享必须从一开始就写进计划的原因。

不要把推送理解成单向流量。代理需要回复、确认以及它自己的身份验证交换。即使数据只朝一个方向移动,这条路径在连接层面也必须是双向的。

拉取意味着代理住在 Subscriber 上

拉取订阅把连接反转过来:由 Subscriber 运行 Distribution Agent 并向外连接 Distributor。这种安排适合这样的 VPN 策略:允许分支机构向外发起连接,而阻止入站连接。它还把调度决定交到照看分支机构服务器的人手里。当分支机构团队应当拥有自己的同步、并自己发现故障时,就选它。

订阅方的 SQL Server Agent 服务账户需要对分发数据库和快照共享的读取权限。这个账户就是复制错误里出现的身份;而没有域权限的本地服务账户,会在一个看起来像网络故障、实际却是凭据故障的地方失败。在调试隧道之前先检查账户。修好登录,通常比证明网络无过更快。

归属随代理走。当中央团队应当同时拥有调度和故障时,就选推送。无论选哪种,都要写在订阅旁边,好让下一位工程师知道先看哪里。

重新发布改变的是扇出,不是归属

可以把订阅方配置为再向更多订阅方重新发布,于是一个分支机构数据库就能服务多个本地消费者,而不必每个都跨 WAN 拉取。中间那个数据库现在同时持有一个发布和自己的代理。它还继承了此前没有的权限、监控和恢复计划。这一额外角色,就是消除重复 WAN 交付所付的代价。

文档记录的顺序很重要:先初始化入站订阅,再创建下游发布。要把这一步当作带验证的生命周期环节,而不是可以跳过的纸面工作。把它反过来,就会得到一条看起来配置好了、却什么都不交付的链。

明确说出写入模型。把只读数据集复制到本地消费者,与在多个站点接受写入是两种不同的设计;而一条箭头链并不会产生冲突解决。如果分支机构必须写入,那是一个独立决定,有自己的拓扑。也要让依赖关系可见:重新发布者停摆时,它下面的每个消费者都是过期的。

端到端地证明这个位置

不要凭记忆,而是从分发数据库读出订阅类型,然后确认更改确实到达:

USE distribution;
SELECT publication, subscriber_db, subscription_type
FROM dbo.MSsubscriptions;
EXEC sp_replmonitorsubscriptionpendingcmds
  @publisher = 'PUB1', @publisher_db = 'Sales',
  @publication = 'SalesPub', @subscriber = 'BR1',
  @subscriber_db = 'Sales';

subscription_type 为 0 是推送,1 是拉取,而且它无法就地更改,所以对不上就意味着重建订阅,而不是编辑订阅。等待命令的调用会告诉你,所选代理是在搬运工作,还是仅仅在运行。订阅方表一直为空、而订阅却报告零条待处理命令,这与报告积压不断增长是两种不同的故障,二者指向不同的负责人。

最后用一次真实更改收尾:在 Publisher 上插入或更新一行,等待代理报告,再在 Subscriber 上读取那一行。 在一次短暂的 VPN 中断中再做一遍,看看代理如何恢复。能通过这项测试的订阅,其位置就是你可以记录并为之辩护的。

相关文章