Azure弹性比例:拆分合并教程 - 无法拆分碎片

时间:2015-07-07 20:35:59

标签: c# azure azure-sql-database azure-elastic-scale

我按照教程here创建了所有提到的内容并部署了服务。我也可以正常运行它。

我的弹性数据库目前包含一个范围分片,其中MinValue设置为0MaxValue设置为Infinity (NULL)

然后将此碎片实际拆分为两个。我做了以下事情:

  1. 创建了一个与shard 1
  2. 具有相同模式的新数据库
  3. 运行服务,它说目标数据库必须是分片映射的一部分。失败!!!
  4. 现在要在Shard Map Manager Database中添加新数据库作为分片,我在Nuget package下载了.Net API,修改了设置等,但它不会添加新的分片作为第一个分片范围(0 - INFINITY)不允许它。再次失败:(
  5. 现在我弄脏了并修改了实际的[__ShardManagement].[ShardMappingsGlobal]表本身,其中包含Shard Map Manager Database中的这些范围映射。我去了那里,将唯一的碎片的MaxValue列设置为,例如,20。虽然这个碎片包含,例如,分片密钥最多30个。
  6. 现在再次运行下载的.Net API,将新的分片起始值指定为20 - INFINITY。它工作正常,新的碎片已在SMM DB中注册。
  7. (我认为该服务现在会分割分片1,使用分片键21获取所有数据,并在其MinValue为21时插入分片TWO。)

    1. 再次运行服务,它抛出以下错误:

      源映射和目标映射都指向同一个碎片'new_shard'。

    2. 嗯......这可能是因为第一个分片的MaxValue和新分片的MinValue是相同的。

      1. 现在我去更新了我要拆分的第一个碎片的MaxValue = NULL (INFINITY)。再次运行服务,并收到以下错误:

        源映射和目标映射都指向同一个碎片'new_shard'。

      2. 到底是怎么回事?为什么这么难?适当的文件在哪里?

        这对我来说非常重要,我很感激任何分裂该死的碎片的帮助。

        感谢。

1 个答案:

答案 0 :(得分:3)

感谢您关于拆分/合并的问题。让我们看看这是否有帮助:

根据您在上面记录的步骤,您似乎最终在步骤3中做了两件事:

  • 您在分片地图中添加了一个新数据库作为空分片,
  • 您尝试分配指向新添加的分片的映射。

第一部分(添加空分片)应该已经成功,而第二部分(添加映射)会因为现有映射到已覆盖整个域的第一个分片而失败。

如果到目前为止这听起来不错,您可以尝试以下步骤:

  1. 将您的分片地图重置为原始状态,以便(0 - 无穷大) 范围再次指向第一个碎片。最好只从头开始重新创建分片图。
  2. 重新运行上面的步骤1) 使用您的架构拥有一个干净的数据库。
  3. 将上一步中的干净数据库作为分片添加到现有的分片映射中,调用方式如下:shardmap.CreateShard(new ShardLocation(shardServer," your_clean_database"));.确保不要调用shardmap.CreateRangeMapping(。)。它不是必需的,它会再次失败,因为(0 - Infinity)范围被分配给您的第一个碎片。拆分操作将改变映射作为其操作的一部分。
  4. 提交拆分操作。
  5. 在任何情况下,请不要直接修改[__ShardManagement]表。它们通过您从Nuget或Split / Merge工具中提取的库的API进行维护。

    以下是其他文档的几点建议:

    希望这会有所帮助。如果您仍然遇到问题,请通过torsteng(at)microsoft(dot)com离线联系我。

    谢谢, 托