2010-12-06 125 views
18

我正在使用mongo来存储日志文件。 mongoDB和mysql都运行在同一台机器上,虚拟化mongo env不是一个选项。由于日志表增长非常快,我恐怕很快会遇到性能问题。有没有办法限制mongo的驻留内存,这样它就不会吃掉所有可用内存,并且会过度减慢mysql服务器的速度?MongoDB限制内存

DB机:Debian的“莱尼” 5

其他解决方案(请评论):

  • 正如我们所需要的所有历史数据,我们不能用封顶集合,但我使用也在考虑一个cron脚本,用于转储和删除旧数据

  • 我还应该考虑使用较小的密钥,如其他论坛上的建议?

回答

13

嘿弗拉德,你有几个关于日志的简单策略。

首先要知道的是,Mongo通常可以处理大量的连续插入,而没有大量的RAM。原因很简单,你只能插入或更新最近的东西。所以索引大小会增长,但数据会不断地被调出。换句话说,你可以将RAM的使用分成两个主要部分:索引&数据。

如果您正在运行典型的日志记录,数据部分会不断被刷新,所以只有索引真正停留在RAM中。

要知道的第二件事是,您可以通过将日志放入较小的桶中来缓解索引问题。这样想想吧。如果您将所有日志收集到带日期标记的集合中(称为logs20101206),那么您还可以控制RAM中索引的大小。

当你翻滚几天时,旧的索引将从RAM中刷新,并且不会再次访问,所以它会消失。

,但我使用的转储和删除旧数据

这的天记录的方法还有助于删除旧数据cron脚本也在考虑。在三个月内,当您完成数据时,您只需执行db.logs20101206.drop(),并且集合即刻消失。请注意,您不会回收磁盘空间(全部是预先分配的),但新数据将填补空白处。

我是否应该考虑使用更小的键,如其他论坛上的建议?

是的。

事实上,我已经将它嵌入到我的数据对象中。所以我使用logs.actionlogs->action访问数据,但在下面,数据实际上保存为logs.a。在“领域”而不是在“价值”上花费更多空间是非常容易的,因此值得缩小“领域”并试图将其抽离其他地方。

+0

谢谢您的详细解答:) – 2010-12-07 10:46:34

+0

但是,是不是有任何方法可以指定给操作系统,mongo的驻留内存不应该大于XXX MB? – 2010-12-07 10:47:42

1

对于3.2+版,它采用wiredTiger引擎,选择--wiredTigerCacheSizeGB是有关这个问题。你可以设置它,如果你知道你在做什么。我不知道这是否是最佳做法,只需从document中读取并在此处提出即可。