您好,登錄后才能下訂單哦!
這篇文章給大家介紹如何讀懂開源日志管理方案ELK和EFK的區(qū)別,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
前言
主流的 ELK (Elasticsearch, Logstash, Kibana) 目前已經(jīng)轉(zhuǎn)變?yōu)?EFK (Elasticsearch, Filebeat or Fluentd, Kibana) 比較重,對(duì)于容器云的日志方案業(yè)內(nèi)也普遍推薦采用 Fluentd,我們一起來看下從 ELK 到 EFK 發(fā)生了哪些變化,與此同時(shí)我也推薦大家了解下 Grafana Loki
ELK 和 EFK 概述
隨著現(xiàn)在各種軟件系統(tǒng)的復(fù)雜度越來越高,特別是部署到云上之后,再想登錄各個(gè)節(jié)點(diǎn)上查看各個(gè)模塊的 log,基本是不可行了。因?yàn)椴粌H效率低下,而且有時(shí)由于安全性,不可能讓工程師直接訪問各個(gè)物理節(jié)點(diǎn)。而且現(xiàn)在大規(guī)模的軟件系統(tǒng)基本都采用集群的部署方式,意味著對(duì)每個(gè) service,會(huì)啟動(dòng)多個(gè)完全一樣的 POD 對(duì)外提供服務(wù),每個(gè) container 都會(huì)產(chǎn)生自己的 log,僅從產(chǎn)生的 log 來看,你根本不知道是哪個(gè) POD 產(chǎn)生的,這樣對(duì)查看分布式的日志更加困難。
所以在云時(shí)代,需要一個(gè)收集并分析 log 的解決方案。首先需要將分布在各個(gè)角落的 log 收集到一個(gè)集中的地方,方便查看。收集了之后,還可以進(jìn)行各種統(tǒng)計(jì)分析,甚至用流行的大數(shù)據(jù)或 maching learning 的方法進(jìn)行分析。當(dāng)然,對(duì)于傳統(tǒng)的軟件部署方式,也需要這樣的 log 的解決方案,不過本文主要從云的角度來介紹。
ELK 就是這樣的解決方案,而且基本就是事實(shí)上的標(biāo)準(zhǔn)。ELK 是三個(gè)開源項(xiàng)目的首字母縮寫,如下:
E: Elasticsearch L: Logstash K: Kibana
Logstash 的主要作用是收集分布在各處的 log 并進(jìn)行處理;Elasticsearch 則是一個(gè)集中存儲(chǔ) log 的地方,更重要的是它是一個(gè)全文檢索以及分析的引擎,它能讓用戶以近乎實(shí)時(shí)的方式來查看、分析海量的數(shù)據(jù)。Kibana 則是為 Elasticsearch 開發(fā)的前端 GUI,讓用戶可以很方便的以圖形化的接口查詢 Elasticsearch 中存儲(chǔ)的數(shù)據(jù),同時(shí)也提供了各種分析的模塊,比如構(gòu)建 dashboard 的功能。
我個(gè)人認(rèn)為將 ELK 中的 L 理解成 Logging Agent 更合適。Elasticsearch 和 Kibana 基本就是存儲(chǔ)、檢索和分析 log 的標(biāo)準(zhǔn)方案,而 Logstash 則并不是唯一的收集 log 的方案,F(xiàn)luentd 和 Filebeats 也能用于收集 log。所以現(xiàn)在網(wǎng)上有 ELK,EFK 之類的縮寫。
一般采用的架構(gòu)如下圖所示。通常一個(gè)小型的 cluster 有三個(gè)節(jié)點(diǎn),在這三個(gè)節(jié)點(diǎn)上可能會(huì)運(yùn)行幾十個(gè)甚至上百個(gè)容器。而我們只需要在每個(gè)節(jié)點(diǎn)上啟動(dòng)一個(gè) logging agent 的實(shí)例(在 kubernetes 中就是 DaemonSet 的概念)即可。
Filebeats、Logstash、Fluentd 三者的區(qū)別和聯(lián)系
這里有必要對(duì) Filebeats、Logstash 和 Fluentd 三者之間的聯(lián)系和區(qū)別做一個(gè)簡(jiǎn)要的說明。Filebeats 是一個(gè)輕量級(jí)的收集本地 log 數(shù)據(jù)的方案,官方對(duì) Filebeats 的說明如下??梢钥闯?Filebeats 功能比較單一,它僅僅只能收集本地的 log,但并不能對(duì)收集到的 Log 做什么處理,所以通常 Filebeats 通常需要將收集到的 log 發(fā)送到 Logstash 做進(jìn)一步的處理。
Filebeat is a log data shipper for local files. Installed as an agent on your servers, Filebeat monitors the log directories or specific log files, tails the files, and forwards them either to Elasticsearch or Logstash for indexing
Logstash 和 Fluentd 都具有收集并處理 log 的能力,網(wǎng)上有很多關(guān)于二者的對(duì)比,提供一個(gè)寫得比較好的文章鏈接如下。功能上二者旗鼓相當(dāng),但 Logstash 消耗更多的 memory,對(duì)此 Logstash 的解決方案是使用 Filebeats 從各個(gè)葉子節(jié)點(diǎn)上收集 log,當(dāng)然 Fluentd 也有對(duì)應(yīng)的 Fluent Bit。
https://logz.io/blog/fluentd-Logstash/
另外一個(gè)重要的區(qū)別是 Fluentd 抽象性做得更好,對(duì)用戶屏蔽了底層細(xì)節(jié)的繁瑣。作者的原話如下:
Fluentd’s approach is more declarative whereas Logstash’s method is procedural. For programmers trained in procedural programming, Logstash’s configuration can be easier to get started. On the other hand, Fluentd’s tag-based routing allows complex routing to be expressed cleanly.
雖然作者說是要中立的對(duì)二者(Logstash 和 Fluentd)進(jìn)行對(duì)比,但實(shí)際上偏向性很明顯了:)。本文也主要基于 Fluentd 進(jìn)行介紹,不過總體思路都是相通的。
額外說一點(diǎn),F(xiàn)ilebeats、Logstash、Elasticsearch 和 Kibana 是屬于同一家公司的開源項(xiàng)目,官方文檔如下:
https://www.elastic.co/guide/index.html
Fluentd 則是另一家公司的開源項(xiàng)目,官方文檔如下:
https://docs.fluentd.org
關(guān)于 ELK
ELK 簡(jiǎn)介
ELK 是 Elastic 公司提供的一套完整的日志收集以及展示的解決方案,是三個(gè)產(chǎn)品的首字母縮寫,分別是 Elasticsearch、Logstash 和 Kibana。
Elasticsearch 是實(shí)時(shí)全文搜索和分析引擎,提供搜集、分析、存儲(chǔ)數(shù)據(jù)三大功能
Logstash 是一個(gè)用來搜集、分析、過濾日志的工具
Kibana 是一個(gè)基于 Web 的圖形界面,用于搜索、分析和可視化存儲(chǔ)在 Elasticsearch 指標(biāo)中的日志數(shù)據(jù)
ELK 日志處理流程
上圖展示了在 Docker 環(huán)境下,一個(gè)典型的 ELK 方案下的日志收集處理流程:
Logstash 從各個(gè) Docker 容器中提取日志信息
Logstash 將日志轉(zhuǎn)發(fā)到 Elasticsearch 進(jìn)行索引和保存
Kibana 負(fù)責(zé)分析和可視化日志信息
由于 Logstash 在數(shù)據(jù)收集上并不出色,而且作為 Agent,其性能并不達(dá)標(biāo)?;诖?,Elastic 發(fā)布了 beats 系列輕量級(jí)采集組件。
這里我們要實(shí)踐的 Beat 組件是 Filebeat,F(xiàn)ilebeat 是構(gòu)建于 beats 之上的,應(yīng)用于日志收集場(chǎng)景的實(shí)現(xiàn),用來替代 Logstash Forwarder 的下一代 Logstash 收集器,是為了更快速穩(wěn)定輕量低耗地進(jìn)行收集工作,它可以很方便地與 Logstash 還有直接與 Elasticsearch 進(jìn)行對(duì)接。
本次實(shí)驗(yàn)直接使用 Filebeat 作為 Agent,它會(huì)收集我們?cè)诘谝黄禗ocker logs & logging driver》中介紹的 json-file 的 log 文件中的記錄變動(dòng),并直接將日志發(fā)給 Elasticsearch 進(jìn)行索引和保存,其處理流程變?yōu)橄聢D,你也可以認(rèn)為它可以稱作 EFK。
ELK 套件的安裝
本次實(shí)驗(yàn)我們采用 Docker 方式部署一個(gè)最小規(guī)模的 ELK 運(yùn)行環(huán)境,當(dāng)然,實(shí)際環(huán)境中我們或許需要考慮高可用和負(fù)載均衡。
首先拉取一下 sebp/elk 這個(gè)集成鏡像,這里選擇的 tag 版本是 latest:
docker pull sebp/elk:latest
注:由于其包含了整個(gè) ELK 方案,所以需要耐心等待一會(huì)。
通過以下命令使用 sebp/elk 這個(gè)集成鏡像啟動(dòng)運(yùn)行 ELK:
docker run -it -d --name elk \ -p 5601:5601 \ -p 9200:9200 \ -p 5044:5044 \ sebp/elk:latest
運(yùn)行完成之后就可以先訪問一下 http://192.168.4.31:5601 看看 Kibana 的效果:
當(dāng)然,目前沒有任何可以顯示的 ES 的索引和數(shù)據(jù),再訪問一下 http://192.168.4.31:9200 看看 Elasticsearch 的 API 接口是否可用:
如果啟動(dòng)過程中發(fā)現(xiàn)一些錯(cuò)誤,導(dǎo)致 ELK 容器無法啟動(dòng),可以參考《ElasticSearch 啟動(dòng)常見錯(cuò)誤》 一文。如果你的主機(jī)內(nèi)存低于 4G,建議增加配置設(shè)置 ES 內(nèi)存使用大小,以免啟動(dòng)不了。例如下面增加的配置,限制 ES 內(nèi)存使用最大為 1G:
docker run -it -d --name elk \ -p 5601:5601 \ -p 9200:9200 \ -p 5044:5044 \ -e ES_MIN_MEM=512m \ -e ES_MAX_MEM=1024m \ sebp/elk:latest
若啟動(dòng)容器的時(shí)候提示 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 請(qǐng)參考
# 編輯 sysctl.con vi /etc/sysctl.conf # 添加下面配置 vm.max_map_count=655360 # 然后執(zhí)行命令 sysctl -p
Filebeat 配置
安裝 Filebeat
Download Filebeat
這里我們通過 rpm 的方式下載 Filebeat,注意這里下載和我們 ELK 對(duì)應(yīng)的版本(ELK 是 7.6.1,這里也是下載 7.6.1,避免出現(xiàn)錯(cuò)誤):
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpm rpm -ivh filebeat-7.6.1-x86_64.rpm
配置 Filebeat
這里我們需要告訴 Filebeat 要監(jiān)控哪些日志文件 及 將日志發(fā)送到哪里去,因此我們需要修改一下 Filebeat 的配置:
nano /etc/filebeat/filebeat.yml
要修改的內(nèi)容為:
(1)監(jiān)控哪些日志
filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /var/lib/docker/containers/*/*.log
這里指定 paths:/var/lib/docker/containers/*/*.log,另外需要注意的是將 enabled 設(shè)為 true。
(2)將日志發(fā)到哪里
#-------------------------- Elasticsearch output ------------------------------ output.elasticsearch: # Array of hosts to connect to. hosts: ["192.168.4.31:9200"] # Optional protocol and basic auth credentials. #protocol: "https" #username: "elastic" #password: "changeme"
這里指定直接發(fā)送到 Elasticsearch,配置一下 ES 的接口地址即可。
注意:如果要發(fā)到 Logstash,請(qǐng)使用后面這段配置,將其取消注釋進(jìn)行相關(guān)配置即可:
#----------------------------- Logstash output -------------------------------- #output.Logstash: # The Logstash hosts #hosts: ["localhost:9200"] # Optional SSL. By default is off. # List of root certificates for HTTPS server verifications #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] # Certificate for SSL client authentication #ssl.certificate: "/etc/pki/client/cert.pem" # Client Certificate Key #ssl.key: "/etc/pki/client/cert.key"
啟動(dòng) Filebeat
由于 Filebeat 在安裝時(shí)已經(jīng)注冊(cè)為 systemd 的服務(wù),所以只需要直接啟動(dòng)即可:
systemctl start filebeat
設(shè)置開機(jī)啟動(dòng):
systemctl enable filebeat
檢查 Filebeat 啟動(dòng)狀態(tài):
systemctl status filebeat
上述操作總結(jié)為腳本為:
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.6.1-x86_64.rpm rpm -ivh filebeat-7.6.1-x86_64.rpm echo "please input elk host_ip" read host_ip sed -i "s/ enabled: false/ enabled: true/g" /etc/filebeat/filebeat.yml sed -i "s/\/var\/log\/\*.log/\/var\/lib\/docker\/containers\/\*\/\*.log/g" /etc/filebeat/filebeat.yml sed -i "s/localhost:9200/${host_ip}:9200/g" /etc/filebeat/filebeat.yml systemctl start filebeat systemctl enable filebeat systemctl status filebeat
Kibana 配置
接下來我們就要告訴 Kibana,要查詢和分析 Elasticsearch 中的哪些日志,因此需要配置一個(gè) Index Pattern。從 Filebeat 中我們知道 Index 是 filebeat-timestamp 這種格式,因此這里我們定義 Index Pattern 為 filebeat-*
點(diǎn)擊 Next Step,這里我們選擇 Time Filter field name 為 @timestamp:
單擊 Create index pattern 按鈕,即可完成配置。
這時(shí)我們單擊 Kibana 左側(cè)的 Discover 菜單,即可看到容器的日志信息啦:
仔細(xì)看看細(xì)節(jié),我們關(guān)注一下 message 字段:
可以看到,我們重點(diǎn)要關(guān)注的是 message,因此我們也可以篩選一下只看這個(gè)字段的信息:
這里只是樸素的展示了導(dǎo)入 ELK 的日志信息,實(shí)際上 ELK 還有很多很豐富的玩法,例如分析聚合、炫酷 Dashboard 等等。筆者在這里也是初步使用,就介紹到這里啦。
Fluentd 引入
關(guān)于 Fluentd
前面我們采用的是 Filebeat 收集 Docker 的日志信息,基于 Docker 默認(rèn)的 json-file 這個(gè) logging driver,這里我們改用 Fluentd 這個(gè)開源項(xiàng)目來替換 json-file 收集容器的日志。
Fluentd 是一個(gè)開源的數(shù)據(jù)收集器,專為處理數(shù)據(jù)流設(shè)計(jì),使用 JSON 作為數(shù)據(jù)格式。它采用了插件式的架構(gòu),具有高可擴(kuò)展性高可用性,同時(shí)還實(shí)現(xiàn)了高可靠的信息轉(zhuǎn)發(fā)。Fluentd 也是云原生基金會(huì) (CNCF) 的成員項(xiàng)目之一,遵循 Apache 2 License 協(xié)議,其 GitHub 地址為:https://github.com/fluent/fluentd/。Fluentd 與 Logstash 相比,比占用內(nèi)存更少、社區(qū)更活躍,兩者的對(duì)比可以參考這篇文章《Fluentd vs Logstash》。
因此,整個(gè)日志收集與處理流程變?yōu)橄聢D,我們用 Filebeat 將 Fluentd 收集到的日志轉(zhuǎn)發(fā)給 Elasticsearch。
當(dāng)然,我們也可以使用 Fluentd 的插件(fluent-plugin-elasticsearch)直接將日志發(fā)送給 Elasticsearch,可以根據(jù)自己的需要替換掉 Filebeat,從而形成 Fluentd => Elasticsearch => Kibana 的架構(gòu),也稱作 EFK。
運(yùn)行 Fluentd
這里我們通過容器來運(yùn)行一個(gè) Fluentd 采集器:
docker run -it -d --name fluentd \ -p 24224:24224 \ -p 24224:24224/udp \ -v /etc/fluentd/log:/fluentd/log \ fluent/fluentd:latest
默認(rèn) Fluentd 會(huì)使用 24224 端口,其日志會(huì)收集在我們映射的路徑下。
此外,我們還需要修改 Filebeat 的配置文件,將 / etc/fluentd/log 加入監(jiān)控目錄下:
#=========================== Filebeat inputs ============================= filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /etc/fluentd/log/*.log
添加監(jiān)控配置之后,需要重新 restart 一下 filebeat:
systemctl restart filebeat
運(yùn)行測(cè)試容器
為了驗(yàn)證效果,這里我們 Run 兩個(gè)容器,并分別制定其 log-dirver 為 fluentd:
docker run -d \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag="test-docker-A" \ busybox sh -c 'while true; do echo "This is a log message from container A"; sleep 10; done;' docker run -d \ --log-driver=fluentd \ --log-opt fluentd-address=localhost:24224 \ --log-opt tag="test-docker-B" \ busybox sh -c 'while true; do echo "This is a log message from container B"; sleep 10; done;'
這里通過指定容器的 log-driver,以及為每個(gè)容器設(shè)立了 tag,方便我們后面驗(yàn)證查看日志。
驗(yàn)證 EFK 效果
這時(shí)再次進(jìn)入 Kibana 中查看日志信息,便可以通過剛剛設(shè)置的 tag 信息篩選到剛剛添加的容器的日志信息了:
模擬日志生成壓力測(cè)試工具
https://github.com/elastic/rally
https://pypi.org/project/log-generator/
https://github.com/mingrammer/flog
本文從 ELK 的基本組成入手,介紹了 ELK 的基本處理流程,以及從 0 開始搭建了一個(gè) ELK 環(huán)境,演示了基于 Filebeat 收集容器日志信息的案例。然后,通過引入 Fluentd 這個(gè)開源數(shù)據(jù)收集器,演示了如何基于 EFK 的日志收集案例。
關(guān)于如何讀懂開源日志管理方案ELK和EFK的區(qū)別就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。