gpt4 book ai didi

mongodb - Mongodb 分片无法在分片之间拆分大型集合

转载 作者:IT老高 更新时间:2023-10-28 13:27:53 26 4
gpt4 key购买 nike

我在 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 的记录将最终位于另一个分片上。

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

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

--- 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 服务的情况下,以原子方式将对象从一个集合传输到另一个集合的最佳方法是什么?

提前致谢,-蒂姆

最佳答案

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

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

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

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

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

关于mongodb - Mongodb 分片无法在分片之间拆分大型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com