Mongo分片无法将大型集合在分片之间划分

6
我在mongo的简单分片设置中遇到了问题。
我有两个分片、一个mongos实例和一个配置服务器,如下所示:
Machine A - 10.0.44.16 - 配置服务器,mongos Machine B - 10.0.44.10 - 分片1 Machine C - 10.0.44.11 - 分片2
我有一个名为“Seeds”的集合,其中包含一个分片键“SeedType”,这是该集合中每个文档都有的字段,并包含四个值之一(请查看下面的分片状态)。其中两个值比另外两个值要多得多(其中两个值分别有784,000条记录,而另外两个值大约有5,000条记录)。
我期望看到的行为是,“Seeds”集合中具有InventoryPOS的记录将最终出现在一个分片上,而具有InventoryOnHand的记录将出现在另一个分片上。
然而,似乎所有两个较大的分片键的记录最终都会出现在主分片上。
以下是我的分片状态文本(为了清晰起见,删除了其他集合):
---分片状态---
  分片版本: { "_id" : 1, "version" : 3 }
  分片:
      { "_id" : "shard0000", "host" : "10.44.0.11:27019" }
      { "_id" : "shard0001", "host" : "10.44.0.10:27017" }
  数据库:
        { "_id" : "admin", "partitioned" : false, "primary" : "config" }
        { "_id" : "TimMulti", "partitioned" : true, "primary" : "shard0001" }
                TimMulti.Seeds块:
                        { "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个回答

6
分片并不是用这种方式使用的。您应该选择具有一定变化性的分片键(或制作复合分片键),以便MongoDB可以生成合理大小的块。分片的一个要点是,您的应用程序不必知道数据在哪里。
如果您想手动分片,那么应该这样做:启动未链接的MongoDB服务器,并从客户端自行路由。
最后,如果您真的致力于这种设置,您可以自己迁移块(有一个moveChunk命令)。
平衡器根据内存中映射的数量移动块(运行serverStatus并查看“映射”字段)。这可能需要一些时间,MongoDB不希望您的数据在生产过程中到处飞,因此它非常保守。
半无关答案:您不能使用分片进行原子操作(eval在多个服务器上不是原子的)。您将不得不进行findOne、insert、remove操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接