无法分片数据

时间:2014-09-19 13:36:08

标签: mongodb ubuntu amazon-ec2 sharding database

我遇到了有关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" }

2 个答案:

答案 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(将分片键范围分配给分片)