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

时间:2012-05-09 23:49:17

标签: .net mongodb logging

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

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

3 个答案:

答案 0 :(得分:54)

我决定修改这个被接受的答案,因为在过去的18个月中,最先进的技术已经发生了很大变化,并且存在更好的替代方案。

新答案

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

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

  • 集合
  • 运输
  • 处理
  • 存储
  • 搜索
  • 可视化

MongoDB作为一种选择只能解决存储用例(尽管有点差)。分析完整的链后,就会有更合适的解决方案。

@KazukiOhta提到了一些选择。我最喜欢的端到端解决方案包括:

ElasticSearch用于日志数据存储的基础使用当前最佳的NoSQL解决方案用于日志记录和搜索用例。 Logstash-Forwarder / Logstash / ElasticSearch / Kibana3属于ElasticSearch的范围,这一事实引发了更为引人注目的争论。

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

旧答案

MongoDB Capped Collections非常受欢迎且suitable for logging,还有一个额外的好处是“架构较少”,这通常是一种适合日志记录的语义。通常我们只知道我们想要很好地记录到项目中,或者在生产中发现某些问题之后。在这些情况下,关系数据库或严格模式往往难以改变,并且试图使它们“灵活”往往只会使它们“慢”且难以使用或理解。

但是如果你想manage your logs in the dark and have lasers going and make it look like you're from space总是Graylog2使用MongoDB作为其整体基础设施的一部分,但提供了更多的东西,如通用的,可扩展的格式,专用的日志收集服务器,分布式架构和时髦的UI。

答案 1 :(得分:20)

我见过很多公司正在使用 MongoDB 来存储应用程序日志。它的模式免费对于应用程序日志非常灵活,而模式往往会随时更改。此外,它的Capped Collection功能非常有用,因为它会自动清除旧数据,以保持数据适合内存。

人们通过普通的分组或MapReduce聚合日志,但速度并不快。特别是MongoDB的MapReduce仅在单个线程中工作,其JavaScript执行开销很大。 New aggregation framework可以解决这个问题。

当您使用MongoDB进行日志记录时,高写入吞吐量会引起锁争用。尽管默认情况下MongoDB的插入是fire-and-forget样式,但调用大量的insert()会导致严重的写入锁争用。这可能会影响应用程序性能,并阻止读者聚合/过滤存储的日志。

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

Fluentd plus MongoDB

他们缓冲日志,异步将数据写入其他系统,如MongoDB / PostgreSQL等。写入由批次完成,因此效率更高而不是直接从应用程序写此链接描述了如何将日志从PHP程序放入Fluentd。

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

MongoDB的问题是,当数据量超过内存大小时,它会开始减慢速度。此时,您可以切换到其他解决方案,例如 Apache Hadoop Cassandra 。如果您有上面提到的分布式日志记录层,您可以在增长时立即切换到另一个解决方案。本教程介绍如何使用Fluentd将日志存储到HDFS。

答案 2 :(得分:0)

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

相关问题