我使用mongo存储日志文件。 mongoDB和mysql都在同一台机器上运行,虚拟化mongo env不是一个选项。因为日志表变得非常快,我恐怕很快就会遇到性能问题。有没有办法限制mongo的驻留内存,以便它不会占用所有可用内存并过度减慢mysql服务器?
数据库机:Debian'lenny'5
其他解决方案(请发表评论):
由于我们需要所有历史数据,我们不能使用上限集合,但我也在考虑使用转储和删除旧数据的cron脚本
我是否还应考虑使用较小的密钥,如其他论坛所示?
答案 0 :(得分:13)
首先要知道的是,Mongo通常可以处理大量连续插入而无需大量RAM。原因很简单,你只需插入或更新最近的东西。因此索引大小会增加,但数据会不断被分页。
换句话说,您可以将RAM使用分为两个主要部分:index&数据
如果您正在运行典型的日志记录,则数据部分会不断被清除,因此只有索引才真正保留在RAM中。
要知道的第二件事是,您可以通过将日志放入较小的存储桶来缓解索引问题。这样想吧。如果将所有日志收集到带有日期戳的集合中(称之为logs20101206
),那么您还可以控制RAM中索引的大小。
当您滚动数天时,旧索引将从RAM中刷新,并且不会再次访问它,因此它将会消失。
但我也在考虑使用转储和删除旧数据的cron脚本
这种按天记录的方法也有助于删除旧数据。在您完成数据的三个月内,您只需执行db.logs20101206.drop()
即可立即消失。请注意,您不会回收磁盘空间(它都是预先分配的),但是新数据将填满空位。
我是否应该考虑使用其他论坛上建议的较小的密钥?
是
事实上,我将它内置到我的数据对象中。因此,我使用logs.action
或logs->action
访问数据,但在下面,数据实际上已保存到logs.a
。在“领域”上花费更多的空间比在“价值”上花费更多的空间,因此值得缩小“领域”并试图将其抽象出去。
答案 1 :(得分:1)
对于使用wiredTiger引擎的版本3.2+,选项--wiredTigerCacheSizeGB
与问题相关。如果你知道你在做什么,你可以设置它。我不知道它是否是最佳做法,只需从Maven Shade Plugin阅读并在此处提出。
答案 2 :(得分:0)
对于Windows,似乎可以控制MongoDB使用的内存量,请参阅Captain Codeman的本教程: