我有一个系统通过http接收来自不同地方的日志文件(> 10k生产者,每天10个日志,每个约100行文本)。
我想存储它们以便能够计算misc。每晚对它们进行统计,输出它们(按到达日期或第一行内容排序)......
我的问题是:存储它们的最佳方式是什么?
有什么建议吗?
答案 0 :(得分:8)
(免责声明:我在MongoDB上工作。)
我认为MongoDB是最佳的日志记录解决方案。它非常快,因为它可能比发送数据更快地插入数据。您可以对数据(例如,日期或日志级别的范围)以及索引和字段或字段组合进行有趣的查询。它也很好,因为你可以随机地向日志添加更多字段(“oops,我们想要一些堆栈跟踪字段”)并且它不会引起问题(就像使用平面文本文件一样)。
就稳定性而言,很多人已经在生产中使用MongoDB(参见http://www.mongodb.org/display/DOCS/Production+Deployments)。在我们进入1.0之前,我们还想要添加一些其他功能。
答案 1 :(得分:4)
我会选择第一个解决方案。
我不明白为什么你需要DB。似乎所有你需要的是扫描数据。将日志保持在最“原始”状态,然后处理它,然后每天创建一个tarball。
聚合的唯一原因是减少文件数量。在某些文件系统上,如果在目录中放置N个以上的文件,性能会迅速下降。检查您的文件系统,如果是这种情况,请组织一个简单的2级层次结构,例如,使用生产者ID的前2位数作为第一级目录名。
答案 2 :(得分:2)
我会在每次上传时写一个文件,并按照您的第一个建议写一个目录/天。在一天结束时,对文件运行处理,然后tar.bz2目录。
tarball仍然可以搜索,并且可能非常小,因为日志通常可以很好地压缩。
对于总数据,您说的是每天1GB(校正10MB)未压缩。这可能会压缩到100MB或更少。我在使用bzip2的日志文件上看到了200x压缩。您可以轻松地将压缩数据存储在文件系统上多年,而无需担心。对于其他处理,您可以编写可以搜索压缩tarball并生成更多统计信息的脚本。
答案 3 :(得分:1)
因为你想存储它们以便能够计算misc。每晚对它们进行统计,输出它们(按到货日期或第一行内容排序)......您预计每天会有100,000个文件,总计10,000,000行:
我建议:
因此,您只能使用数据库来轻松聚合数据。如果过程不起作用,您还可以通过执行相同的步骤来重现较旧日的报告。
答案 4 :(得分:0)
根据我的经验,如果我们谈论数据库解决方案,单个大表的执行速度比几个链表快得多。特别是在写入和删除操作上。例如,将一个表拆分为三个链接表会使性能降低3-5倍。这非常粗糙,当然这取决于细节,但通常这是风险。当数据量变得非常大时,情况会变得更糟。存储日志数据的最佳方式IMO不是平面文本,而是结构化形式,以便您以后可以进行有效的查询和格式化。管理日志文件可能很痛苦,尤其是当它们有很多来自许多来源和位置时。查看我们的solution,IMO可以为您节省大量的开发时间。