了解MongoDB缓存系统

时间:2013-07-08 19:41:34

标签: mongodb

这是一个基本问题,但非常重要,我不确定是否真的明白了。

在官方文档中我们可以阅读

  

MongoDB将所有最近使用的数据保存在RAM中。如果您为查询创建了索引,并且您的工作数据集适合RAM,则MongoDB将从内存中提供所有查询。

我不确定的部分是

  

如果您已为查询创建索引,并且您的工作数据集适合RAM

是什么意思"索引"这里吗?

例如,如果我更新模型,那么我查询它,因为我已经更新它,它现在在RAM中,所以它将来自内存,但这在我看来并不是很清楚。

我们怎样才能确定我们查询的数据是否来自内存?据我所知,MongoDB使用空闲内存来缓存当前可用的内存数据,但有人可以进一步解释全局行为吗?

在哪种情况下,在我们的节点服务器中使用存储数据的变量比信任MongoDB缓存系统更好?

您如何全球建议使用MongoDB进行大量流量?

2 个答案:

答案 0 :(得分:26)

一个开始准确理解 索引的好地方:http://docs.mongodb.org/manual/core/indexes/

在你完成了这些工作后,你会发现它们为什么如此优秀,然而,跳过一些更为复杂的问题。

  

我们怎样才能确定我们查询的数据是否来自内存?

一种方法是查看任何查询yields上的explain()字段。这将告诉您读者产生锁定的次数,因为数据不在RAM中。

另一个更深入的方法是查看像mongostat这样的程序和其他类似的程序。这些程序将告诉您mongod上发生了哪些页面错误(需要将数据从磁盘分页到RAM中)。

  

据我所知,MongoDB使用空闲内存来缓存当前可用的内存数据,但有人可以进一步解释全局行为吗?

这实际上是不正确的。简单地说MongoDB可以做到这一点更容易,但事实上并非如此。事实上,操作系统及其自己的分页算法(通常是LRU)为MongoDB执行此操作。 MongoDB确实将索引计划缓存了一段时间,因此它不必经常检查和测试索引。

  

在哪种情况下,在我们的节点服务器中使用存储数据的变量比信任MongoDB缓存系统更好?

不确定您希望如何工作......我的意思是两者做了完全不同的事情,如果您打算在启动时将MongoDB中的数据读入您的应用程序,那么我绝对不会推荐它。

除了内存管理的OS算法非常成熟和快速,所以没关系。

  

您如何全球建议使用MongoDB进行大量流量?

嗯,这是一个非常大的问题。我真的会向你推荐Google这个主题,但正如文档所述,你需要确保你的工作集适合RAM。

这是一个很好的起点:What does it mean to fit "working set" into RAM for MongoDB?

答案 1 :(得分:6)

MongoDB尝试将整个集合保留在内存中:它对每个集合页面进行内存映射。对于内存中的所有内容,数据页和引用它们的索引必须保存在内存中。

如果MongoDB返回一条记录,你可以放心它现在在内存中(无论是之前你的查询)。

MongoDB不像网页浏览器那样保留记录的“缓存”。提交更改时,内存和磁盘都会更新。

与适当的用例匹配时,Mongo 很好。如果您有足够的服务器内存来缓存所有内容,那么非常高性能,并且在此之后迅速下降。很多很多大型网站都使用MongoDB:现在内存非常便宜是件好事。