2

我按照这里的教程创建了所有提到的东西并部署了服务。我也可以正常运行。

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

然后将这个分片实际分成两个。我做了以下工作:

  1. 创建了一个与分片 1 具有相同架构的新数据库
  2. 运行服务,它说目标数据库必须是分片映射的一部分。失败的 !!!
  3. 现在要将新数据库添加为分Shard Map Manager Database片,我下载了 Nuget中可用的 .Net API ,修改了设置等,但它不会添加新分片,因为第一个分片范围(0 - INFINITY)不允许它。再次失败:(
  4. 现在我动手修改了[__ShardManagement].[ShardMappingsGlobal]包含这些范围映射的实际表本身Shard Map Manager Database。我去那里并将唯一分片的 MaxValue 列设置为,比如说,20。虽然这个分片包含,比如说,最多 30 个分片键。
  5. 现在再次运行下载的 .Net API,将新的分片起始值指定为 20 - INFINITY。它起作用了,新的分片已在 SMM DB 中注册。

(我认为该服务现在将拆分 shard 1,获取所有具有 sharding key 21 的数据,并将插入到 shard TWO 中,因为它的 MinValue 为 21。)

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

    源和目标映射都指向同一个分片“new_shard”。

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

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

    源和目标映射都指向同一个分片“new_shard”。

这到底是怎么回事?为什么这么难?合适的文档在哪里?

这对我来说非常重要,如果能在拆分该死的碎片方面提供任何帮助,我将不胜感激。

谢谢。

4

1 回答 1

3

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

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

  • 您将一个新数据库作为空分片添加到您的分片映射中,并且
  • 您尝试分配指向新添加的分片的映射。

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

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

  1. 将您的分片映射重置为原始状态,以便 (0 - Infinity) 范围再次指向第一个分片。最好从头开始重新创建分片映射。
  2. 重新运行上面的步骤 1) 以使用您的架构创建一个干净的数据库。
  3. 使用如下调用将上一步中的干净数据库作为分片添加到现有分片映射:shardmap.CreateShard(new ShardLocation(shardServer, "your_clean_database"));。确保不要调用 shardmap.CreateRangeMapping(.)。它不是必需的,它会再次失败,因为 (0 - Infinity) 范围已分配给您的第一个分片。拆分操作将更改您的映射作为其操作的一部分。
  4. 提交拆分操作。

在任何情况下,请不要直接修改 [__ShardManagement] 表。它们通过您从 Nuget 或拆分/合并工具中提取的库的 API 进行维护。

以下是一些指向其他文档的提示:

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

谢谢,托斯滕

于 2015-07-07T23:40:25.820 回答