Mongodb:在 RAM 中保存经常写入的集合

Posted

技术标签:

【中文标题】Mongodb:在 RAM 中保存经常写入的集合【英文标题】:Mongodb: keeping a frequently written collection in RAM 【发布时间】:2013-09-17 19:54:09 【问题描述】:

我正在从流式 API 收集数据,我想创建一个实时分析仪表板。此仪表板将显示一个简单的时间序列,绘制每小时的文档数量。我想知道我目前的方法是否最佳。

在以下示例中,为流中的每个新文档触发 on_data。

# Mongo collections.
records = db.records
stats = db.records.statistics

on_data(self, data):
    # Create a json document from data.
    document = simplejson.loads(data)

    # Insert the new document into records.
    records.insert(document)

    # Update a counter in records.statistics for the hour this document belongs to. 
    stats.update( 'hour': document['hour'] ,  '$inc':  document['hour']: 1  , upsert=True)

以上工作。我得到了一个漂亮的图表,它绘制了每小时的文档数量。我的问题是这种方法是否最佳。我对每个文档提出两个 Mongo 请求。第一个插入文档,第二个更新计数器。流每秒发送大约 10 个新文档。

是否有例如告诉 Mongo 将 db.records.statistics 保留在 RAM 中?我想这会大大减少我服务器上的磁盘访问。

【问题讨论】:

您多久刷新一次图表?您可以非规范化和聚合(对于图表)。您有 2 次写入和 1 次读取,您可以将其进行一次写入和一次聚合。再说一次,由于小时数相当小(24 个值),您可以将聚合替换为索引小时字段上的计数。 【参考方案1】:

MongoDB 使用内存映射来处理文件 I/O,因此它本质上将所有数据视为已经在 RAM 中,并让操作系统找出细节。简而言之,你不能强迫你的收藏在内存中,但是如果操作系统处理得很好,那么重要的东西就会是。查看此文档链接,了解有关 mongo 内存模型以及如何优化操作系统配置以最适合您的用例的更多信息:http://docs.mongodb.org/manual/faq/storage/

但要具体回答您的问题:您应该没问题。在任何情况下,每秒 10 或 20 次写入都不应该成为磁盘瓶颈(假设您在非古代硬件上运行)。我建议的一件事是在统计信息中建立一个超过“小时”的索引,如果你还没有这样做的话,可以让你的更新更快地找到文档。

【讨论】:

您实际上可以使用 touch() 和其他类似的 MongoDB 命令来确保集合首先在 RAM 中

以上是关于Mongodb:在 RAM 中保存经常写入的集合的主要内容,如果未能解决你的问题,请参考以下文章

创建数据库并希望写入磁盘而不是保存在 RAM 中

如何正确的使用MongoDB并优化其性能

ram中使用的mongodb清除内存

NVM区数据备份机制

MongoDB、NUMA 硬件、页面错误但有足够的 RAM 用于工作集、触摸命令或 vmtouch/dd 未加载到内存中

集合未保存在 mongodb 中(来自 mongoose 填充文档的故事集合)