Azure弹性规模:分割合并教程-不能分割碎片

本文关键字:分割 教程 不能 不能分 碎片 合并 Azure | 更新日期: 2023-09-27 18:01:41

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

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

然后将这个shard实际分割为TWO。我做了如下操作:

  1. 创建一个与shard 1模式相同的新DB
  2. 运行服务,它说目标数据库必须是碎片映射的一部分。失败! !
  3. 现在在Shard Map Manager Database中添加新的DB作为分片,我下载了Nuget包中可用的。net API,修改了设置等,但它不会添加一个新的分片,因为第一个分片范围(0 - INFINITY)不允许它。再次失败:(
  4. 现在我弄脏了我的手,修改了实际的[__ShardManagement].[ShardMappingsGlobal]表本身,其中包含Shard Map Manager Database中的这些范围映射。我将唯一的分片的MaxValue列设置为20。而这个分片包含,比如说,分片键为30。
  5. 现在再次运行下载的。net API,指定新的分片起始值为20 - INFINITY。

(我认为服务现在将分割分片1,获取分片键为21的所有数据,并将插入分片2,因为它的MinValue为21。)

  • 再次运行服务,并抛出以下错误:

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

  • 嗯…这可能是因为第一个shard的MaxValue和新shard的MinValue是相同的。

  • 现在我去更新MaxValue = NULL (INFINITY)的第一个碎片,我想分裂。再次运行服务,收到以下错误:

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

  • 这到底是怎么回事?为什么这么难?这方面的适当文档在哪里?

    这对我来说非常重要,如果能帮助我分割这个该死的碎片,我将非常感激。

    谢谢。

    Azure弹性规模:分割合并教程-不能分割碎片

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

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

    • 你添加了一个新的数据库作为一个空的碎片到你的碎片映射,和
    • 你试图分配一个映射指向新添加的分片。

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

    如果到目前为止听起来是正确的,您可以尝试以下步骤:

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

    无论如何,请不要直接修改[__ShardManagement]表。它们是通过从Nuget或Split/Merge工具中提取的库的api来维护的。

    这里有一些指向其他文档的指针:

    • 拆分/合并概述:https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-overview-split-and-merge/
    • 碎片地图管理api: https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-scale-add-a-shard/

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

    谢谢,Torsten