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只将数据写入一个碎片:(我们做错了什么?
答案 0 :(得分:0)
您所描述的内容通常表明您选择poor shard key makerid
,最有可能单调增加。
通常情况下,会为一个分片指定从x
到infinity
的密钥范围(在您的情况下为shard002)。现在所有新文档都会写入该分片,直到分片包含超过当前migration threshold的更多块。现在,平衡器开始并移动一些块。问题是新文档仍然被写入所述分片。
该问题的简单解决方案是use hashed keys for sharding
现在出现严重问题:您无法更改分片键。
所以你需要做的是备份分片集合,删除它,使用散列makerId
重新设置集合并将备份恢复到新集合中。
答案 1 :(得分:-1)
MongoDB是否始终写入主分片,然后重新平衡?
是的,如果您依赖自动平衡器。并将大量数据加载到空集合中
在您的情况下,您依靠自动平衡器来完成所有分片/平衡的工作。我假设您需要的是,当您的数据加载时,它会在加载期间转到每个分片,因此CPU使用率较低等。
这将如何在高级别进行分片/自动平衡。
现在,当自动平衡器开启时,当您的数据已加载或加载时,会发生这两个步骤。
<强> 解决方案 强>
您必须首先使用小数据集测试此方法。但我想我已经掌握了足够的信息来开始。