MongoDB是否总是写入主分片然后重新平衡?

时间:2015-07-31 16:33:28

标签: mongodb sharding

use vsm;
sh.enableSharding('vsm');
sh.shardCollection('vsm.pricelist', {maker_id:1});

好的,我们在此数据库(价格表)中启用了数据库(vsm)和集合的分片。

我们试图将大约8000万份文件写入“价格表”系列。 我们有大约2000个统一分布的不同maker_ids。

我们有三个分片。 Shard002是'vsm'数据库的主要内容。

我们从四个应用程序节点写入'pricelist'集合,每个节点都有启动的mongos。

在将数据写入“价目表”集合时,我们在Shard002上看到CPU使用率100%

我们看到了再平衡过程。数据迁移到Shard000和Shard003。但Shard002具有高CPU使用率和负载平均值!

在c4.xlarge EBS Optimized实例上部署了Shards。 dbdata存储在具有2000 IOPS EBS卷的io1上。

看起来MongoDB只将数据写入一个碎片:(我们做错了什么?

2 个答案:

答案 0 :(得分:0)

问题

您所描述的内容通常表明您选择poor shard key makerid,最有可能单调增加。

通常情况下,会为一个分片指定从xinfinity的密钥范围(在您的情况下为shard002)。现在所有新文档都会写入该分片,直到分片包含超过当前migration threshold的更多块。现在,平衡器开始并移动一些块。问题是新文档仍然被写入所述分片。

解决方案

该问题的简单解决方案是use hashed keys for sharding

现在出现严重问题:您无法更改分片键。

所以你需要做的是备份分片集合,删除它,使用散列makerId重新设置集合并将备份恢复到新集合中。

答案 1 :(得分:-1)

  

MongoDB是否始终写入主分片,然后重新平衡?

是的,如果您依赖自动平衡器。并将大量数据加载到空集合中

在您的情况下,您依靠自动平衡器来完成所有分片/平衡的工作。我假设您需要的是,当您的数据加载时,它会在加载期间转到每个分片,因此CPU使用率较低等。

这将如何在高级别进行分片/自动平衡。

现在,当自动平衡器开启时,当您的数据已加载或加载时,会发生这两个步骤。

<强> 解决方案

您必须首先使用小数据集测试此方法。但我想我已经掌握了足够的信息来开始。