6

我在 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 的“种子”集合中的记录最终会出现在一个分片上,而带有 InventoryOnHand 的记录会出现在另一个分片上。

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

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

--- 分片状态 ---
  分片版本:{“_id”:1,“版本”:3}
  碎片:
      {“_id”:“shard0000”,“主机”:“10.44.0.11:27019”}
      {“_id”:“shard0001”,“主机”:“10.44.0.10:27017”}
  数据库:
        {“_id”:“admin”,“partitioned”:false,“primary”:“config”}
        {“_id”:“TimMulti”,“分区”:真,“主”:“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 服务的情况下以原子方式将对象从一个集合传输到另一个集合的最佳方法是什么?

在此先感谢,-蒂姆

4

1 回答 1

6

分片真的不应该以这种方式使用。您应该选择具有一些变化的分片键(或制作复合分片键),以便 MongoDB 可以制作合理大小的块。分片的要点之一是您的应用程序不必知道您的数据在哪里。

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

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

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

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

于 2010-09-10T21:04:47.763 回答