ELK掃盲

簡(jiǎn)介

????ELK是Elasticsearch、Logstash、Kibana的簡(jiǎn)稱,這三者是核心套件,但并非全部。后文的四種基本架構(gòu)中將逐一介紹應(yīng)用到的其它套件。

????? Elasticsearch是實(shí)時(shí)全文搜索和分析引擎,提供搜集、分析、存儲(chǔ)數(shù)據(jù)三大功能;是一套開放REST和JAVA API等結(jié)構(gòu)提供高效搜索功能,可擴(kuò)展的分布式系統(tǒng)。它構(gòu)建于Apache Lucene搜索引擎庫(kù)之上。

????? Logstash是一個(gè)用來搜集、分析、過濾日志的工具。它支持幾乎任何類型的日志,包括系統(tǒng)日志、錯(cuò)誤日志和自定義應(yīng)用程序日志。它可以從許多來源接收日志,這些來源包括 syslog、消息傳遞(例如 RabbitMQ)和JMX,它能夠以多種方式輸出數(shù)據(jù),包括電子郵件、websockets和Elasticsearch。

????? Kibana是一個(gè)基于Web的圖形界面,用于搜索、分析和可視化存儲(chǔ)在 Elasticsearch指標(biāo)中的日志數(shù)據(jù)。它利用Elasticsearch的REST接口來檢索數(shù)據(jù),不僅允許用戶創(chuàng)建他們自己的數(shù)據(jù)的定制儀表板視圖,還允許他們以特殊的方式查詢和過濾數(shù)據(jù)。

????? Filebeat隸屬于Beats。目前Beats包含四種工具:

????????? Packetbeat(搜集網(wǎng)絡(luò)流量數(shù)據(jù));

????????? Topbeat(搜集系統(tǒng)、進(jìn)程和文件系統(tǒng)級(jí)別的 CPU 和內(nèi)存使用情況等數(shù)據(jù));

????????? Filebeat(搜集文件數(shù)據(jù));

????????? Winlogbeat(搜集 Windows 事件日志數(shù)據(jù));

官方文檔

????Filebeat:

????????https://www.elastic.co/cn/products/beats/filebeat

????????https://www.elastic.co/guide/en/beats/filebeat/6.2/index.html

? ??Logstash:? ?

? ??????https://www.elastic.co/cn/products/logstash

? ??????https://www.elastic.co/guide/en/logstash/6.2/index.html

? ??Kibana:

? ??????https://www.elastic.co/cn/products/kibana

? ??????https://www.elastic.co/guide/en/kibana/6.2/index.html

????Elasticsearch:

? ??????https://www.elastic.co/cn/products/elasticsearch

? ??????https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index.html

????Elasticsearch中文社區(qū):

????????https://elasticsearch.cn/


Why ELK?

? ??一般我們需要進(jìn)行日志分析場(chǎng)景:直接在日志文件中 grep、awk 就可以獲得自己想要的信息。但在規(guī)模較大的場(chǎng)景中,此方法效率低下,面臨問題包括日志量太大如何歸檔、文本搜索太慢怎么辦、如何多維度查詢。需要集中化的日志管理,所有服務(wù)器上的日志收集匯總。常見解決思路是建立集中式日志收集系統(tǒng),將所有節(jié)點(diǎn)上的日志統(tǒng)一收集,管理,訪問。

? ??一般大型系統(tǒng)是一個(gè)分布式部署的架構(gòu),不同的服務(wù)模塊部署在不同的服務(wù)器上,問題出現(xiàn)時(shí),大部分情況需要根據(jù)問題暴露的關(guān)鍵信息,定位到具體的服務(wù)器和服務(wù)模塊,構(gòu)建一套集中式日志系統(tǒng),可以提高定位問題的效率。

? ??一個(gè)完整的集中式日志系統(tǒng),需要包含以下幾個(gè)主要特點(diǎn):

????????? 收集-能夠采集多種來源的日志數(shù)據(jù);

????????? 傳輸-能夠穩(wěn)定的把日志數(shù)據(jù)傳輸?shù)街醒胂到y(tǒng);

????????? 存儲(chǔ)-如何存儲(chǔ)日志數(shù)據(jù);

????????? 分析-可以支持 UI 分析;

????????? 警告-能夠提供錯(cuò)誤報(bào)告,監(jiān)控機(jī)制;

? ??ELK提供了一整套解決方案,并且都是開源軟件,之間互相配合使用,完美銜接,高效的滿足了很多場(chǎng)合的應(yīng)用。


Filebeat工作原理

