我应该使用哪个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 。 这些守护进程应该在每个应用程序节点上启动,并从应用程序进程获取日志。
它们缓冲日志,并将数据asynchronous地写入到其他系统,如MongoDB / PostgreSQL /等。写入是通过批量完成的,因此比直接从应用程序写入更有效率。 这个链接描述了如何将日志从PHP程序放到Fluentd中。
- Fluentd:从PHP应用程序导入数据
这里有一些关于MongoDB + Fluentd的教程。
- Fluentd + MongoDB:在10gen博客上有效logging数据的最简单方法
- Fluentd:将Apache日志存储到MongoDB中
MongoDB的问题是当数据量超过内存大小时,它开始变慢。 此时,您可以切换到Apache Hadoop或Cassandra等其他解决scheme。 如果您拥有上述的分布式日志logging层,随着您的成长,您可以立即切换到另一个解决scheme。 本教程介绍如何使用Fluentd将日志存储到HDFS。
- Fluentd:Fluentd + HDFS:即时大数据收集
你应该指定你的应用产生什么样的日志消息。 如果你只logging很多简单的日志消息,MongoDB是一个非常好的select,因为它可以很好地扩展。 但是,如果你需要复杂的authentication或许多层次结构,我会使用传统的rdbms。