我应该使用哪个NoSQL数据库来记录日志?

62

您是否有使用NoSQL数据库记录可扩展应用程序的经验?我对使用NoSQL数据库进行日志记录进行了一些研究,发现MongoDB似乎是一个不错的选择。此外,我还发现了一个名为log4mongo-net的工具,它似乎是一个非常简单明了的选项。

您会推荐这种方法吗?还有其他建议吗?

3个回答

74

我决定修改这个被接受的答案,因为过去18个月的技术水平已经显著提高,并且有更好的替代方案存在。

新回答

MongoDB不是一个可扩展的日志记录解决方案的上乘选择。常见原因包括(例如负载下的写入性能)。我想再提出一个原因,即它仅解决了日志记录解决方案中的一个用例。

一个强大的日志记录解决方案至少需要涵盖以下阶段:

  • 收集
  • 传输
  • 处理
  • 存储
  • 搜索
  • 可视化

选择MongoDB只解决了存储用例(尽管可能不太好)。一旦分析完整个链路,就会发现有更适合的解决方案。

@KazukiOhta提到了一些选项。我当前更喜欢的端对端解决方案包括:

使用ElasticSearch作为日志数据存储的基础使用了当前最好的NoSQL解决方案,用于日志记录和搜索用例。Logstash-Forwarder / Logstash / ElasticSearch / Kibana3被包含在ElasticSearch的伞下,这使得它们更有说服力。

由于Logstash也可以充当Graphite代理,因此可以针对相关问题建立非常相似的链路,用于收集和分析指标(而不仅仅是日志)。

旧回答

MongoDB Capped Collections非常受欢迎,适合记录日志,并具有“无模式”的额外优点,通常与记录日志相符。通常情况下,我们只知道我们想记录什么,或在项目中发现某些问题后才会记录。在这些情况下,关系数据库或严格的模式往往很难更改,而试图使它们“灵活”就往往使它们“缓慢”、难以使用或理解。

但是,如果您想在黑暗中管理您的日志,让激光飞舞,看起来像来自太空,那么总会有Graylog2,它使用MongoDB作为其整体基础架构的一部分,但提供


5
作为一种警告,当我们向日志集合写入数千个事件时,MongoDB会出现严重问题。 MongoDB的写性能不佳可能是罪魁祸首。 - Matt Zukowski
2
关于Graylog2,请注意:“所有运行在您数据中心现有的JVM上。”如果您忽略了这一点,在下载包的第三或第四段安装说明中,您将什么也看不到(“您还必须使用Java 7!”)。我总是觉得很有趣,基于Java的项目在推销自己时方便地忘记提到它们是基于Java的项目。只是我的个人意见。 - L0j1k
1
这个答案适用于两种情况吗?1)业务级别的日志(不应该丢失,必须是持久化的)2)统计日志,例如网站访问日志等,在这种情况下丢失一些记录并不重要? - uylmz
2
虽然我们在实施过程中并没有遇到这种情况,但也确实有一些 Elasticsearch 丢失数据的例子。如果需要真正的审计能力,我建议采用双重方法,将“原始”文件保存到(比如)HDFS 进行归档,并将它们发送到 Elasticsearch 进行实时索引和搜索。归档可以用于调节或重新加载 Elasticsearch 索引(如果需要的话)。 - yamen
1
你应该在顶部放置一个声明,说明你与ElasticSearch有关联。至少看起来是这样的。 - jonathancardoso

28

我见过很多公司使用 MongoDB 存储应用程序日志。其无模式设计对于应用程序日志非常灵活,因为模式往往会随着时间的推移而变化。此外,它的 Capped Collection 功能非常实用,因为它会自动清除旧数据以使数据适应内存。

人们通过普通分组或MapReduce来聚合日志,但速度不够快。特别是 MongoDB 的 MapReduce 只在单个线程内工作,其 JavaScript 执行开销巨大。 新聚合框架 可以解决这个问题。

当您将 MongoDB 用于日志记录时,关注点是高写入吞吐量引起的锁争用。虽然 MongoDB 的插入默认是“发射并忘记”样式,但调用大量 insert() 会导致严重的写锁争用。这可能会影响应用程序性能,并防止读取器聚合 / 过滤存储的日志。

一个解决方案可能是使用日志收集器框架,例如FluentdLogstashFlume。这些守护程序应该在每个应用程序节点上启动,并从应用程序进程中获取日志。

Fluentd plus MongoDB

它们缓冲日志并异步地将数据写出到其他系统,如 MongoDB / PostgreSQL / 等。写入是通过批次完成的,因此比直接从应用程序编写更有效率。此链接描述了如何从 PHP 程序将日志放入 Fluentd 中。

以下是有关MongoDB + Fluentd的一些教程。

MongoDB的问题是当数据量超过内存大小时,它会开始变慢。此时,您可以切换到其他解决方案,例如Apache HadoopCassandra。如果您拥有上述分布式日志记录层,则可以随着增长即时切换到另一种解决方案。本教程描述了如何使用Fluentd将日志存储到HDFS。


0

你应该指明你的应用程序产生什么样的日志信息。如果你只是记录了许多简单的日志信息,MongoDB是一个非常好的选择,因为它的扩展性非常好。但如果你需要复杂的身份验证或大量的层次结构,我建议使用传统的关系型数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接