Mongo分片无法在分片之间分割大集合

时间:2010-09-10 00:33:47

标签: mongodb sharding

我在mongo中看起来像是一个简单的分片设置有问题。

我有两个分片,一个mongos实例,以及一个像这样设置的配置服务器:

机器A - 10.0.44.16 - 配置服务器,mongos
机器B - 10.0.44.10 - 碎片1
机器C - 10.0.44.11 - 碎片2

我有一个名为'Seeds'的集合,它有一个分片键'SeedType',它是一个存在于集合中每个文档的字段,并包含四个值之一(请看下面的分片状态)。其中两个值的条目明显多于其他两个(其中两个有784,000个记录,两个有大约5,000个)。

我期待看到的行为是,带有InventoryPOS的'Seeds'集合中的记录将最终出现在一个分片上,而带有InventoryOnHand的记录将最终出现在另一个分片上。

但是,似乎两个较大分片键的所有记录都会在主分片上结束。

这是我的分片状态文本(为清晰起见,删除了其他集合):

--- Sharding Status ---
  sharding version: { "_id" : 1, "version" : 3 }
  shards:
      { "_id" : "shard0000", "host" : "10.44.0.11:27019" }
      { "_id" : "shard0001", "host" : "10.44.0.10:27017" }
  databases:
        { "_id" : "admin", "partitioned" : false, "primary" : "config" }
        { "_id" : "TimMulti", "partitioned" : true, "primary" : "shard0001" }
                TimMulti.Seeds chunks:
                        { "SeedType" : { $minKey : 1 } } -->> { "SeedType" : "PBI.AnalyticsServer.KPI" } on : shard0000 { "t" : 2000, "i" : 0 }
                        { "SeedType" : "PBI.AnalyticsServer.KPI" } -->> { "SeedType" : "PBI.Retail.InventoryOnHand" } on : shard0001 { "t" : 2000, "i" : 7 }
                        { "SeedType" : "PBI.Retail.InventoryOnHand" } -->> { "SeedType" : "PBI.Retail.InventoryPOS" } on : shard0001 { "t" : 2000, "i" : 8 }
                        { "SeedType" : "PBI.Retail.InventoryPOS" } -->> { "SeedType" : "PBI.Retail.SKU" } on : shard0001 { "t" : 2000, "i" : 9 }
                        { "SeedType" : "PBI.Retail.SKU" } -->> { "SeedType" : { $maxKey : 1 } } on : shard0001 { "t" : 2000, "i" : 10 }

我做错了吗?

半无关的问题:

将对象从一个集合原子转移到另一个集合而不阻塞整个mongo服务的最佳方法是什么?

提前致谢, -Tim

1 个答案:

答案 0 :(得分:6)

Sharding确实不是以这种方式使用的。您应该选择具有一些变体的分片键(或制作复合分片键),以便MongoDB可以制作合理大小的块。分片的一个要点是您的应用程序不必知道数据的位置。

如果你想手动分片,你应该这样做:启动未链接的MongoDB服务器并自己从客户端路由。

最后,如果您真的专注于此设置,您可以自己迁移块(有一个moveChunk命令)。

平衡器根据内存中的映射量移动块(运行serverStatus并查看“映射”字段)。可能需要一段时间,MongoDB不希望您的数据在生产中遍布整个地方,所以它非常保守。

半无关的答案:你不能用分片原子地做这件事(eval在多个服务器上不是原子的)。你必须做一个findOne,插入,删除。