NoSQL 是否可以用来做日志中心 ?
咨詢區
ikrain:
請問大家在分布式程序中用 nosql 來做日志中心的經驗?我做了一些研究,發現用 Mongodb 做日志中心是一個非常好的選擇,而且我發現 log4net 對它也是直接集成的,比如: log4mongo-net 。
不知道大家可推薦這種方式?或者有其他一些類似的方式嗎?
回答區
yamen:
其實在可擴展程序中用 mongodb 做日志中心不是一個推薦的做法,嚴格來說日志中心整體解決方案中,它只是解決了存儲這個單一case的問題。
一個強大的日志中心需要解決如下幾個問題:
數據采集
數據轉運
數據清洗
數據存儲
數據查詢
數據可視化
再回頭看看mongodb只解決了第4點,針對這六點,我推薦的相關落地產品為:
Filebeat
它解決了對數據源的采集和轉運,如日志文件。
Logstash
它解決了數據清洗,你可以用正則表達式。
ElasticSearch
它解決了數據的存儲和查詢。
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 Hadoop 或 Cassandra。
點評區
其實在 mongodb 盛行的 14,15 年,曾經確實把 mongodb 當作緩存用,造成的后果就是特別吃內存,那時候還是 mongodb 3.0 之前的內存映射模式,后來被迫寫了一個自動釋放內存的服務。
總結
以上是生活随笔為你收集整理的NoSQL 是否可以用来做日志中心 ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对SQL server、Oracle、M
- 下一篇: PostgreSQL 统计所有数据表各自