我按照教程创建了上面提到的所有东西并部署了服务。我也可以正常运行它。
我的弹性DB目前包含一个范围分片,MinValue
设置为0
, MaxValue
设置为Infinity (NULL)
。
然后将这个shard实际分割为TWO。我做了如下操作:
- 创建一个与shard 1模式相同的新DB
- 运行服务,它说目标数据库必须是碎片映射的一部分。失败! !
- 现在在
Shard Map Manager Database
中添加新的DB作为分片,我下载了Nuget包中可用的。net API,修改了设置等,但它不会添加一个新的分片,因为第一个分片范围(0 - INFINITY)不允许它。再次失败:( - 现在我弄脏了我的手,修改了实际的
[__ShardManagement].[ShardMappingsGlobal]
表本身,其中包含Shard Map Manager Database
中的这些范围映射。我将唯一的分片的MaxValue列设置为20。而这个分片包含,比如说,分片键为30。 现在再次运行下载的。net API,指定新的分片起始值为20 - INFINITY。
(我认为服务现在将分割分片1,获取分片键为21的所有数据,并将插入分片2,因为它的MinValue为21。)
-
再次运行服务,并抛出以下错误:
源映射和目标映射都指向同一个分片'new_shard'
-
现在我去更新
MaxValue = NULL (INFINITY)
的第一个碎片,我想分裂。再次运行服务,收到以下错误:源映射和目标映射都指向同一个分片'new_shard'
嗯…这可能是因为第一个shard的MaxValue
和新shard的MinValue
是相同的。
这到底是怎么回事?为什么这么难?这方面的适当文档在哪里?
这对我来说非常重要,如果能帮助我分割这个该死的碎片,我将非常感激。
谢谢。
谢谢你关于拆分/合并的问题。让我们看看这是否有帮助:
根据您上面记录的步骤,似乎您最终在步骤3中做了两件事:
- 你添加了一个新的数据库作为一个空的碎片到你的碎片映射,和
- 你试图分配一个映射指向新添加的分片。
第一部分(添加空碎片)应该成功了,而第二部分(添加映射)在你的情况下可能会失败,因为现有的映射到第一个碎片已经覆盖了整个域。
如果到目前为止听起来是正确的,您可以尝试以下步骤:
- 重置你的碎片映射到原始状态,以便(0 -无穷大)Range再次指向第一个分片。最好从头开始重新创建碎片映射。 重新运行上面的步骤1)
- 使用如下调用将上一步中的clean数据库作为碎片添加到现有的碎片映射中:shardmap。CreateShard(new ShardLocation(shardServer, "your_clean_database"));确保你没有调用shardmap.CreateRangeMapping(.)。这是不需要的,它将再次失败,因为(0 - Infinity)范围被分配给您的第一个分片。分割操作将更改映射作为其操作的一部分。
- 提交拆分操作。
无论如何,请不要直接修改[__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