NoSQL 是否可以用来做日志中心 ?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NoSQL 是否可以用来做日志中心 ?相关的知识,希望对你有一定的参考价值。

咨询区

  • ikrain

请问大家在分布式程序中用 nosql 来做日志中心的经验?我做了一些研究,发现用 Mongodb 做日志中心是一个非常好的选择,而且我发现 log4net 对它也是直接集成的,比如: log4mongo-net

不知道大家可推荐这种方式?或者有其他一些类似的方式吗?

回答区

  • yamen

其实在可扩展程序中用 mongodb 做日志中心不是一个推荐的做法,严格来说日志中心整体解决方案中,它只是解决了存储这个单一case的问题。

一个强大的日志中心需要解决如下几个问题:

  1. 数据采集

  2. 数据转运

  3. 数据清洗

  4. 数据存储

  5. 数据查询

  6. 数据可视化

再回头看看mongodb只解决了第4点,针对这六点,我推荐的相关落地产品为:

  1. Filebeat

它解决了对数据源的采集和转运,如日志文件。

  1. Logstash

它解决了数据清洗,你可以用正则表达式。

  1. ElasticSearch

它解决了数据的存储和查询。

  1. Kibana

它解决了数据的可视化问题

值得一提的是,ElasticSearch 为了记录日志底层就用了当前最流行的nosql方式,这整体就是 Elastic 家族给出的解决方案。

  • Kazuki Ohta

我见过很多公司都用 Mongodb 来记录应用程序的日志,毕竟它的 无模式 真的是太吸引人了,而且 mongodb 还提供了 Capped Collection 特性,它的固定大小模式可以周期性的用新数据替换老数据。

为了能够对日志进行精细化分析,一般大家都会采用 Grouping 和 MapReduce,但它不是很快,尤其是 js 的单线程引擎决定了 MapReduce 只能跑在单线程上,所以这种开销是巨大的。

当用 mongodb 记录日志时,还有一个不可避免的问题就是 锁竞争,毕竟日志场景是海量写,即使 mongodb 是一种 fire-and-forget (发送即丢弃) 的模式,也会造成大量的写锁竞争,从而影响应用程序的性能并在一定程序上影响 aggregate 和 filter 这些查询操作。

一个通用做法是采用 日志采集组件,比如:Fluentd,Logstash,Flume,这些组件需要部署在每一个应用程序节点,并从摄取应用程序产生的日志,参考如下图:

这些框架会缓冲日志并将日志批量写入到比如 Mongodb,PostgreSQL 等数据库中,这种做法相比直写的方式要高效的多。

Mongodb 还有一个问题在于当数据卷达到内存上限时,它的性能会急剧下降,可替换方案就是 Apache HadoopCassandra

点评区

其实在 mongodb 盛行的 14,15 年,曾经确实把 mongodb 当作缓存用,造成的后果就是特别吃内存,那时候还是 mongodb 3.0 之前的内存映射模式,后来被迫写了一个自动释放内存的服务。

以上是关于NoSQL 是否可以用来做日志中心 ?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以仅将错误日志发送到事件中心?

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Filebeat +Redis+ELK处理Nginx日志系统

常用python日期日志获取内容循环的代码片段

是否可以将Azure信息保护活动日志流式传输到事件中心?

广告业务系统 之 数据桥梁 —— “日志中心-曝光数据流转结算”