我使用mongo来存储日志(log)文件.mongoDB和mysql都运行在同一台机器上,虚拟化mongo env不是一个选项.我担心我很快就会遇到性能问题,因为logs表的增长非常快.有没有办法限制mongo的驻留内存,这样它就不会占用所有可用内存,并过度降低mysql服务器的速度?

DB机器:Debian'lenny'5

其他解决方案(请 comments ):

  • 由于我们需要所有历史数据,我们不能使用capped集合,但我也在考虑使用cron脚本来转储和删除旧数据

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

推荐答案

嘿,弗拉德,关于日志(log),你有几个简单的策略.

首先要知道的是,Mongo通常可以在没有大量RAM的情况下处理大量连续插入.原因很简单,你只需要插入或更新最近的内容.因此,索引大小会增加,但数据会不断被调出.

换句话说,您可以将RAM的使用分为两个主要部分:索引和;数据

如果您运行的是典型的日志(log)记录,那么数据部分会不断被清除,因此只有索引真正留在RAM中.

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

随着时间的推移,旧的索引将从RAM中刷新,不再被访问,因此它将消失.

但我也在考虑使用cron脚本来转储和删除旧数据

这种按天记录的方法也有助于删除旧数据.在三个月内,当你处理完数据后,你只需做db.logs20101206.drop()次,收集的数据就会立即消失.请注意,您不会回收磁盘空间(都是预先分配的),但新的数据将填补空白.

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

事实上,我把它内置到了我的数据对象中.所以我使用logs.actionlogs->action访问数据,但在下面,数据实际上保存到了logs.a.在"字段"上比在"值"上花费更多的空间真的很容易,所以缩小"字段"并try 将其抽象到其他地方是值得的.

Mongodb相关问答推荐

在Mongoose中对嵌套文档设置时间戳,但不对父文档设置时间戳

我无法在react 中使用 fetch 和express 从数据库中删除数据

按数组mongodb中的第一个元素排序

在 ExpirePolicy 之后从 Store 中删除元素

使用 $addFields 将字段添加到 $lookup 结果中的每个项目

如何将 MongoDB 集合中的 _id 字段更改为 User_id?

Mongoose 架构引用和未定义类型ObjectID

如果 mongoDB 服务器正在运行,如何从驱动程序判断

将MongoDB连接到前端?

如何在 mongodb 本机驱动程序中对 find() 进行字段 Select ?

在 Mongoose 中填写所有必填字段

NumberLong和简单整数之间的MongoDB区别?

判断 mongoDB 是否连接

一起使用 MongoDB 和 Neo4j

如何从 Mongoose 模型对象中获取集合名称

如何判断 MongoDB 中是否存在字段?

将新值推送到 mongodb 内部数组 - mongodb/php

使用 C# 聚合 $lookup

Hadoop Map/Reduce 与内置 Map/Reduce

开发人员必须采取哪些mental steps才能开始从 SQL 迁移到 NOSQL(CouchDB、Fathom DB、MongoDB 等)?