此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
导出 (0) 打印
全部展开

了解并避免同步循环

更新时间: 2015年5月

 

SQL Azure 数据同步图标

欢迎使用 SQL 数据同步(预览版)。本主题是你在设计和实现同步计划之前应该熟悉的五个主题中的第四个主题。这五个准备性质的主题是:

已停止使用 Microsoft Azure Silverlight 门户上的 Microsoft Azure SQL 数据同步插件。今后请使用 Microsoft Azure 管理门户进行 Azure SQL 数据同步。

你可以通过 Microsoft Azure 管理门户的“SQL Database”下的“同步”选项卡来访问 SQL 数据同步(预览版)。“同步”选项卡仅在具有一个或多个同步组时可用。有关在此门户创建和修改同步组的指南,请参阅主题如何创建同步组 (SDS)

请参阅下面的导航一节,其中链接了开始操作前应阅读的主题以及有关创建和修改同步组的指导。

同步循环由两个或两个以上同步组中的数据库重叠而产生,这样,一个同步组中的数据库中的更改将由另一同步组重写入同一数据库。同步循环是自保持的,并且会导致大量数据反复覆盖两个或两个以上的数据库中的相同数据。

以下任何原因都可能会导致同步循环。

  • 数据库或表中的循环引用。

  • 涉及两个或两个以上同步组的循环引用。

  • 向不同代理注册且添加到两个或两个以上代理之下的同步组的单个数据库。

设计同步拓扑时,最好在多个同步组中包含一个数据库。图 1 便是这样的一个示例。尽管同步组 1 和同步组 2 共享数据库 A,但是不存在反复将相同的数据写入到同一数据库的反馈循环。也有可能在两个同步组之间共享多个数据库而不会产生循环。我们将在本主题后面讨论这些配置。

让我们演练一下对图 1 中的任意数据库进行更改时事件发生的顺序。我们将假定对数据库 C 进行更改。

  1. 更改数据库 C 中的第 1 行。

  2. 在数据库 C 的元数据中创建一条指示已更改第 1 行以及更改产生的位置的记录。

  3. 同步组 1 进行同步。

    1. 它指出,SG1 之外的某个其他数据库更改了数据库 C 中的第 1 行。

    2. 将数据库 C 中的第 1 行写入到 SG1 中心数据库。

    3. 在 SG1 的元数据中创建一条指示 SG1 已对第 1 行进行了更改的记录。

    4. 将 SG1 中的第 1 行写入到数据库 A。

    5. 在数据库 A 的元数据库中创建一条指示 SG1 已对第 1 行进行了更改的记录。同步组 1 完成同步。

如果未对任何数据库进行任何新的更改,则在这些数据库下次同步时,将不会有任何数据写入任何数据库。

不带同步循环的两个同步组

图 1:两个同步组共享一个数据库。无同步循环

如果更改产生于数据库 D 中,将会按相反方向(相对于图 1)发生同一顺序。

让我们演练一下对图 2 中的任意数据库进行更改时事件发生的顺序。同样,我们将假定对数据库 C 进行更改。

  1. 更改数据库 C 中的第 1 行。

  2. 在数据库 C 的元数据中创建一条指示已更改第 1 行以及更改产生的位置的记录。

  3. 同步组 1 进行同步。

    1. 它指出,SG1 之外的某个其他数据库更改了数据库 C 中的第 1 行。

    2. 将数据库 C 中的第 1 行写入到 SG1 中心数据库。

    3. 在 SG1 的元数据中创建一条指示 SG1 已对第 1 行进行了更改的记录。

    4. 将 SG1 中的第 1 行写入到数据库 A 和 B。

    5. 在数据库 A 和 B 的元数据中创建一条指示 SG1 已对第 1 行进行了更改的记录。

    同步组 1 完成同步。

  4. 同步组 2 进行同步。

    1. 它指出,SG2 之外的某个其他数据库更改了数据库 A(或 B)中的第 1 行。

    2. 将数据库 A 中的第 1 行写入到 SG2 中心数据库。

    3. 在 SG2 的元数据中创建一条指示 SG2 已对第 1 行进行了更改的记录。

    4. 将 SG2 中的第 1 行将写入到数据库 B(或 A)和 D。

    5. 在数据库 B(或 A)和 D 的元数据中创建一条指示 SG2 已对第 1 行进行了更改的记录。

    同步组 2 完成同步。

如果未对任何数据库进行任何新的更改,则 SG1 在下次同步时,将指出它在数据库 A(或 B)中未进行的更改(在最后一次循环中由 SG2 进行)。尽管该数据与这两个同步组中所有数据库中的数据没有区别,但系统仍会将其视为已更改的数据,并会无休止地重复运行上述同步循环。

