实际工作中如何保证MongoDB的高性能?

你曾经和你的MongoDB数据库有性能问题?常见的情况是运行查询时突然出现性能问题。显而易见的第一个解决方案是,“让我们创建一个索引!”,虽然这能够解决很多的性能问题,但是为了提升MongoDB性能,还有很多其它东西需要考虑。

要想有高性能的MongoDB,不是简单的使用昂贵磁盘和千兆网络的大型机器就一定能行的。事实上,高性能硬件设备不一定能够为我们带来高性能的MongoDB。

MongoDB的性能来自于好的理念、组织、和数据分布。我们要为MongoDB的性能优化准备一套方案,虽然这不是一个详尽的或完整的指南,但这是一个好的开始。

实际工作中如何保证MongoDB的高性能?

保持文件的简单

MongoDB是无模式数据库。这意味着默认情况下没有预定义的模式。我们可以在新版本中添加预定义的模式,但它不是强制性的。要意识到在处理嵌入文档和数组时遇到的困难,因为在应用程序/ ETL过程中解析数据可能变得非常复杂。此外,数组会影响复制性能:对于数组中的每一个更改,所有数组值都需要复制!

在MMAPv1,选择合适的字段名称是非常重要的因为数据库需要保存每个文档的字段名称。它不像在关系数据库中保存模式。让我们想象一下下面的情况会占用多少数据:

如果你有一个字段名称为:lastmessagereceivedfromsensor,并且有100万个文档需要存储。

大约28 MB只是为了存储这个字段名称,而这个字段里面可能什么数据也没有。

硬件很重要,但是。。。

使用好的硬件和多个处理器,以及大量的内存肯定有助于提高性能。

WiredTiger利用多处理器提供了良好的性能。这个存储引擎的特点是每个文档锁定算法,以便尽可能多的处理器和尽可能多的操作可以同时运行。

当这台昂贵的高性能机器(32 CPUs, 128G RAM, and 2TB disk)出现故障宕机时会怎样呢?这个时候你的MongoDB将会全部不可用。在分布式环境中有多个小型机器可以确保宕机只会影响少部分或没有知觉的应用。但同时,更多的机器意味着很有可能失败。在设计环境时考虑这种折衷。正确的选择影响绩效。

设计合理的工作集

工作集有多大?通常,应用程序不使用所有数据。有些数据经常更新,而其他数据则不更新。

你的工作数据集适合RAM吗?当所有工作数据集都在RAM中时,就会出现最佳性能。读取,如备份、ETL或从初选报告,都会严重影响性能,因为在缓存中有页面竞争。对于大型报表或聚合也是如此。

为多个目的拥有多个集合,并为特定目的使用特定的机器——如使用区域保存不再使用的文档——将有助于拥有简单的工作集。


分享到:


相關文章: