您是否有使用NoSQL数据库记录可扩展应用程序的经验?我对使用NoSQL数据库进行日志记录进行了一些研究,发现MongoDB似乎是一个不错的选择。此外,我还发现了一个名为log4mongo-net的工具,它似乎是一个非常简单明了的选项。
您会推荐这种方法吗?还有其他建议吗?
您是否有使用NoSQL数据库记录可扩展应用程序的经验?我对使用NoSQL数据库进行日志记录进行了一些研究,发现MongoDB似乎是一个不错的选择。此外,我还发现了一个名为log4mongo-net的工具,它似乎是一个非常简单明了的选项。
您会推荐这种方法吗?还有其他建议吗?
我决定修改这个被接受的答案,因为过去18个月的技术水平已经显著提高,并且有更好的替代方案存在。
新回答
MongoDB不是一个可扩展的日志记录解决方案的上乘选择。常见原因包括(例如负载下的写入性能)。我想再提出一个原因,即它仅解决了日志记录解决方案中的一个用例。
一个强大的日志记录解决方案至少需要涵盖以下阶段:
选择MongoDB只解决了存储用例(尽管可能不太好)。一旦分析完整个链路,就会发现有更适合的解决方案。
@KazukiOhta提到了一些选项。我当前更喜欢的端对端解决方案包括:
使用ElasticSearch作为日志数据存储的基础使用了当前最好的NoSQL解决方案,用于日志记录和搜索用例。Logstash-Forwarder / Logstash / ElasticSearch / Kibana3被包含在ElasticSearch的伞下,这使得它们更有说服力。
由于Logstash也可以充当Graphite代理,因此可以针对相关问题建立非常相似的链路,用于收集和分析指标(而不仅仅是日志)。
旧回答
MongoDB Capped Collections非常受欢迎,适合记录日志,并具有“无模式”的额外优点,通常与记录日志相符。通常情况下,我们只知道我们想记录什么,或在项目中发现某些问题后才会记录。在这些情况下,关系数据库或严格的模式往往很难更改,而试图使它们“灵活”就往往使它们“缓慢”、难以使用或理解。
但是,如果您想在黑暗中管理您的日志,让激光飞舞,看起来像来自太空,那么总会有Graylog2,它使用MongoDB作为其整体基础架构的一部分,但提供
我见过很多公司使用 MongoDB 存储应用程序日志。其无模式设计对于应用程序日志非常灵活,因为模式往往会随着时间的推移而变化。此外,它的 Capped Collection 功能非常实用,因为它会自动清除旧数据以使数据适应内存。
人们通过普通分组或MapReduce来聚合日志,但速度不够快。特别是 MongoDB 的 MapReduce 只在单个线程内工作,其 JavaScript 执行开销巨大。 新聚合框架 可以解决这个问题。
当您将 MongoDB 用于日志记录时,关注点是高写入吞吐量引起的锁争用。虽然 MongoDB 的插入默认是“发射并忘记”样式,但调用大量 insert() 会导致严重的写锁争用。这可能会影响应用程序性能,并防止读取器聚合 / 过滤存储的日志。
一个解决方案可能是使用日志收集器框架,例如Fluentd、Logstash或Flume。这些守护程序应该在每个应用程序节点上启动,并从应用程序进程中获取日志。
它们缓冲日志并异步地将数据写出到其他系统,如 MongoDB / PostgreSQL / 等。写入是通过批次完成的,因此比直接从应用程序编写更有效率。此链接描述了如何从 PHP 程序将日志放入 Fluentd 中。
以下是有关MongoDB + Fluentd的一些教程。
MongoDB的问题是当数据量超过内存大小时,它会开始变慢。此时,您可以切换到其他解决方案,例如Apache Hadoop或Cassandra。如果您拥有上述分布式日志记录层,则可以随着增长即时切换到另一种解决方案。本教程描述了如何使用Fluentd将日志存储到HDFS。
你应该指明你的应用程序产生什么样的日志信息。如果你只是记录了许多简单的日志信息,MongoDB是一个非常好的选择,因为它的扩展性非常好。但如果你需要复杂的身份验证或大量的层次结构,我建议使用传统的关系型数据库。