6

经常需要从一个数据库中的主表同步数据以克隆其他数据库中的表,通常是在其他服务器上。例如,考虑后端系统管理库存数据并且库存数据最终必须被推送到作为网站应用程序一部分的一个或多个数据库的情况。

后端系统中的源数据是高度规范化的,有几十个表和外键约束。它是一个精心设计的OLTP RDBMS 系统。许多有问题的表包含数百万行。需要定期将这些数据推送到其他数据库。尽可能频繁;延迟是可以容忍的。最重要的是,后端和远程数据库的最长正常运行时间是必不可少的。

我正在使用 SQL Server,并且熟悉更改跟踪、行版本、触发器等。我知道微软在这些场景中大力推动复制、SyncFx 和 SSIS。但是,供应商白皮书和概述推荐技术与解决方案的实际实施、部署和维护之间存在很大差异。在 SQL Server 世界中,复制通常被视为交钥匙解决方案,但我正在尝试探索替代解决方案。(有人担心复制难以管理,难以更改模式,并且如果需要重新初始化,关键系统会出现大量停机时间。)

有很多陷阱。由于大量表之间的复杂外键关系,确定执行捕获或应用更新的顺序并非易事。由于唯一索引,两行可能会以这样的方式互锁,以至于一次一行的更新甚至不起作用(需要在最终更新之前对每一行执行中间更新)。这些不一定是显示停止器,因为唯一索引通常可以更改为常规索引并且可以禁用外键(尽管禁用外键是非常不可取的)。通常,您会听到“只”使用 SQL 2008 更改跟踪和 SSIS 或 SyncFx。这类答案确实不公平对待实际困难。(当然,客户真的很难理解复制数据为何如此困难,

这个问题归根结底是非常普遍的:对具有大量行的许多高度相关的数据库表执行单向同步。几乎所有涉及数据库的人都必须处理这类问题。白皮书很常见,实用的专业知识很难找到。我们知道这可能是一个难题,但必须完成这项工作。让我们听听什么对您有用(以及应该避免什么)。讲述您对 Microsoft 产品或其他供应商产品的体验。但是,如果您个人没有使用大量相关的表和行对解决方案进行实战测试,请不要回答。让我们保持实际 - 而不是理论上的。

4

1 回答 1

7

最好在 serverfault.com 上询问(我无法发表评论,脚本在 SO 中被破坏,所以我必须发布完整的答案)

更新:(切换到 Safari,脚本再次工作,我可以正常发布)

没有银弹。为了易于使用和“一键转”部署,没有什么能比复制更好。是唯一涵盖深度冲突检测和解决的解决方案,支持推动架构更改,并附带一套全面的工具来设置和监控它。在这个“议程”被 .Net 人群接管之前,它多年来一直是数据同步的 MS 典型代表。在我看来,复制有两个潜在的问题:

  • 用于推动变革的技术是原始的、缓慢的和不可靠的。它需要文件共享来启动副本,并且它依赖于 T-SQL 来实际复制数据,从而导致各种可伸缩性问题:复制线程使用服务器工作线程,并且它们与任意表和应用程序查询交互的事实导致阻塞和死锁。我听说过的最大部署是大约 400-500 个站点,并且由超人的 MVP 和顶级顾问完成。这停止了​​许多从1500 个站点开始的项目(远远超出了最大的已部署复制项目)。我很想知道我是否错了,您知道部署了 500 多个站点的 SQL Server 复制解决方案。
  • 复制比喻过于以数据为中心。它没有考虑分布式应用程序的要求:需要版本化和形式化的合同、数据“领地”的自主性、可用性和安全性的松散耦合。结果,基于复制的解决方案解决了“使数据在那里可用”的迫切需求,但未能解决“我的应用程序需要与您的应用程序对话”的真正问题。

另一方面,您会找到真正解决应用程序通信问题的解决方案,例如基于队列消息传递的服务。但是要么非常缓慢,而且充满了根源于通信机制(Web 服务和/或 msmq)和数据存储(comm 和 db 之间的 DTC 事务,没有共同的高可用性故事,没有共同的可恢复性故事等)分离的问题。MS 堆栈中存在速度极快且与 DB 完全集成的解决方案,但没有人知道如何使用它们。在这些和复制之间的某个地方,您会发现各种中间解决方案,例如 OCS/Synch 框架和基于 SSIS 的自定义解决方案。没有一个会提供易于设置和监控复制的功能,但它们可能会扩展和执行得更好。

我参与了几个需要大规模“数据同步”的项目(+1200 个站点,+1600 个站点),我的解决方案是将问题转为“应用程序通信”问题。一旦思维方式转变为这一点并且数据流不再被视为“使用表 Y 的键 X 的记录”,而是“传达客户 Y 购买项目 X 的​​消息”,该解决方案将变得更易于理解和应用。您不再考虑“按 XYZ 顺序插入记录,因此 FK 关系不会中断”,而是考虑“消息 XYZ 描述的流程购买”。

在我看来,复制及其衍生产品(即数据跟踪和数据报传送)是基于 80 年代技术和数据/应用程序视图的解决方案。过时的恐龙(绝不会变成鸟类)。

我知道这甚至没有开始解决你所有的(非常合法的)问题,但是写下我在这个话题上要说的/咆哮/咆哮会填满大量的平装书……

于 2009-06-26T15:13:06.000 回答