為什么用到ELK:一般我們需要進(jìn)行日志分析場景:直接在日志文件中 grep,、awk 就可以獲得自己想要的信息,。但在規(guī)模較大的場景中,此方法效率低下,,面臨問題包括日志量太大如何歸檔,、文本搜索太慢怎么辦、如何多維度查詢,。需要集中化的日志管理,,所有服務(wù)器上的日志收集匯總。常見解決思路是建立集中式日志收集系統(tǒng),將所有節(jié)點(diǎn)上的日志統(tǒng)一收集,,管理,,訪問。 一般大型系統(tǒng)是一個分布式部署的架構(gòu),,不同的服務(wù)模塊部署在不同的服務(wù)器上,,問題出現(xiàn)時,大部分情況需要根據(jù)問題暴露的關(guān)鍵信息,,定位到具體的服務(wù)器和服務(wù)模塊,,構(gòu)建一套集中式日志系統(tǒng),可以提高定位問題的效率,。 一個完整的集中式日志系統(tǒng),,需要包含以下幾個主要特點(diǎn):
ELK提供了一整套解決方案,,并且都是開源軟件,,之間互相配合使用,完美銜接,,高效的滿足了很多場合的應(yīng)用,。目前主流的一種日志系統(tǒng)。 ELK簡介:ELK是三個開源軟件的縮寫,,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件,。新增了一個FileBeat,它是一個輕量級的日志收集處理工具(Agent),,F(xiàn)ilebeat占用資源少,,適合于在各個服務(wù)器上搜集日志后傳輸給Logstash,官方也推薦此工具,。 Elasticsearch是個開源分布式搜索引擎,,提供搜集、分析,、存儲數(shù)據(jù)三大功能,。它的特點(diǎn)有:分布式,零配置,,自動發(fā)現(xiàn),,索引自動分片,索引副本機(jī)制,,restful風(fēng)格接口,,多數(shù)據(jù)源,自動搜索負(fù)載等,。 Logstash 主要是用來日志的搜集,、分析,、過濾日志的工具,,支持大量的數(shù)據(jù)獲取方式,。一般工作方式為c/s架構(gòu),client端安裝在需要收集日志的主機(jī)上,,server端負(fù)責(zé)將收到的各節(jié)點(diǎn)日志進(jìn)行過濾,、修改等操作在一并發(fā)往elasticsearch上去。 Kibana 也是一個開源和免費(fèi)的工具,,Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,,可以幫助匯總、分析和搜索重要數(shù)據(jù)日志,。 Filebeat隸屬于Beats,。目前Beats包含四種工具:
官方文檔:Filebeat: https://www./cn/products/beats/filebeat Logstash: Kibana: https://www./cn/products/kibana https://www./guide/en/kibana/5.5/index.html Elasticsearch: elasticsearch中文社區(qū):
ELK架構(gòu)圖:架構(gòu)圖一: 這是最簡單的一種ELK架構(gòu)方式,。優(yōu)點(diǎn)是搭建簡單,,易于上手。缺點(diǎn)是Logstash耗資源較大,,運(yùn)行占用CPU和內(nèi)存高,。另外沒有消息隊列緩存,存在數(shù)據(jù)丟失隱患,。 此架構(gòu)由Logstash分布于各個節(jié)點(diǎn)上搜集相關(guān)日志,、數(shù)據(jù),并經(jīng)過分析,、過濾后發(fā)送給遠(yuǎn)端服務(wù)器上的Elasticsearch進(jìn)行存儲,。Elasticsearch將數(shù)據(jù)以分片的形式壓縮存儲并提供多種API供用戶查詢,操作,。用戶亦可以更直觀的通過配置Kibana Web方便的對日志查詢,,并根據(jù)數(shù)據(jù)生成報表。 架構(gòu)圖二: 此種架構(gòu)引入了消息隊列機(jī)制,,位于各個節(jié)點(diǎn)上的Logstash Agent先將數(shù)據(jù)/日志傳遞給Kafka(或者Redis),,并將隊列中消息或數(shù)據(jù)間接傳遞給Logstash,Logstash過濾,、分析后將數(shù)據(jù)傳遞給Elasticsearch存儲,。最后由Kibana將日志和數(shù)據(jù)呈現(xiàn)給用戶。因?yàn)橐肓薑afka(或者Redis),所以即使遠(yuǎn)端Logstash server因故障停止運(yùn)行,,數(shù)據(jù)將會先被存儲下來,,從而避免數(shù)據(jù)丟失。 架構(gòu)圖三: 此種架構(gòu)將收集端logstash替換為beats,,更靈活,,消耗資源更少,,擴(kuò)展性更強(qiáng)。同時可配置Logstash 和Elasticsearch 集群用于支持大集群系統(tǒng)的運(yùn)維日志數(shù)據(jù)監(jiān)控和查詢,。 Filebeat工作原理:Filebeat由兩個主要組件組成:prospectors 和 harvesters,。這兩個組件協(xié)同工作將文件變動發(fā)送到指定的輸出中。 Harvester(收割機(jī)):負(fù)責(zé)讀取單個文件內(nèi)容,。每個文件會啟動一個Harvester,,每個Harvester會逐行讀取各個文件,并將文件內(nèi)容發(fā)送到制定輸出中,。Harvester負(fù)責(zé)打開和關(guān)閉文件,,意味在Harvester運(yùn)行的時候,文件描述符處于打開狀態(tài),,如果文件在收集中被重命名或者被刪除,,F(xiàn)ilebeat會繼續(xù)讀取此文件。所以在Harvester關(guān)閉之前,,磁盤不會被釋放,。默認(rèn)情況filebeat會保持文件打開的狀態(tài),直到達(dá)到 Prospector(勘測者):負(fù)責(zé)管理Harvester并找到所有讀取源,。
Prospector會找到/apps/logs/*目錄下的所有info.log文件,,并為每個文件啟動一個Harvester。Prospector會檢查每個文件,,看Harvester是否已經(jīng)啟動,,是否需要啟動,,或者文件是否可以忽略。若Harvester關(guān)閉,,只有在文件大小發(fā)生變化的時候Prospector才會執(zhí)行檢查,。只能檢測本地的文件。 Filebeat如何記錄文件狀態(tài): 將文件狀態(tài)記錄在文件中(默認(rèn)在/var/lib/filebeat/registry),。此狀態(tài)可以記住Harvester收集文件的偏移量,。若連接不上輸出設(shè)備,如ES等,,filebeat會記錄發(fā)送前的最后一行,并再可以連接的時候繼續(xù)發(fā)送,。Filebeat在運(yùn)行的時候,,Prospector狀態(tài)會被記錄在內(nèi)存中。Filebeat重啟的時候,,利用registry記錄的狀態(tài)來進(jìn)行重建,,用來還原到重啟之前的狀態(tài)。每個Prospector會為每個找到的文件記錄一個狀態(tài),,對于每個文件,,F(xiàn)ilebeat存儲唯一標(biāo)識符以檢測文件是否先前被收集。 Filebeat如何保證事件至少被輸出一次: Filebeat之所以能保證事件至少被傳遞到配置的輸出一次,,沒有數(shù)據(jù)丟失,,是因?yàn)閒ilebeat將每個事件的傳遞狀態(tài)保存在文件中。在未得到輸出方確認(rèn)時,,filebeat會嘗試一直發(fā)送,,直到得到回應(yīng)。若filebeat在傳輸過程中被關(guān)閉,,則不會再關(guān)閉之前確認(rèn)所有時事件,。任何在filebeat關(guān)閉之前為確認(rèn)的時間,都會在filebeat重啟之后重新發(fā)送,。這可確保至少發(fā)送一次,,但有可能會重復(fù)??赏ㄟ^設(shè)置
Logstash工作原理:Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,,處理,,轉(zhuǎn)發(fā)日志的工具。支持系統(tǒng)日志,,webserver日志,,錯誤日志,,應(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ù)中間處理,,對數(shù)據(jù)進(jìn)行操作。 一些常用的過濾器為: grok:解析任意文本數(shù)據(jù),,Grok 是 Logstash 最重要的插件,。它的主要作用就是將文本格式的字符串,轉(zhuǎn)換成為具體的結(jié)構(gòu)化的數(shù)據(jù),,配合正則表達(dá)式使用,。內(nèi)置120多個解析語法。 官方提供的grok表達(dá)式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns mutate:對字段進(jìn)行轉(zhuǎn)換,。例如對字段進(jìn)行刪除,、替換、修改,、重命名等,。 drop:丟棄一部分events不進(jìn)行處理。 clone:拷貝 event,,這個過程中也可以添加或移除字段,。 geoip:添加地理信息(為前臺kibana圖形化展示使用) Outputs:outputs是logstash處理管道的最末端組件。一個event可以在處理過程中經(jīng)過多重輸出,,但是一旦所有的outputs都執(zhí)行結(jié)束,,這個event也就完成生命周期。 一些常見的outputs為: elasticsearch:可以高效的保存數(shù)據(jù),,并且能夠方便和簡單的進(jìn)行查詢,。 file:將event數(shù)據(jù)保存到文件中。 graphite:將event數(shù)據(jù)發(fā)送到圖形化組件中,,一個很流行的開源存儲圖形化展示的組件,。 Codecs:codecs 是基于數(shù)據(jù)流的過濾器,它可以作為input,,output的一部分配置,。Codecs可以幫助你輕松的分割發(fā)送過來已經(jīng)被序列化的數(shù)據(jù)。 一些常見的codecs: json:使用json格式對數(shù)據(jù)進(jìn)行編碼/解碼,。 multiline:將匯多個事件中數(shù)據(jù)匯總為一個單一的行,。比如:java異常信息和堆棧信息。
|
|
來自: 野崎君noZakiKu > 《待分類》