我正在考虑尝试使用MongoDB来存储我们的统计数据,但是在我真正开始学习它之前,我有一些关于我是否正确理解它的一般性问题。
我理解使用文档的概念,我不太清楚的是每个文档中可以存储多少数据。下图解释了我正在考虑的布局:
Website (document)
- some keys/values about the particular document
- statistics (tree)
- millions of rows where each record is inserted from a pageview (key/value array containing data such as timestamp, ip, browser, etc)
让我对mongodb感到兴奋的是分组功能,例如: http://www.mongodb.org/display/DOCS/Aggregation
db.test.group(
{ cond: {"invoked_at.d": {$gte: "2009-11", $lt: "2009-12"}}
, key: {http_action: true}
, initial: {count: 0, total_time:0}
, reduce: function(doc, out){ out.count++; out.total_time+=doc.response_time }
, finalize: function(out){ out.avg_time = out.total_time / out.count }
} );
但我主要担心的是,例如,如果在机架空间的512-1gb ram服务器上有数百万个文档中有数百万条记录,那么该命令在服务器上会有多难?它还能保持低负荷吗?
MongoDB可以拥有的文件数量是否有限制(单独的数据库)?另外,我上面解释的树中的记录数是否有限制?此外,我上面显示的查询是立即运行还是某种map / reduce查询?不太确定我是否可以在我们的控制面板中执行页面加载时立即获取这些统计信息。
谢谢!
答案 0 :(得分:5)
每个文档的大小限制为4MB(在文本中为A LOT)。
建议在复制模式下运行MongoDB或使用分片,因为否则会出现单服务器持久性问题。没有给出单服务器持久性,因为MongoDB每60秒只对磁盘进行一次fsync,所以如果你的服务器在两个fsync之间发生故障,那么在那个时间内插入/更新的数据将会丢失。
mongodb中的磁盘空间以外的文档没有限制。
您应该尝试将与您的数据匹配的数据集(或生成一些测试数据)导入MongoDB,并分析查询执行的速度。请记住在查询中大量使用的字段上设置索引。即使有大量数据,您的上述查询也应该可以正常工作。
为了分析查询的速度,请使用database profiler MongoDB附带的。在mongo shell上:
db.setProfilingLevel(2); // to set the profiling level
[your query]
db.system.profile.find(); // to see the results
请记住在完成后关闭分析(否则日志会非常大)。
关于你的数据库布局我建议将“架构”(是的,架构更少......)更改为:
网站(收藏): - 关于特定文档的一些键/值
统计(收集) - 从页面视图中插入每条记录的数百万行(包含时间戳,IP,浏览器等数据的键/值数组) + DBRef到网站
答案 1 :(得分:3)
MongoDB中的文档大小限制为4MB。假设单页面视图导致存储32个字节。然后,您将能够在单个文档中存储大约130,000个页面视图。
基本上,页面可以生成的页面浏览量是无限的,并且您表示您期望有数百万个页面浏览量,因此我建议您将日志条目存储为单独的文档。每个日志条目都应包含父文档的_id
。
数据库中的文档数量限制为2GB of total space on 32-bit systems。 64位系统没有此限制。
group()
function是一个地图缩减查询。文档建议您使用map-reduce查询而不是group()
,因为它对大型数据集和分片环境有一些限制。