? ?? Filebeat由兩個(gè)主要組件組成:prospectors 和 harvesters。這兩個(gè)組件協(xié)同工作將文件變動(dòng)發(fā)送到指定的輸出中。

? ??Harvester

? ??????Harvester負(fù)責(zé)讀取單個(gè)文件內(nèi)容。每個(gè)文件會(huì)啟動(dòng)一個(gè)Harvester,每個(gè)Harvester會(huì)逐行讀取各個(gè)文件,并將文件內(nèi)容發(fā)送到制定輸出中。Harvester負(fù)責(zé)打開和關(guān)閉文件,意味在Harvester運(yùn)行的時(shí)候,文件描述符處于打開狀態(tài),如果文件在收集中被重命名或者被刪除,F(xiàn)ilebeat會(huì)繼續(xù)讀取此文件。所以在Harvester關(guān)閉之前,磁盤不會(huì)被釋放。默認(rèn)情況filebeat會(huì)保持文件打開的狀態(tài),直到達(dá)到close_inactive(如果此選項(xiàng)開啟,filebeat會(huì)在指定時(shí)間內(nèi)將不再更新的文件句柄關(guān)閉,時(shí)間從harvester讀取最后一行的時(shí)間開始計(jì)時(shí)。若文件句柄被關(guān)閉后,文件發(fā)生變化,則會(huì)啟動(dòng)一個(gè)新的harvester。關(guān)閉文件句柄的時(shí)間不取決于文件的修改時(shí)間,若此參數(shù)配置不當(dāng),則可能發(fā)生日志不實(shí)時(shí)的情況,由scan_frequency參數(shù)決定,默認(rèn)10s。Harvester使用內(nèi)部時(shí)間戳來記錄文件最后被收集的時(shí)間。例如:設(shè)置5m,則在Harvester讀取文件的最后一行之后,開始倒計(jì)時(shí)5分鐘,若5分鐘內(nèi)文件無變化,則關(guān)閉文件句柄。默認(rèn)5m)。

? ??Prospector

? ?????? 負(fù)責(zé)管理Harvester并找到所有讀取源。

