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