2014-11-24 76 views
0

我在MongoDB中遇到了一些麻烦。这是我的配置:MongoDB标记范围不起作用

mongos> sh.status() 
    --- Sharding Status --- 
     sharding version: { 
      "_id" : 1, 
      "version" : 4, 
      "minCompatibleVersion" : 4, 
      "currentVersion" : 5, 
      "clusterId" : ObjectId("546f2d9c37d2895f3b8f9ec1") 
    } 
     shards: 
      { "_id" : "site_A_shard_1", "host" : "site_A_shard_1/<HOST1>:27510,<HOST2>:27511", "tags" : [ "site_A" ] } 
      { "_id" : "site_A_shard_2", "host" : "site_A_shard_2/<HOST2>:27521,<HOST1>:27520", "tags" : [ "site_A" ] } 
      { "_id" : "site_B_shard_1", "host" : "site_B_shard_1/<HOST3>:27510,<HOST4>:27511", "tags" : [ "site_B" ] } 
      { "_id" : "site_B_shard_2", "host" : "site_B_shard_2/<HOST4>:27521,<HOST3>:27520", "tags" : [ "site_B" ] } 
     databases: 
      { "_id" : "admin", "partitioned" : false, "primary" : "config" } 
      { "_id" : "test", "partitioned" : false, "primary" : "site_B_shard_1" } 
      { "_id" : "ocs", "partitioned" : true, "primary" : "site_B_shard_1" } 
        ocs.adrs_queue 
          shard key: { "shard.target" : 1, "shard.key" : 1 } 
          { "shard.target" : { "$minKey" : 1 }, "shard.key" : { "$minKey" : 1 } } -->> { "shard.target" : { "$maxKey" : 1 }, "shard.key" : { "$maxKey" : 1 } } on : site_B_shard_1 Timestamp(1, 0) 
          tag: site_A { "shard" : { "target" : "siteA", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteA", "key" : { "$maxKey" : 1 } } } 
          tag: site_B { "shard" : { "target" : "siteB", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteB", "key" : { "$maxKey" : 1 } } } 
        ocs.ldrs 
          shard key: { "shard.target" : 1, "shard.key" : 1 } 
          { "shard.target" : { "$minKey" : 1 }, "shard.key" : { "$minKey" : 1 } } -->> { "shard.target" : { "$maxKey" : 1 }, "shard.key" : { "$maxKey" : 1 } } on : site_B_shard_1 Timestamp(1, 0) 
          tag: site_A { "shard" : { "target" : "siteA", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteA", "key" : { "$maxKey" : 1 } } } 
          tag: site_B { "shard" : { "target" : "siteB", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteB", "key" : { "$maxKey" : 1 } } } 
        ocs.notifs_queue 
          shard key: { "shard.target" : 1, "shard.key" : 1 } 
          { "shard.target" : { "$minKey" : 1 }, "shard.key" : { "$minKey" : 1 } } -->> { "shard.target" : { "$maxKey" : 1 }, "shard.key" : { "$maxKey" : 1 } } on : site_B_shard_1 Timestamp(1, 0) 
          tag: site_A { "shard" : { "target" : "siteA", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteA", "key" : { "$maxKey" : 1 } } } 
          tag: site_B { "shard" : { "target" : "siteB", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteB", "key" : { "$maxKey" : 1 } } } 
        ocs.ss_queue 
          shard key: { "shard.target" : 1, "shard.key" : 1 } 
          { "shard.target" : { "$minKey" : 1 }, "shard.key" : { "$minKey" : 1 } } -->> { "shard.target" : { "$maxKey" : 1 }, "shard.key" : { "$maxKey" : 1 } } on : site_B_shard_1 Timestamp(1, 0) 
          tag: site_A { "shard" : { "target" : "siteA", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteA", "key" : { "$maxKey" : 1 } } } 
          tag: site_B { "shard" : { "target" : "siteB", "key" : { "$minKey" : 1 } } } -->> { "shard" : { "target" : "siteB", "key" : { "$maxKey" : 1 } } } 

尽管配置了标签范围,但它似乎不起作用。每次尝试插入一些信息时,即使关联的标记为site_A,它也会存储在同一个分片(site_B_shard_1)中。

我在做什么错?

回答

1

它看起来像你正试图在两个碎片分配单个集合,但已经定义了重叠shard tag ranges其中site_Asite_B包括shard.target键值的整个范围(minkey .. maxkey):

tag: site_A { 
    "shard" : { 
     "target" : "siteA", 
     "key" : { "$minKey" : 1 } 
    } 
} -->> { 
    "shard" : { 
     "target" : "siteA", 
     "key" : { "$maxKey" : 1 } 
    } 
} 

tag: site_B { 
    "shard" : { 
     "target" : "siteB", 
     "key" : { "$minKey" : 1 } 
    } 
} -->> { 
    "shard" : { 
     "target" : "siteB", 
     "key" : { "$maxKey" : 1 } 
    } 
} 

如果你想要使用标记感知分片在集合中分发数据,您需要定义范围,其中下限是包含的,上限是独占的,例如:

sh.add TagRange('ocs.adrs_queue',{“shard.target”:MinKey},{“shard.target”:“site_A”},'site_A') sh.addTagRange('ocs.adrs_queue',{“shard.target “:”site_A“},{”shard.target“:”site_B“},'site_A' sh.addTagRange('ocs.adrs_queue',{”shard.target“:”site_B“},{”shard。目标“:MaxKey}, 'site_B')

在这种设置:

  • 文档与shard.target值进行匹配site_Asite_B和应分配给匹配碎片
  • 文档与比site_A少10个值也将在site_A碎片分布
  • 文件比site_B更大shard.target值将在site_B碎片

对于标签感知分片和多数据中心部署的一些例子分布看: