我在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
实际上,分片并不意味着以这种方式使用.您应该选择具有一些变体的分片键(或制作复合分片键),以便MongoDB可以制作合理大小的块.分片的一个要点是您的应用程序不必知道数据的位置.
如果你想手动分片,你应该这样做:启动未链接的MongoDB服务器并自己从客户端路由.
最后,如果您真的专注于此设置,您可以自己迁移块(有一个moveChunk命令).
平衡器根据内存中的映射量移动块(运行serverStatus并查看"映射"字段).可能需要一段时间,MongoDB不希望您的数据在生产中遍布整个地方,所以它非常保守.
半无关的答案:你不能通过分片原子地做到这一点(eval在多个服务器上不是原子的).你必须做一个findOne,插入,删除.