SQL 2008R2 中跨服务器的数据库同步

SQL 2008R2 中跨服务器的数据库同步

由于我们正在扩大业务,现在我们正着手添加更多数据中心,现在我们有一个需求,需要将生产数据库与其他数据中心服务器同步,但要求很少。以下是当前的服务器设置配置(2 台服务器)

  • 服务器:Microsoft Windows Server 2008 R2。
  • .net框架:Microsoft .net框架3.5
  • IIS 7.5

场景

  • 我们如何将生产数据库同步到其他服务器。是否有任何自动化、复制方法来执行操作,即每当发生一条记录或某些交易时,它都应该同步到其他服务器。我想知道人们如何高效地实现这一点。

  • 我们是否可以仅复制或同步我们提到的表,即在我们的数据库模式中,有一些表,我们可以忽略同步操作。

  • 是否有任何建议可以改进同步操作或其他人如何处理这种情况?有什么解决方法吗?我听说过镜像,但我不知道如何在这种情况下实现。

    我感谢任何人指导我们创造一个成功的故事。

答案1

您可以通过订阅、镜像或日志传送进行复制(或者在许多情况下使用多种类型的复制 - 例如镜像和可用性和分区订阅)。问题是复制背后的目的是什么。此外,为什么不将这类内容迁移到亚马逊、Azure 或任何数量的基于云的解决方案中,这些解决方案可以解决所有这些类型的问题,以及您可能没有想到的问题(备份、地理负载平衡 - 只是我脑海中想到的)

在我看来,云就是你开始寻找地理分布解决方案答案的地方。

答案2

我们处理这种情况的方法是使用点对点 (PTP) 复制。这不仅让我们能够跨两个独立的数据中心同步数据库,而且我们还可以灵活地仅同步我们关心的表(即用户数据而不是日志数据)。

性能方面,PTP 同步对我们来说相对即时,这显然取决于数据中心之间的链接以及站点之间的流量。如果需要,PTP 还使我们能够让服务器彼此独立运行。

然而,从经验来看,最大的问题之一是正确设置主键。如果您使用 guid 作为主键,则不会出现问题,但增加标识列会变得棘手,因为每个数据库彼此独立。因此,您需要确保服务器 1 上标识列生成的键不会在服务器 2 上生成,否则复制将遇到错误,因为您无法插入该新记录,这是由于主键冲突造成的。

可以通过将每个表的身份种子设置为不同的值来解决此问题。例如,服务器 1 的身份种子将从 1 开始,服务器 2 的身份种子将从 1,000,000 开始。另一种选择是稍微错开身份种子,并按 PTP 复制方案中的服务器数量递增。因此,在 2 个服务器的示例中,服务器 1 将从种子 1 开始,服务器 2 将从种子 2 开始,两者的值都递增 2。

答案3

有关背景信息,请在 Google 上搜索“Brewer 的 CAP 定理” - 它基本上是说你不能同时拥有复制的高可用性事务一致性蛋糕和它。

有很多方法可以做到这一点,我认为您没有告诉我们足够的指导性建议,但基本上您可以在应用程序、数据库或 VM 级别执行此操作。

向应用程序添加复制通常很困难,因此如果可能的话我会避免这种情况。

如果您选择在数据库中执行此操作:

事务复制非常适合提供实时数据库的近乎实时的只读副本。它允许您选择发布中的单个表、所有列的子集甚至行筛选、连接问题恢复能力、多个订阅者和一个不错的管理界面。您可以使用一些技巧在订阅者处启用有限的写入能力,但它们很复杂。

合并复制提供了多主副本,但其架构要求繁重,设计时存在冲突,并且根据我的经验,存在可扩展性和可靠性问题。应避免使用。

对等复制。我从未使用过,但它建立在事务复制的基础上,所以应该没问题,但强烈建议只允许在单个节点上进行更新,以防止

数据库镜像仅适用于连接良好的情况 - 即同一数据中心。在标准实施中,如果镜像的一个成员发生故障,则两个成员的事务都会停止。同步事务镜像也会减慢生产服务器的速度。应避免。

您的问题并没有说明为什么需要复制 - 是为了性能还是容错或者其他什么,但我建议您考虑一下例如 SQL Azure 实例是否能满足您的需求。

祝你好运。

答案4

您可能需要了解 Red Gate Software 的SQL数据比较- 这将允许您在数据库之间同步数据。

他们也有一个SQL 比较仅同步架构更改的产品。

相关内容