2012-05-09 91 views

回答

47

我決定修改這個被接受的答案,因爲在過去的18個月裏,最先進的技術已經發生了很大變化,並且存在更好的替代方案。

新建答案

MongoDB是一個可擴展的日誌解決方案一分面值的選擇。這通常是有原因的(例如寫入性能)。我想再提出一個,那就是它只能解決日誌解決方案中的單個用例。

強大的日誌解決方案需要包括至少以下階段:

  • 收集
  • 交通運輸
  • 處理
  • 寄存
  • 搜索
  • 可視化

作爲一種選擇,MongoDB只能解決存儲用例(儘管有點不好)。一旦分析完整鏈條,就有更合適的解決方案。

@KazukiOhta提到了幾個選項。我首選的端到端解決方案,這些天涉及:

ŧ他將ElasticSearch用於日誌數據存儲的底層使用目前最佳的NoSQL解決方案用於日誌記錄和搜索用例。 Logstash-Forwarder/Logstash/ElasticSearch/Kibana3屬於ElasticSearch這一事實,這引發了一個更加引人注目的論點。

由於Logstash也可以充當Graphite代理,因此可以爲收集和分析度量(而不僅僅是日誌)的相關問題構建一個非常相似的鏈。

老回答

的MongoDB Capped Collections是非常受歡迎,suitable for logging,用的是「模式少」,這通常是一個語義適合記錄額外的獎勵。通常我們只知道我們想要很好地登錄到項目中,或者在生產中發現某些問題之後。在這些情況下,關係數據庫或嚴格模式往往難以改變,而試圖使它們變得「靈活」的做法往往只是使它們變得「緩慢」並且難以使用或理解。

但是,如果你想manage your logs in the dark and have lasers going and make it look like you're from space總是有Graylog2它使用MongoDB作爲其整體基礎設施的一部分,但提供了更多的頂級,如一個共同的,可擴展格式,專用日誌收集服務器,分佈式架構和時髦的用戶界面。

+0

Graylog2,真棒。謝謝你的提示! – ikrain

+3

就像警告一樣,當每秒寫入超過幾千個事件來記錄集合時,我們遇到了MongoDB的嚴重問題。 MongoDB的寫作表現不佳可能是罪魁禍首。 –

+0

關於Graylog2,請注意:「所有在您數據中心的現有JVM上運行。」如果你錯過了這個,在你看下載包安裝說明的第三段或第四段(「你也必須使用Java 7!」)之前,你什麼也看不到。我總覺得基於Java的項目在銷售自己時忘記提及它們是基於Java的項目是有趣的。只是IMO。 – L0j1k

0

你應該指定你的應用產生什麼樣的日誌消息。如果你只記錄很多簡單的日誌消息,MongoDB是一個非常好的選擇,因爲它可以很好地擴展。但是,如果您需要複雜的認證或許多層次結構,我會使用傳統的rdbms。

17

我見過很多公司正在使用MongoDB來存儲應用程序日誌。它的無模式對於應用程序日誌非常靈活,在這種日誌中架構往往會隨時間變化。此外,它的Capped Collection功能非常有用,因爲它會自動清除舊數據以保持數據適合內存。

人們通過普通的分組或MapReduce聚合日誌,但速度並不快。特別是MongoDB的MapReduce只能在一個線程內工作,並且其JavaScript執行開銷很大。 New aggregation framework可以解決這個問題。

當您使用MongoDB進行日誌記錄時,關注的是鎖定爭用的高寫入吞吐量。儘管默認情況下MongoDB的插入是默認情況下的fire-and-forget樣式,調用大量insert()會導致嚴重的寫入鎖爭用。這可能會影響應用程序的性能,並阻止讀者聚合/過濾存儲的日誌。

的一個解決方案可能使用的日誌收集器框架FluentdLogstash,或Flume。這些守護進程應該在每個應用程序節點上啓動,並從應用程序進程獲取日誌。

Fluentd plus MongoDB

他們緩衝日誌和異步寫出來的數據到其他系統,如MongoDB的/ PostgreSQL的/等寫入由批次完成的,所以這是一個很大比直接寫更有效應用。該鏈接描述瞭如何將日誌從PHP程序放入Fluentd中。

下面是關於MongoDB的+ Fluentd一些教程。

MongoDB的問題是,當數據量超過了內存大小也開始放緩。此時,您可以切換到其他解決方案,如Apache HadoopCassandra。如果您有上述的分佈式日誌記錄層,隨着您的成長,您可以立即切換到另一種解決方案。本教程介紹如何使用Fluentd將日誌存儲到HDFS。

相關問題