我们目前正在考虑从记录到文件转向记录到 NoSQL 数据库。我们公司的另一个团队正在开始使用 HBase,但这对于我们想要做的事情来说看起来相当复杂。我一直在研究 MongoDB,但我想要一些建议。
目前,我们在场中拥有数百台服务器,用于不同的应用程序。每当我们听到某个应用程序出现问题时,都会有一个漫长的过程从应用程序操作中检索日志,然后是一个漫长的过程来筛选所有日志以找到问题。我们正在考虑将所有日志记录转移到一个中心位置,并围绕它构建一个 Web UI,以便我们可以更轻松地访问和查询日志。
哪种 NoSQL 数据库最适合存储和查询应用程序日志?
最佳答案
我看到很多公司都在使用 MongoDB 来存储应用程序日志。它的模式自由性对于应用程序日志来说非常灵活,因为应用程序日志的模式往往会不时地改变。另外,它的Capped Collection该功能非常有用,因为它会自动清除旧数据以保持数据适合内存。
人们通过普通的分组或MapReduce来聚合日志,但速度没有那么快。特别是MongoDB的MapReduce只能在单线程中工作,其JavaScript执行开销巨大。 New aggregation framework可以解决这个问题。
当您使用 MongoDB 进行日志记录时,需要担心的是高写入吞吐量导致的锁争用。虽然 MongoDB 的插入默认是即发即忘风格,但调用大量 insert() 会导致严重的写锁争用。这可能会影响应用程序性能,并阻止读者聚合/过滤存储的日志。
一种解决方案可能是使用日志收集器框架,例如 Fluentd , Logstash ,或Flume 。这些守护进程应该在每个应用程序节点上启动,并从应用程序进程中获取日志。
它们缓冲日志并异步将数据写入其他系统,如 MongoDB/PostgreSQL/等。写入是按批量完成的,因此效率更高而不是直接从应用程序编写。此链接描述了如何将日志从 PHP 程序放入 Fluentd。
这里有一些关于 MongoDB + Fluentd 的教程。
- Fluentd + MongoDB: The Easiest Way to Log Your Data Effectively在 10gen 博客上
- Fluentd: Store Apache Logs into MongoDB
MongoDB 的问题是当数据量超过内存大小时它开始变慢。此时,您可以切换到其他解决方案,例如 Apache Hadoop 或 Cassandra。如果您有上面提到的分布式日志记录层,则可以随着您的发展切换到另一个解决方案。本教程介绍如何使用Fluentd将日志存储到HDFS。
关于logging - 从文件日志记录转向数据库日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955131/