我们需要存储10亿个文档,每个文档为1KB。每个碎片计划有8GB的RAM。该平台是Open红帽Linux。
最初,有10个碎片,用于3亿。我们开始使用2000 inserts/秒插入文档。一切都很顺利直到2.5亿。之后,插入速度急剧减慢到每秒300/400插入。
查询也需要很长的时间(超过1分钟),甚至所有的查询都是覆盖的查询。(需要扫描所有索引的查询)。
因此,我们假设,每个碎片有2000万个是最优值,因此我们需要50个碎片来实现当前硬件的10亿。
这是合理的估计,还是我们可以通过调整mongo参数来改进它(更少的碎片),以提高当前硬件的性能?
有两个复合索引,一个唯一的索引(Long)是使用批量写入(带有无序选项)完成的,每(线程)使用mongos.Shardkey脚本直接进行200条记录大容量写入,mongos.Shardkey是nodeId(复合索引前缀),其基数高达10k。对于3亿,总索引大小为45 GB,40 GB的2复合indexes.Almost 9500块是分布在10 nodes.One有趣的事实是,如果我把内存增加到12 GB,速度增加到1500插入/秒。RAM限制因素?
更新:
使用mongostat工具,我们发现complete.MongoDB集群运行在基于RedHat OpenShift平台的kubernetes上需要超过55秒的时间。它以NFS (EXT4磁盘格式).Is在戴尔EMC服务器上运行,这是I/O中的一个问题,它只支持2MB/秒。每秒写入2000条记录需要60秒,完全刷新到磁盘需要55秒钟。(在此期间,DB的所有操作都被阻止),磁盘利用率甚至不到4 %。
发布于 2021-12-28 01:58:36
你试过一点都不切分吗?
有一种普遍的倾向,就是过早地切碎。我见过一位MongoDB顾问,他提出了一条经验法则,除非您的总数据大小至少为2TB,否则不要将其分解。每个1KB的1B文件应该在1 TB左右。虽然这只是一条经验法则,但也许值得一试。
如果没有其他的,那么在没有切分的情况下设计db就会简单得多,而且性能将更加可预测。
https://stackoverflow.com/questions/70443405
复制相似问题