3個(gè)開源日志聚合工具
日志聚合系統(tǒng)可以幫助我們進(jìn)行故障排除和其它任務(wù)。以下是三個(gè)主要工具介紹。
指標(biāo)聚合與日志聚合有何不同?日志不能包括指標(biāo)嗎?日志聚合系統(tǒng)不能做與指標(biāo)聚合系統(tǒng)相同的事情嗎?
這些是我經(jīng)常聽到的問(wèn)題。我還看到供應(yīng)商推銷他們的日志聚合系統(tǒng)作為所有可觀察問(wèn)題的解決方案。日志聚合是一個(gè)有價(jià)值的工具,但它通常對(duì)時(shí)間序列數(shù)據(jù)的支持不夠好。
時(shí)間序列的指標(biāo)聚合系統(tǒng)中幾個(gè)有價(jià)值的功能是專門為時(shí)間序列數(shù)據(jù)定制的固定間隔和存儲(chǔ)系統(tǒng)。固定間隔允許用戶不斷地收集實(shí)時(shí)的數(shù)據(jù)結(jié)果。如果要求日志聚合系統(tǒng)以固定間隔收集指標(biāo)數(shù)據(jù),它也可以。但是,它的存儲(chǔ)系統(tǒng)沒有針對(duì)指標(biāo)聚合系統(tǒng)中典型的查詢類型進(jìn)行優(yōu)化。使用日志聚合工具中的存儲(chǔ)系統(tǒng)處理這些查詢將花費(fèi)更多的資源和時(shí)間。
所以,我們知道日志聚合系統(tǒng)可能不適合時(shí)間序列數(shù)據(jù),但是它有什么好處呢?日志聚合系統(tǒng)是收集事件數(shù)據(jù)的好地方。這些無(wú)規(guī)律的活動(dòng)是非常重要的。最好的例子為 web 服務(wù)的訪問(wèn)日志,這些很重要,因?yàn)槲覀兿胫朗裁凑谠L問(wèn)我們的系統(tǒng),什么時(shí)候訪問(wèn)的。另一個(gè)例子是應(yīng)用程序錯(cuò)誤記錄 —— 因?yàn)樗皇钦5牟僮饔涗?,所以在故障排除過(guò)程中可能很有價(jià)值的。
日志記錄的一些規(guī)則:
- 須包含時(shí)間戳
- 須格式化為 JSON
- 不記錄無(wú)關(guān)緊要的事件
- 須記錄所有應(yīng)用程序的錯(cuò)誤
- 可記錄警告錯(cuò)誤
- 可開關(guān)的日志記錄
- 須以可讀的形式記錄信息
- 不在生產(chǎn)環(huán)境中記錄信息
- 不記錄任何無(wú)法閱讀或反饋的內(nèi)容
云的成本
當(dāng)研究日志聚合工具時(shí),云服務(wù)可能看起來(lái)是一個(gè)有吸引力的選擇。然而,這可能會(huì)帶來(lái)巨大的成本。當(dāng)跨數(shù)百或數(shù)千臺(tái)主機(jī)和應(yīng)用程序聚合時(shí),日志數(shù)據(jù)是大量的。在基于云的系統(tǒng)中,數(shù)據(jù)的接收、存儲(chǔ)和檢索是昂貴的。
以一個(gè)真實(shí)的系統(tǒng)來(lái)參考,大約 500 個(gè)節(jié)點(diǎn)和幾百個(gè)應(yīng)用程序的集合每天產(chǎn)生 200GB 的日志數(shù)據(jù)。這個(gè)系統(tǒng)可能還有改進(jìn)的空間,但是在許多 SaaS 產(chǎn)品中,即使將它減少一半,每月也要花費(fèi)將近 10000 美元。而這通常僅保留 30 天,如果你想查看一年一年的趨勢(shì)數(shù)據(jù),就不可能了。
并不是要不使用這些基于云的系統(tǒng),尤其是對(duì)于較小的組織它們可能非常有價(jià)值的。這里的目的是指出可能會(huì)有很大的成本,當(dāng)這些成本很高時(shí),就可能令人非常的沮喪。本文的其余部分將集中討論自托管的開源和商業(yè)解決方案。
工具選擇
ELK
ELK,即 Elasticsearch、Logstash 和 Kibana 簡(jiǎn)稱,是最流行的開源日志聚合工具。它被 Netflix、Facebook、微軟、LinkedIn 和思科使用。這三個(gè)組件都是由 Elastic 開發(fā)和維護(hù)的。Elasticsearch 本質(zhì)上是一個(gè) NoSQL 數(shù)據(jù)庫(kù),以 Lucene 搜索引擎實(shí)現(xiàn)的。Logstash 是一個(gè)日志管道系統(tǒng),可以接收數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù),并將其加載到像 Elasticsearch 這樣的應(yīng)用中。Kibana 是 Elasticsearch 之上的可視化層。
幾年前,引入了 Beats 。Beats 是數(shù)據(jù)采集器。它們簡(jiǎn)化了將數(shù)據(jù)運(yùn)送到 Logstash 的過(guò)程。用戶不需要了解每種日志的正確語(yǔ)法,而是可以安裝一個(gè) Beats 來(lái)正確導(dǎo)出 NGINX 日志或 Envoy 代理日志,以便在 Elasticsearch 中有效地使用它們。
安裝生產(chǎn)環(huán)境級(jí) ELK 套件時(shí),可能會(huì)包括其他幾個(gè)部分,如 Kafka、Redis 和 NGINX。此外,用 Fluentd 替換 Logstash 也很常見,我們將在后面討論。這個(gè)系統(tǒng)操作起來(lái)很復(fù)雜,這在早期導(dǎo)致了很多問(wèn)題和抱怨。目前,這些問(wèn)題基本上已經(jīng)被修復(fù),不過(guò)它仍然是一個(gè)復(fù)雜的系統(tǒng),如果你使用少部分的功能,建議不要使用它了。
也就是說(shuō),有其它可用的服務(wù),所以你不必苦惱于此??梢允褂?Logz.io,但是如果你有很多數(shù)據(jù),它的標(biāo)價(jià)有點(diǎn)高。當(dāng)然,你可能規(guī)模比較小,沒有很多數(shù)據(jù)。如果你買不起 Logz.io,你可以看看 AWS Elasticsearch Service (ES) 。ES 是 Amazon Web Services (AWS) 提供的一項(xiàng)服務(wù),它很容易就可以讓 Elasticsearch 馬上工作起來(lái)。它還擁有使用 Lambda 和 S3 將所有AWS 日志記錄到 ES 的工具。這是一個(gè)更便宜的選擇,但是需要一些管理操作,并有一些功能限制。
ELK 套件的母公司 Elastic 提供 一款更強(qiáng)大的產(chǎn)品,它使用開源核心模式,為分析工具和報(bào)告提供了額外的選項(xiàng)。它也可以在谷歌云平臺(tái)或 AWS 上托管。由于這種工具和托管平臺(tái)的組合提供了比大多數(shù) SaaS 選項(xiàng)更加便宜,這也許是最好的選擇,并且很有用。該系統(tǒng)可以有效地取代或提供 安全信息和事件管理(SIEM)系統(tǒng)的功能。
ELK 套件通過(guò) Kibana 提供了很好的可視化工具,但是它缺少警報(bào)功能。Elastic 在付費(fèi)的 X-Pack 插件中提供了警報(bào)功能,但是在開源系統(tǒng)沒有內(nèi)置任何功能。Yelp 已經(jīng)開發(fā)了一種解決這個(gè)問(wèn)題的方法,ElastAlert,不過(guò)還有其他方式。這個(gè)額外的軟件相當(dāng)健壯,但是它增加了已經(jīng)復(fù)雜的系統(tǒng)的復(fù)雜性。
Graylog
Graylog 最近越來(lái)越受歡迎,但它是在 2010 年由 Lennart Koopmann 創(chuàng)建并開發(fā)的。兩年后,一家公司以同樣的名字誕生了。盡管它的使用者越來(lái)越多,但仍然遠(yuǎn)遠(yuǎn)落后于 ELK 套件。這也意味著它具有較少的社區(qū)開發(fā)特征,但是它可以使用與 ELK 套件相同的 Beats 。由于 Graylog Collector Sidecar 使用 Go 編寫,所以 Graylog 在 Go 社區(qū)贏得了贊譽(yù)。
Graylog 使用 Elasticsearch、MongoDB 和底層的 Graylog Server 。這使得它像 ELK 套件一樣復(fù)雜,也許還要復(fù)雜一些。然而,Graylog 附帶了內(nèi)置于開源版本中的報(bào)警功能,以及其他一些值得注意的功能,如流、消息重寫和地理定位。
流功能可以允許數(shù)據(jù)在被處理時(shí)被實(shí)時(shí)路由到特定的 Stream。使用此功能,用戶可以在單個(gè) Stream 中看到所有數(shù)據(jù)庫(kù)錯(cuò)誤,在另外的 Stream 中看到 web 服務(wù)器錯(cuò)誤。當(dāng)添加新項(xiàng)目或超過(guò)閾值時(shí),甚至可以基于這些 Stream 提供警報(bào)。延遲可能是日志聚合系統(tǒng)中最大的問(wèn)題之一,Stream 消除了 Graylog 中的這一問(wèn)題。一旦日志進(jìn)入,它就可以通過(guò) Stream 路由到其他系統(tǒng),而無(wú)需完全處理好。
消息重寫功能使用開源規(guī)則引擎 Drools 。允許根據(jù)用戶定義的規(guī)則文件評(píng)估所有傳入的消息,從而可以刪除消息(稱為黑名單)、添加或刪除字段或修改消息。
Graylog 最酷的功能或許是它的地理定位功能,它支持在地圖上繪制 IP 地址。這是一個(gè)相當(dāng)常見的功能,在 Kibana 也可以這樣使用,但是它增加了很多價(jià)值 —— 特別是如果你想將它用作 SIEM 系統(tǒng)。地理定位功能在系統(tǒng)的開源版本中提供。
如果你需要的話,Graylog 公司會(huì)提供對(duì)開源版本的收費(fèi)支持。它還為其企業(yè)版提供了一個(gè)開源核心模式,提供存檔、審計(jì)日志記錄和其他支持。其它提供支持或托管服務(wù)的不太多,如果你不需要 Graylog 公司的,你可以托管。
Fluentd
Fluentd 是 Treasure Data 開發(fā)的,CNCF 已經(jīng)將它作為一個(gè)孵化項(xiàng)目。它是用 C 和 Ruby 編寫的,并被 AWS 和 Google Cloud 所推薦。Fluentd 已經(jīng)成為許多系統(tǒng)中 logstach 的常用替代品。它可以作為一個(gè)本地聚合器,收集所有節(jié)點(diǎn)日志并將其發(fā)送到中央存儲(chǔ)系統(tǒng)。它不是日志聚合系統(tǒng)。
它使用一個(gè)強(qiáng)大的插件系統(tǒng),提供不同數(shù)據(jù)源和數(shù)據(jù)輸出的快速和簡(jiǎn)單的集成功能。因?yàn)橛谐^(guò) 500 個(gè)插件可用,所以你的大多數(shù)用例都應(yīng)該包括在內(nèi)。如果沒有,這聽起來(lái)是一個(gè)為開源社區(qū)做出貢獻(xiàn)的機(jī)會(huì)。
Fluentd 由于占用內(nèi)存少(只有幾十兆字節(jié))和高吞吐量特性,是 Kubernetes 環(huán)境中的常見選擇。在像 Kubernetes 這樣的環(huán)境中,每個(gè) pod 都有一個(gè) Fluentd 附屬件 ,內(nèi)存消耗會(huì)隨著每個(gè)新 pod 的創(chuàng)建而線性增加。在這種情況下,使用 Fluentd 將大大降低你的系統(tǒng)利用率。這對(duì)于 Java 開發(fā)的工具來(lái)說(shuō)是一個(gè)常見的問(wèn)題,這些工具旨在為每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)工具,而內(nèi)存開銷并不是主要問(wèn)題。