我遇到了有关MongoDB分片的问题。 我的测试设置如下 -
1.Application Server(1台服务器) - 我的应用程序正在运行。
2.MongoS&路由器(1台服务器)
3.Two Shards-Primary shard包含完整的DB&次要分片只是空白。
有一个名为" DEMO"其中包含以下数据 -
"_id" : ObjectId("541c2df0e4b06af824c2c046"),
"country" : "INDIA",
"deviceType" : "manu-laptop",
"osVersion" : "patanahi",
"logtime" : {
"logtime" : ISODate("2014-09-19T13:21:52.596Z"),
"logtimeStr" : "19-09-2014 06:51:52",
"day" : 19,
"month" : 9,
"year" : 2014,
"hour" : 18,
"min" : 51,
"second" : 52
},
"countryId" : "511d0f28c3c4e5cc447c8dac"
有两个国家--INDIA&中国。 我已经分了国家钥匙。 我用来分割密钥的命令是
db.runCommand({shardcollection:"demo.db",key:{"country" : 1}});
但是当我在Mongos上运行负载时,它只将数据保存在主分片上,而不是将其路由到第二个分片。
用例如下─ 我想将INDIA数据保存在另一个碎片上的1个碎片和CHINA数据上。 请帮忙。
设置完成,工作正常。
--- Sharding Status ---
sharding version: {
"_id" : 1,
"version" : 3,
"minCompatibleVersion" : 3,
"currentVersion" : 4,
"clusterId" : ObjectId("541bf31a8c554f2e2d4e1ad4")
}
shards:
{ "_id" : "shard0000", "host" : "xx.xx.xx.xx:27017", "tags" : [ "INDIA" ] }
{ "_id" : "shard0001", "host" : "xx.xx.xx.xx:27017", "tags" : [ "USA" ] }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "demo", "partitioned" : true, "primary" : "shard0000" }
demo.device
shard key: { "country" : 1 }
chunks:
shard0001 1
shard0000 1
{ "country" : { "$minKey" : 1 } } -->> { "country" : "INDIA" } on : shard0001 Timestamp(2, 0)
{ "country" : "INDIA" } -->> { "country" : { "$maxKey" : 1 } } on : shard0000 Timestamp(2, 1)
demo.incoming_request_log
shard key: { "regionId" : 1 }
chunks:
shard0001 2
shard0000 3
{ "regionId" : { "$minKey" : 1 } } -->> { "regionId" : 0 } on : shard0001 Timestamp(2, 0)
{ "regionId" : 0 } -->> { "regionId" : 2 } on : shard0000 Timestamp(3, 1)
{ "regionId" : 2 } -->> { "regionId" : "0" } on : shard0000 Timestamp(2, 2)
{ "regionId" : "0" } -->> { "regionId" : "2" } on : shard0000 Timestamp(2, 4)
{ "regionId" : "2" } -->> { "regionId" : { "$maxKey" : 1 } } on : shard0001 Timestamp(3, 0)
tag: INDIA { "regionId" : "0" } -->> { "regionId" : "1" }
tag: USA { "regionId" : "2" } -->> { "regionId" : "3" }
{ "_id" : "demo;", "partitioned" : false, "primary" : "shard0001" }
答案 0 :(得分:1)
这就是我为解决问题所做的工作 -
1.我使用以下命令删除了所有标签 - (这只是一个测试环境,所以我不介意删除它)
sh.removeShardTag("shard0000", "INDIA")
2.删除配置db'标签中的标签'集合。
3.使用以下命令添加新范围标记 -
sh.addShardTag("shard0001", "INDIA")
4.添加了标签范围 -
sh.addTagRange("demo.incoming_request_log", { regionId: 5 }, { regionId: 9 }, "INDIA")
注意 - 我想将所有请求路由到shard1,其中regionId是标记的分片键。现在,Mongos对demo数据库的所有请求以及regionId介于5和9之间的incoming_request_log将转到shard1和其他' s到shard0。
答案 1 :(得分:0)
1)你对碎片1有多少数据?可能是尚未达到的最大块大小,那么就没有必要对2个分片进行分片。默认块大小为64 MB。 2)您可以指定要在某个分片上保留带有某些分片键的文档,请参阅:addShardTag(为分片命名) addTagRange(将分片键范围分配给分片)