56

您是否有任何记录到 NoSQL 数据库以获取可扩展应用程序的经验?我对 NoSQL 数据库进行了一些日志记录研究,发现 MongoDB 似乎是一个不错的选择。另外,我发现log4mongo-net这似乎是一个非常简单的选择。

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

4

3 回答 3

68

我决定修改这个公认的答案,因为在过去的 18 个月中,最先进的技术发生了显着变化,并且存在更好的替代方案。

新答案

对于可扩展的日志记录解决方案,MongoDB 是一个低于标准的选择。这有通常的原因(例如负载下的写入性能)。我想再提出一个,那就是它只解决了日志解决方案中的一个用例。

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

  • 收藏
  • 运输
  • 加工
  • 贮存
  • 搜索
  • 可视化

MongoDB 作为一种选择只解决了存储用例(尽管有些糟糕)。一旦分析了完整的链条,就会有更合适的解决方案。

@KazukiOhta 提到了一些选项。这些天我首选的端到端解决方案包括:

ElasticSearch 用于日志数据存储的底层使用将当前最好的 NoSQL 解决方案用于日志记录和搜索用例。Logstash-Forwarder / Logstash / ElasticSearch / Kibana3 都在 ElasticSearch 的保护伞下,这一事实提出了一个更有说服力的论点。

由于 Logstash 还可以充当 Graphite 代理,因此可以为收集和分析指标(不仅仅是日志)的相关问题构建一个非常相似的链。

旧答案

MongoDB Capped Collections非常流行并且适用于日志记录,另外还有一个额外的好处是“少模式”,这通常是适合日志记录的语义。通常我们只知道我们想要登录到项目中的内容,或者在生产中发现某些问题之后。在这些情况下,关系数据库或严格模式往往难以更改,而试图使它们“灵活”往往只会使它们“缓慢”且难以使用或理解。

但是,如果您想在黑暗中管理您的日志并使用激光并让它看起来像您来自太空,那么总有Graylog2使用 MongoDB 作为其整体基础架构的一部分,但在顶部提供了更多功能,例如通用的、可扩展的格式、专用的日志收集服务器、分布式架构和时髦的 UI。

于 2012-05-10T01:29:51.660 回答
24

我见过很多公司都在使用MongoDB来存储应用程序日志。它的模式自由性对于应用程序日志非常灵活,在这种情况下,模式往往会不时改变。此外,它的Capped Collection功能非常有用,因为它会自动清除旧数据以保持数据适合内存。

人们通过普通的 Grouping 或 MapReduce 聚合日志,但速度不是那么快。尤其是 MongoDB 的 MapReduce 只能在单线程中工作,而且它的 JavaScript 执行开销很大。新的聚合框架可以解决这个问题。

当您使用 MongoDB 进行日志记录时,需要注意的是高写入吞吐量导致的锁争用。虽然 MongoDB 的插入默认是即发即弃的风格,但调用大量的 insert() 会导致严重的写锁争用。这可能会影响应用程序性能,并阻止阅读器聚合/过滤存储的日志。

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

Fluentd 加 MongoDB

它们缓冲日志并将数据异步写入其他系统,如 MongoDB / PostgreSQL / 等。写入是通过批处理完成的,因此比直接从应用程序写入要高效得多。此链接描述了如何将日志从 PHP 程序放入 Fluentd。

这里有一些关于 MongoDB + Fluentd 的教程。

MongoDB 的问题是当数据量超过内存大小时它开始变慢。此时,您可以切换到其他解决方案,如Apache HadoopCassandra。如果你有上面提到的分布式日志层,你可以随着你的成长立即切换到另一个解决方案。本教程介绍如何使用 Fluentd 将日志存储到 HDFS。

于 2012-11-17T06:24:24.720 回答
0

您应该指定您的应用程序生成什么样的日志消息。如果您只记录大量简单的日志消息,那么 MongoDB 是一个非常好的选择,因为它的可扩展性非常好。但是如果您需要复杂的身份验证内容或很多层次结构,我会使用传统的 rdbms。

于 2012-05-10T00:02:38.563 回答