首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当添加已填充集合的新碎片时,MongoDB没有正确地进行缩放

当添加已填充集合的新碎片时,MongoDB没有正确地进行缩放
EN

Stack Overflow用户
提问于 2019-08-10 07:45:27
回答 1查看 352关注 0票数 5

当添加新的碎片时,我的MongoDB切分集群摄取性能不会增加。

我有一个小型集群设置,包含1个mongos +1个配置副本集(3个节点)+N个碎片副本集(每个3个节点)。

Mongos位于一个专门的Kubernetes节点上,每个mongo进程托管碎片都有其专用的k8s节点,而配置旺角进程则在部署它们的地方运行。

集群主要用于托管GridFS文件,典型的文件大约为100 is。

我正在用1,2和3碎片做压力测试,看看它是否有适当的比例,但它没有。

如果我用两个碎片启动一个全新的集群,并以一个碎片的两倍速度运行测试它,但是如果我用一个碎片启动集群,然后执行测试,然后再添加一个碎片(总共2个碎片),然后再执行测试,那么摄入的速度大约是使用一个碎片之前的速度。

查看块的位置,当我立即用2个碎片启动集群时,负载在碎片之间是均匀平衡的。如果我从一个碎片开始,并在插入之后添加第二个碎片,那么这些块倾向于全部放在旧的碎片上,平衡器必须稍后将它们带到第二个碎片上。

快速事实:

  • 块状1024 MB
  • 切分键是GridFS file_id,散列
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-13 06:28:05

这是由于哈希切分和平衡的工作方式。

在空集合中(来自碎空藏品):

切分操作创建空块以覆盖碎片键值的整个范围,并执行初始块分布。默认情况下,操作每个碎片创建两个块,并在集群中迁移。

因此,如果您在一个集群上执行sh.shardCollection(),其中包含x的碎片数,那么它将在每个碎片上创建两个块,并将它们分布到各个碎片上,在整个集群中总共分配两个2x块。由于集合是空的,移动块几乎不需要时间。现在,您的摄入将均匀地分布在各个碎片上(假设其他事情,例如哈希字段的良好基数)。

现在,如果在创建块之后添加了一个新的碎片,那么这个碎片将开始为空,平衡器将开始使用迁移阈值将块发送到它。在已填充的集合中,此过程可能需要一段时间才能完成。

如果平衡器仍然在移动块(现在可能不是空的),那么集群现在正在同时执行两个不同的任务: 1)摄入,2)平衡。

当您使用1个碎片并添加另一个碎片时,您正在摄入的块很可能仍位于碎片1中,尚未移动到新的碎片中,因此大部分数据将进入该碎片。

因此,在添加新的碎片之后,您应该等到集群平衡后再进行另一次摄入。均衡后,摄入负荷应更均匀地分配。

注意:由于您的切分键是file_id,所以我假设每个文件的大小大致相同(~100 MB)。如果有些文件比其他文件大得多,那么一些块也会比其他文件更繁忙。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57440343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档