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

你有没有经验logging到NoSQL数据库的可伸缩应用程序? 我对NoSQL数据库进行了一些关于日志logging的研究,发现MongoDB似乎是一个不错的select。 另外,我发现log4mongo-net似乎是一个非常简单的选项。

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

我决定修改这个被接受的答案,因为在过去的18个月中,技术水平已经有了显着的提高,而且还有更好的select。

新的答案

MongoDB是可伸缩日志logging解决scheme的子选项。 通常有这样的原因(例如写入性能)。 我想再提出一个,那就是它只能解决一个日志解决scheme中的单个用例。

强大的日志logging解决scheme至less需要涵盖以下几个阶段:

  • 采集
  • 运输
  • 处理
  • 存储
  • search
  • 可视化

作为select的MongoDB只能解决存储用例(尽pipe有点不好)。 一旦完整的分析链,有更合适的解决scheme。

@KazukiOhta提到了几个选项。 我最喜欢的端到端解决scheme包括:

  • Logstash转发器的收集和运输
  • Logstash & Riemann进行处理
  • ElasticSearch存储和查询
  • Kibana3用于可视化

ElasticSearch用于日志数据存储的基本用法是使用当前最好的NoSQL解决scheme来logging和search用例。 Logstash-Forwarder / Logstash / ElasticSearch / Kibana3在ElasticSearch的保护下,这个事实使得更加引人注目。

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

老答案

MongoDB Capped Collections非常受欢迎, 适合于日志logging ,还有“模式less”的额外好处,这通常是一种适合于日志logging的语义。 通常我们只知道我们想把什么logging到项目中,或者在生产中发现了某些问题之后。 关系数据库或严格模式在这些情况下往往难以改变,而试图使其变得“灵活”的做法往往只是使它们变得“缓慢”,难以使用或理解。

但是,如果你想在黑暗中pipe理你的日志,并激光去使它看起来像你来自太空 ,总是有Graylog2使用MongoDB作为其整体基础设施的一部分,但提供了更多的顶部,如一个通用的,可扩展的格式,专用的日志收集服务器,分布式架构和时髦的用户界面。

我看到很多公司正在使用MongoDB来存储应用程序日志。 它的无模式对于应用程序日志非常灵活,在这个日志中,模式往往会随时间变化。 此外, Capped Collectionfunction还是非常有用的,因为它会自动清除旧数据,以便将数据保存到内存中。

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

当您使用MongoDB进行日志logging时,关注的是高写吞吐量造成的锁争用。 尽pipe默认情况下MongoDB的插入方式是“即忘即断”风格,但调用大量insert()会导致严重的写入锁争用。 这可能会影响应用程序性能,并阻止读者聚合/筛选存储的日志。

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

Fluentd加MongoDB

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

  • Fluentd:从PHP应用程序导入数据

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

  • Fluentd + MongoDB:在10gen博客上有效logging数据的最简单方法
  • Fluentd:将Apache日志存储到MongoDB中

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

  • Fluentd:Fluentd + HDFS:即时大数据收集

你应该指定你的应用产生什么样的日志消息。 如果你只logging很多简单的日志消息,MongoDB是一个非常好的select,因为它可以很好地扩展。 但是,如果你需要复杂的authentication或许多层次结构,我会使用传统的rdbms。