值得指出的是,尽管我们的同步循环示例仅涉及一行,但对一行适用的情况同样适用于任意数量的行。假如一个数据库中有一百万个行,其中每次同步循环更改 1% 的未更改行。在一次循环之后,将无限循环 10,000 行。在两次循环后,将循环该 10,000 行外加其他 9,900 行,总计 19,900 行。并且,循环中的行数将持续增加,永远不会减少。

带同步循环的两个同步组

图 2:两个同步组具有一个同步循环

图 3 演示了更复杂的情况,其中的循环可能不如图 2 中那么容易识别。

图 3 中存在三个同步组。每个同步组包含一个中心数据库和两个其他的数据库。每个数据库由两个同步组共享,但没有一对同步组共享相同的两个数据库。

  • SG1:A 和 B

  • SG2:B 和 C

  • SG3:C 和 A

让我们演练一下对图 3 中的任意数据库进行更改时事件发生的顺序。我们将假定对数据库 A 进行更改。

  1. 更改数据库 A 中的第 1 行。

  2. 在数据库 A 的元数据中创建一条指示已更改第 1 行以及更改产生的位置的记录。

  3. 同步组 1 进行同步。

    1. 它指出,SG1 之外的某个其他数据库更改了数据库 A 中的第一行。

    2. 将数据库 A 中的第 1 行写入到 SG1 中心数据库。

    3. 在 SG1 的元数据中创建一条指示 SG1 已对第 1 行进行了更改的记录。

    4. 将 SG1 中的第 1 行写入到数据库 B。

    5. 在数据库 B 的元数据库中创建一条指示 SG1 已对第 1 行进行了更改的记录。

    同步组 1 完成同步。

  4. 同步组 2 进行同步。

    1. 它指出,SG2 之外的某个其他数据库更改了数据库 B 中的第一行。

    2. 将数据库 B 中的第 1 行写入到 SG2 中心数据库。

    3. 在 SG2 的元数据中创建一条指示 SG2 已对第 1 行进行了更改的记录。

    4. 将 SG2 中的第 1 行写入到数据库 C。

    5. 在数据库 C 的元数据库中创建一条指示 SG2 已对第 1 行进行了更改的记录。

    同步组 2 完成同步。

  5. 同步组 3 进行同步。

    1. 它指出,SG3 之外的某个其他数据库更改了数据库 C 中的第 1 行。

    2. 将数据库 C 中的第 1 行写入到 SG3 中心数据库。

    3. 在 SG3 的元数据中创建一条指示 SG3 已对第 1 行进行了更改的记录。

    4. 将 SG3 中的第 1 行写入到数据库 A。

    5. 在数据库 A 的元数据库中创建一条指示 SG3 已对第 1 行进行了更改的记录。

    同步组 3 完成同步。

如果未对任何数据库进行任何新的更改,则 SG1 在下次同步时,将指出 SG1 之外的某个其他数据库对数据库 A 中的第 1 行进行了更改。即使该数据与所有数据库和中心数据库中的数据完全相同,SG1 仍会将其视为完全不同的更改。因此,整个同步循环是无限重复的。

带同步循环的三个同步组


图 3:三个同步组具有一个同步循环

避免同步循环的关键是避免包含某一同步组将另一个同步组中的数据更改最终写回源数据库所使用的任何路径。有三种方法可以实现此目的。

  • 设计你的同步系统,以便循环无法存在。

    例如:

    在图 2 中,你可从共享区域中删除数据库 A 或 B。

    在图 3 中,你可从任意同步组删除任意数据库并中断循环。

  • 使用行筛选。

    如果在配置每个同步组时创建互斥筛选器,则不会有将要同步相同数据的两个同步组。

    例如:

    在图 2 中,你可将行筛选器 Area = "NA" 添加到一个同步组,并将 Area = "EU" 添加到另一同步组。

  • 使用同步方向。

    例如:

    如果你按图 4 所示的那样设置同步方向,则不会再产生循环。

用于中断同步循环的同步方向

图 4:使用同步方向阻止循环

SQL 数据同步(预览版) 是 SQL Database 的一项功能。从 Azure 管理门户中可执行创建、部署和修改同步组所需的所有任务。

 

如何创建同步组

从 Azure 管理门户创建同步组需执行六个步骤。访问以下链接可以找到有关每个步骤的详细信息。

  1. 登录到 Azure SQL Database 管理门户
    SQL 数据同步(预览版)仅在你创建了同步组后才以选项卡的形式出现在 SQL Database 下。

  2. 安装 SQL 数据同步客户端代理

  3. 向客户端代理注册 SQL Server 数据库

  4. 创建同步组

  5. 定义数据同步

  6. 配置同步组 (SDS)

如何修改同步组

你可以通过添加/删除某一同步组中的表或列,或者通过更改某个列的宽度或数据类型,对该同步组的架构进行修改。访问以下链接可以找到有关的详细信息。

另请参阅

显示:
© 2015 Microsoft