设置了一个4节点测试碎片集群:
集群运行得很好,但是当尝试运行以下命令时:
mongos> sh.addTagRange("HTMLDumps.HTMLRepository", { ShardMapId: "7" }, { ShardMapId: "11" }, "NRT")
"errmsg" : "min: { ShardMapId: \"7\" } should be less than max: { ShardMapId: \"11\" }",
"code" : 9,
"codeName" : "FailedToParse",下面是碎片状态输出:
databases:
{ "_id" : "HTMLDumps", "primary" : "shard0001", "partitioned" : true }
HTMLDumps.HTMLRepository
shard key: { "ShardMapId" : 1 }
unique: false
balancing: true
chunks:
shard0000 2
shard0001 2
{ "ShardMapId" : { "$minKey" : 1 } } -->> { "ShardMapId" : "" } on : shard0001 Timestamp(3, 1)
{ "ShardMapId" : "" } -->> { "ShardMapId" : "1" } on : shard0001 Timestamp(1, 2) jumbo
{ "ShardMapId" : "1" } -->> { "ShardMapId" : "7" } on : shard0000 Timestamp(2, 0)
{ "ShardMapId" : "7" } -->> { "ShardMapId" : { "$maxKey" : 1 } } on : shard0000 Timestamp(3, 0)完整的sh.status输出:

发布于 2018-09-04 07:30:53
Shard (tag)范围要求为一个碎片键值范围指定minimum和maximum边界。
因为您的切分键值当前是字符串,所以它们将是使用二进制顺序的比较而不是数字顺序。错误消息正确地指示最小值"7“(字符串)不小于"11”(字符串)的值。例如,给定字符串"1“、"7”和"11",使用二进制字符串比较的预期升序排序结果是"1“、"11”和"7“。这大致是字母顺序,但更具体地说,MongoDB中的字符串存储为UTF-8字节。
由于您打算使用区域分割,对于这个测试部署,最好有数字切分键值,这样您就可以为您的区域使用1-7的范围。您可以删除和替换现有文档,也可以使用所需的切分键值添加更多的文档。
我假设您并不关心测试集群的切分键的基数,但是对于真正的部署,如果选择一个更合适的碎片键的值范围很小,您可能希望使用ShardMapId。
注意:标记感知分片是由分带在MongoDB 3.4中继承的.sh.addTagRange() shell助手已经别名为现代的sh.updateZoneKeyRange(),但为了安全起见,我建议使用较新的帮助程序。您还应该确保您的shell version()与服务器db.version()匹配。
https://dba.stackexchange.com/questions/216592
复制相似问题