当添加新的碎片时,我的MongoDB切分集群摄取性能不会增加。
我有一个小型集群设置,包含1个mongos +1个配置副本集(3个节点)+N个碎片副本集(每个3个节点)。
Mongos位于一个专门的Kubernetes节点上,每个mongo进程托管碎片都有其专用的k8s节点,而配置旺角进程则在部署它们的地方运行。
集群主要用于托管GridFS文件,典型的文件大约为100 is。
我正在用1,2和3碎片做压力测试,看看它是否有适当的比例,但它没有。
如果我用两个碎片启动一个全新的集群,并以一个碎片的两倍速度运行测试它,但是如果我用一个碎片启动集群,然后执行测试,然后再添加一个碎片(总共2个碎片),然后再执行测试,那么摄入的速度大约是使用一个碎片之前的速度。
查看块的位置,当我立即用2个碎片启动集群时,负载在碎片之间是均匀平衡的。如果我从一个碎片开始,并在插入之后添加第二个碎片,那么这些块倾向于全部放在旧的碎片上,平衡器必须稍后将它们带到第二个碎片上。
快速事实:
发布于 2019-08-13 06:28:05
这是由于哈希切分和平衡的工作方式。
在空集合中(来自碎空藏品):
切分操作创建空块以覆盖碎片键值的整个范围,并执行初始块分布。默认情况下,操作每个碎片创建两个块,并在集群中迁移。
因此,如果您在一个集群上执行sh.shardCollection(),其中包含x的碎片数,那么它将在每个碎片上创建两个块,并将它们分布到各个碎片上,在整个集群中总共分配两个2x块。由于集合是空的,移动块几乎不需要时间。现在,您的摄入将均匀地分布在各个碎片上(假设其他事情,例如哈希字段的良好基数)。
现在,如果在创建块之后添加了一个新的碎片,那么这个碎片将开始为空,平衡器将开始使用迁移阈值将块发送到它。在已填充的集合中,此过程可能需要一段时间才能完成。
如果平衡器仍然在移动块(现在可能不是空的),那么集群现在正在同时执行两个不同的任务: 1)摄入,2)平衡。
当您使用1个碎片并添加另一个碎片时,您正在摄入的块很可能仍位于碎片1中,尚未移动到新的碎片中,因此大部分数据将进入该碎片。
因此,在添加新的碎片之后,您应该等到集群平衡后再进行另一次摄入。均衡后,摄入负荷应更均匀地分配。
注意:由于您的切分键是file_id,所以我假设每个文件的大小大致相同(~100 MB)。如果有些文件比其他文件大得多,那么一些块也会比其他文件更繁忙。
https://stackoverflow.com/questions/57440343
复制相似问题