????Prospector會(huì)找到/apps/logs/*目錄下的所有info.log文件,并為每個(gè)文件啟動(dòng)一個(gè)Harvester。Prospector會(huì)檢查每個(gè)文件,看Harvester是否已經(jīng)啟動(dòng),是否需要啟動(dòng),或者文件是否可以忽略。若Harvester關(guān)閉,只有在文件大小發(fā)生變化的時(shí)候Prospector才會(huì)執(zhí)行檢查。只能檢測(cè)本地的文件。

? ??Filebeat會(huì)將文件狀態(tài)記錄在文件中(默認(rèn)在/var/lib/filebeat/registry)。此狀態(tài)可以記住Harvester收集文件的偏移量。若連接不上輸出設(shè)備,如ES等,filebeat會(huì)記錄發(fā)送前的最后一行,并再可以連接的時(shí)候繼續(xù)發(fā)送。Filebeat在運(yùn)行的時(shí)候,Prospector狀態(tài)會(huì)被記錄在內(nèi)存中。Filebeat重啟的時(shí)候,利用registry記錄的狀態(tài)來進(jìn)行重建,用來還原到重啟之前的狀態(tài)。每個(gè)Prospector會(huì)為每個(gè)找到的文件記錄一個(gè)狀態(tài),對(duì)于每個(gè)文件,F(xiàn)ilebeat存儲(chǔ)唯一標(biāo)識(shí)符以檢測(cè)文件是否先前被收集。

????Filebeat之所以能保證事件至少被傳遞到配置的輸出一次,沒有數(shù)據(jù)丟失,是因?yàn)閒ilebeat將每個(gè)事件的傳遞狀態(tài)保存在文件中。在未得到輸出方確認(rèn)時(shí),filebeat會(huì)嘗試一直發(fā)送,直到得到回應(yīng)。若filebeat在傳輸過程中被關(guān)閉,則不會(huì)再關(guān)閉之前確認(rèn)所有時(shí)事件。任何在filebeat關(guān)閉之前為確認(rèn)的時(shí)間,都會(huì)在filebeat重啟之后重新發(fā)送。這可確保至少發(fā)送一次,但有可能會(huì)重復(fù)。可通過設(shè)置shutdown_timeout 參數(shù)來設(shè)置關(guān)閉之前的等待事件回應(yīng)的時(shí)間(默認(rèn)禁用)。


Logstash工作原理

? ??Logstash事件處理有三個(gè)階段:inputs → filters → outputs。是一個(gè)接收,處理,轉(zhuǎn)發(fā)日志的工具。支持系統(tǒng)日志,webserver日志,錯(cuò)誤日志,應(yīng)用日志,總之包括所有可以拋出來的日志類型。

Input

????輸入數(shù)據(jù)到logstash,一些常用的輸入為:

????????? file:從文件系統(tǒng)的文件中讀取,類似于tial -f命令;

????????? syslog:在514端口上監(jiān)聽系統(tǒng)日志消息,并根據(jù)RFC3164標(biāo)準(zhǔn)進(jìn)行解析;

????????? redis:從redis service中讀取;

????????? beats:從filebeat中讀取;

Filters

????數(shù)據(jù)中間處理,對(duì)數(shù)據(jù)進(jìn)行操作,一些常用的過濾器為:

????????? grok:解析任意文本數(shù)據(jù),Grok 是 Logstash 最重要的插件。它的主要作用就是將文本格式的字符串,轉(zhuǎn)換成為具體的結(jié)構(gòu)化的數(shù)據(jù),配合正則表達(dá)式使用。內(nèi)置120多個(gè)解析語(yǔ)法。

????????官方提供的grok表達(dá)式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

????????grok在線調(diào)試:https://grokdebug.herokuapp.com/

????????? mutate:對(duì)字段進(jìn)行轉(zhuǎn)換。例如對(duì)字段進(jìn)行刪除、替換、修改、重命名等。

????????? drop:丟棄一部分events不進(jìn)行處理。

????????? clone:拷貝 event,這個(gè)過程中也可以添加或移除字段。

????????? geoip:添加地理信息(為前臺(tái)kibana圖形化展示使用)

Outputs

????outputs是logstash處理管道的最末端組件。一個(gè)event可以在處理過程中經(jīng)過多重輸出,但是一旦所有的outputs都執(zhí)行結(jié)束,這個(gè)event也就完成生命周期。一些常見的outputs為:

????????? elasticsearch:可以高效的保存數(shù)據(jù),并且能夠方便和簡(jiǎn)單的進(jìn)行查詢。

????????? file:將event數(shù)據(jù)保存到文件中。

????????? graphite:將event數(shù)據(jù)發(fā)送到圖形化組件中,一個(gè)很流行的開源存儲(chǔ)圖形化展示的組件。

Codecs

????codecs 是基于數(shù)據(jù)流的過濾器,它可以作為input,output的一部分配置。Codecs可以幫助你輕松的分割發(fā)送過來已經(jīng)被序列化的數(shù)據(jù)。一些常見的codecs:

????????? json:使用json格式對(duì)數(shù)據(jù)進(jìn)行編碼/解碼。

????????? multiline:將匯多個(gè)事件中數(shù)據(jù)匯總為一個(gè)單一的行。比如:java異常信息和堆棧信息。


Elasticsearch

????Elasticsearch 是一個(gè)分布式的搜索和分析引擎,可以用于全文檢索、結(jié)構(gòu)化檢索和分析,并能將這三者結(jié)合起來。Elasticsearch 基于 Lucene 開發(fā),現(xiàn)在是使用最廣的開源搜索引擎之一。

? ??基本概念

????????? node:即一個(gè) Elasticsearch 的運(yùn)行實(shí)例,使用多播或單播方式發(fā)現(xiàn) cluster 并加入。

????????? cluster:包含一個(gè)或多個(gè)擁有相同集群名稱的 node,其中包含一個(gè)master node。

????????? index:類比關(guān)系型數(shù)據(jù)庫(kù)里的DB,是一個(gè)邏輯命名空間。

????????? alias:可以給 index 添加零個(gè)或多個(gè)alias,通過 alias 使用index 和根據(jù)index name 訪問index一樣,但是,alias給我們提供了一種切換index的能力,比如重建了index,取名customer_online_v2,這時(shí),有了alias,我要訪問新 index,只需要把 alias 添加到新index 即可,并把a(bǔ)lias從舊的 index 刪除。不用修改代碼。

????????? type:類比關(guān)系數(shù)據(jù)庫(kù)里的Table。其中,一個(gè)index可以定義多個(gè)type,但一般使用習(xí)慣僅配一個(gè)type。

????????? mapping:類比關(guān)系型數(shù)據(jù)庫(kù)中的 schema 概念,mapping 定義了 index 中的 type。mapping 可以顯示的定義,也可以在 document 被索引時(shí)自動(dòng)生成,如果有新的 field,Elasticsearch 會(huì)自動(dòng)推測(cè)出 field 的type并加到mapping中。

????????? document:類比關(guān)系數(shù)據(jù)庫(kù)里的一行記錄(record),document 是 Elasticsearch 里的一個(gè) JSON 對(duì)象,包括零個(gè)或多個(gè)field。

????????? field:類比關(guān)系數(shù)據(jù)庫(kù)里的field,每個(gè)field 都有自己的字段類型。

????????? shard:是一個(gè)Lucene 實(shí)例。Elasticsearch 基于 Lucene,shard 是一個(gè) Lucene 實(shí)例,被 Elasticsearch 自動(dòng)管理。之前提到,index 是一個(gè)邏輯命名空間,shard 是具體的物理概念,建索引、查詢等都是具體的shard在工作。shard 包括primary shard 和 replica shard,寫數(shù)據(jù)時(shí),先寫到primary shard,然后,同步到replica shard,查詢時(shí),primary 和 replica 充當(dāng)相同的作用。replica shard 可以有多份,也可以沒有,replica shard的存在有兩個(gè)作用,一是容災(zāi),如果primary shard 掛了,數(shù)據(jù)也不會(huì)丟失,集群仍然能正常工作;二是提高性能,因?yàn)閞eplica 和 primary shard 都能處理查詢。另外,如上圖右側(cè)紅框所示,shard數(shù)和replica數(shù)都可以設(shè)置,但是,shard 數(shù)只能在建立index 時(shí)設(shè)置,后期不能更改,但是,replica 數(shù)可以隨時(shí)更改。

????ES VS RDB


Kibana

? ??Kibana是一個(gè)開源的分析與可視化平臺(tái),設(shè)計(jì)出來用于和Elasticsearch一起使用的。可以用kibana搜索、查看、交互存放在Elasticsearch索引里的數(shù)據(jù),使用各種不同的圖表、表格、地圖等kibana能夠很輕易地展示高級(jí)數(shù)據(jù)分析與可視化。


ELK 架構(gòu)

? ??第一種ELK架構(gòu),是最簡(jiǎn)單的一種ELK架構(gòu)方式。優(yōu)點(diǎn)是搭建簡(jiǎn)單,易于上手。缺點(diǎn)是Logstash耗資源較大,運(yùn)行占用CPU和內(nèi)存高。另外沒有消息隊(duì)列緩存,存在數(shù)據(jù)丟失隱患。建議供學(xué)習(xí)者和小規(guī)模集群使用。此架構(gòu)首先由Logstash分布于各個(gè)節(jié)點(diǎn)上搜集相關(guān)日志、數(shù)據(jù),并經(jīng)過分析、過濾后發(fā)送給遠(yuǎn)端服務(wù)器上的Elasticsearch進(jìn)行存儲(chǔ)。Elasticsearch將數(shù)據(jù)以分片的形式壓縮存儲(chǔ)并提供多種API供用戶查詢,操作。用戶亦可以更直觀的通過配置Kibana Web Portal方便的對(duì)日志查詢,并根據(jù)數(shù)據(jù)生成報(bào)表。

? ??第二種架構(gòu),引入了消息隊(duì)列機(jī)制,位于各個(gè)節(jié)點(diǎn)上的Logstash Agent先將數(shù)據(jù)/日志傳遞給Kafka(或者Redis),并將隊(duì)列中消息或數(shù)據(jù)間接傳遞給Logstash,Logstash過濾、分析后將數(shù)據(jù)傳遞給Elasticsearch存儲(chǔ)。最后由Kibana將日志和數(shù)據(jù)呈現(xiàn)給用戶。因?yàn)橐肓薑afka(或者Redis),所以即使遠(yuǎn)端Logstash server因故障停止運(yùn)行,數(shù)據(jù)將會(huì)先被存儲(chǔ)下來,從而避免數(shù)據(jù)丟失。這種架構(gòu)適合于較大集群的解決方案,但由于Logstash中心節(jié)點(diǎn)和Elasticsearch的負(fù)荷會(huì)比較重,可將他們配置為集群模式,以分擔(dān)負(fù)荷,這種架構(gòu)的優(yōu)點(diǎn)在于引入了消息隊(duì)列機(jī)制,均衡了網(wǎng)絡(luò)傳輸,從而降低了網(wǎng)絡(luò)閉塞尤其是丟失數(shù)據(jù)的可能性,但依然存在Logstash占用系統(tǒng)資源過多的問題。

????第三種架構(gòu),引入了Logstash-forwarder。首先,Logstash-forwarder將日志數(shù)據(jù)搜集并統(tǒng)一發(fā)送給主節(jié)點(diǎn)上的Logstash,Logstash分析、過濾日志數(shù)據(jù)后發(fā)送至Elasticsearch存儲(chǔ),并由Kibana最終將數(shù)據(jù)呈現(xiàn)給用戶。這種架構(gòu)解決了Logstash在各計(jì)算機(jī)點(diǎn)上占用系統(tǒng)資源較高的問題。經(jīng)測(cè)試得出,相比Logstash,Logstash-forwarder所占用系統(tǒng)CPU和MEM幾乎可以忽略不計(jì)。另外,Logstash-forwarder和Logstash間的通信是通過SSL加密傳輸,起到了安全保障。如果是較大集群,用戶亦可以如結(jié)構(gòu)三那樣配置logstash集群和Elasticsearch集群,引入High Available機(jī)制,提高數(shù)據(jù)傳輸和存儲(chǔ)安全。更主要的配置多個(gè)Elasticsearch服務(wù),有助于搜索和數(shù)據(jù)存儲(chǔ)效率。但在此種架構(gòu)下發(fā)現(xiàn)Logstash-forwarder和Logstash間通信必須由SSL加密傳輸,這樣便有了一定的限制性。

????第四種架構(gòu),將Logstash-forwarder替換為Beats。經(jīng)測(cè)試,Beats滿負(fù)荷狀態(tài)所耗系統(tǒng)資源和Logstash-forwarder相當(dāng),但其擴(kuò)展性和靈活性有很大提高。Beats platform目前包含有Packagebeat、Topbeat和Filebeat三個(gè)產(chǎn)品,均為Apache 2.0 License。同時(shí)用戶可根據(jù)需要進(jìn)行二次開發(fā)。這種架構(gòu)原理基于第三種架構(gòu),但是更靈活,擴(kuò)展性更強(qiáng)。同時(shí)可配置Logstash 和Elasticsearch 集群用于支持大集群系統(tǒng)的運(yùn)維日志數(shù)據(jù)監(jiān)控和查詢。

? ??小結(jié):不管采用上面哪種ELK架構(gòu),都包含了其核心組件,即:Logstash、Elasticsearch 和Kibana。當(dāng)然這三個(gè)組件并非不能被替換,只是就性能和功能性而言,這三個(gè)組件已經(jīng)配合的很完美,是密不可分的。究竟該采用哪種架構(gòu),可根據(jù)現(xiàn)實(shí)情況和架構(gòu)優(yōu)劣而定。


應(yīng)用

????在海量日志系統(tǒng)的運(yùn)維中,以下幾個(gè)方面是必不可少的:

????????? 分布式日志數(shù)據(jù)集中式查詢和管理;

????????? 系統(tǒng)監(jiān)控,包含系統(tǒng)硬件和應(yīng)用各個(gè)組件的監(jiān)控;

????????? 故障排查;

????????? 安全信息和事件管理;

????????? 報(bào)表功能;

????ELK組件各個(gè)功能模塊如下圖所示,它運(yùn)行于分布式系統(tǒng)之上,通過搜集、過濾、傳輸、儲(chǔ)存,對(duì)海量系統(tǒng)和組件日志進(jìn)行集中管理和準(zhǔn)實(shí)時(shí)搜索、分析,使用搜索、監(jiān)控、事件消息和報(bào)表等簡(jiǎn)單易用的功能,幫助運(yùn)維人員進(jìn)行線上業(yè)務(wù)的準(zhǔn)實(shí)時(shí)監(jiān)控、業(yè)務(wù)異常時(shí)及時(shí)定位原因、排除故障、程序研發(fā)時(shí)跟蹤分析Bug、業(yè)務(wù)趨勢(shì)分析、安全與合規(guī)審計(jì),深度挖掘日志的大數(shù)據(jù)價(jià)值。同時(shí)Elasticsearch提供多種API(REST JAVA PYTHON等API)供用戶擴(kuò)展開發(fā),以滿足其不同需求。

????匯總ELK組件在大數(shù)據(jù)運(yùn)維系統(tǒng)中,主要可解決的問題如下:

????????? 日志查詢,問題排查,上線檢查;

????????? 服務(wù)器監(jiān)控,應(yīng)用監(jiān)控,錯(cuò)誤報(bào)警,Bug管理;

????????? 性能分析,用戶行為分析,安全漏洞分析,時(shí)間管理;

? ??小結(jié):ELK組件在大數(shù)據(jù)運(yùn)維中的應(yīng)用是一套必不可少的且方便、易用的開源解決方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容