ELK原理詳解


1.ELK介紹

  ELK是三個開源軟件的縮寫,分別為:Elasticsearch、Logstash、Kibana,后面還有一個fileBeat,它是一個輕量級的日志收集處理(Agent),FileBeat占用的資源很少,適合在各個服務器上收集日志后傳輸給Logstash。

  Elasticsearch是基於Lucene全文檢索引擎框架,基於Java語言編寫,是一個開源的分布式收縮引擎,提供收集、分析、存儲數據三大功能,特點是:分布式、零配置、自動發現、索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。

  Logstash是主要用來對日志進行收集、分析、過濾的,支持大量的數據獲取方式。一般工作方式是C/S架構,client端安裝在需要收集日志的主機上,server端負責將收到的各個節點日志進行過濾、修改操作在一並發往elasticsearchss上。ELK官網:https://www.elastic.co/

  Kibana也是開源免費的工具,Kibana可以給Elasticsearch和Logstash提供很好的web界面,可以幫助匯總、分析和搜索重要的數據日志。

  FileBeat屬於Beats,是一個輕量型的日志采集器,早期的ELK架構中使用的是Logstash進行收集、解析並且過濾日志,但是Logstash對CPU、內存、IO等資源的消耗過高,相比於Logstash,Beats所占用的CPU和內存幾乎可以忽略不記。目前Beats包括:Packagebeat(搜索網絡流量數據)、Topbeat(搜集系統、進程和文件系統級別的CPU和內存使用情況等數據)、Filebeat(搜集文件數據)、Winlogbeat(搜集Windows事件日志數據)。

  Logstash和Elasticsearch是用JAVA語言進行編寫的,而Kibana使用的是node.js框架,在配置ELK環境時要保證系統又JAV JDK開發庫。

2. 為什么要用ELK

  在規模較大也就是日志量多而復雜的場景中,如果直接在日志文件中grep、awk獲得自己想要的信息,那么效率就會很低下,而且也面臨着包括日志量太大如何進行歸檔、文本搜索太慢、如何多維度進行查詢等問題。這時候需要集中化的日志管理,所有服務器上的日志搜集進行匯總。常見的解決思路是建立集中式的日志搜集系統,將所有的節點上的日志進行統一的收集、管理、訪問。大型的系統通常都是分布式部署的架構,不同的服務模塊部署在不同的機器上,如果問題出現,那么大部分情況需要根據問題暴漏的關鍵信息,定位到具體的服務器和服務的模塊,構建一套集中式的日志系統,可以提高定位問題的效率。一個完整的集中式日志系統,需要包括以下幾個主要的特點:

  • 收集:能夠采集多種來源的日志數據
  • 傳輸:能夠穩定的把日志數據傳輸到中央系統
  • 存儲:如何存儲日志數據
  • 分析:可以至此UI分析
  • 警告:能夠提供錯誤報告,監控機制

ELK可以提供一整套的解決方案,並且都是開源的軟件,之間相互配合使用,完美銜接,高效的滿足了很多場合的使用。也是當前主流的一種日志系統。

3.ELK架構圖

3.1 架構一

  如果沒有使用filebeat,logstash搜集日志,進行過濾處理,並將 數據發送到elasticsearch的架構圖如下:

   這是最簡單的一種ELK架構方式,優點時搭建簡單,容易上手,缺點是Logstash消耗的資源比較大,運行占用的CPU和內存很高,另外也沒有消息隊列緩存,存在數據丟失的隱患。此架構由Logstash分布於各個節點上搜集相關日志、數據,並經過分析、過濾后發送給遠端服務器上的Elasticsearch進行存儲。Elasticsearch將數據以分片的形式壓縮存儲並提供多種API供用戶查詢,操作。用戶亦可以更直觀的通過配置Kibana Web方便的對日志查詢,並根據數據生成報表。

3.2 架構二

   這種架構加入了消息隊列機制,位於各個節點上的Logstash Agent首先將數據/日志傳輸給Kafka(或者Redis),並將隊列中消息或數據間接傳遞給Logstash,Logstash過濾分析之后將數據傳輸給Elasticsearch進行存儲,最后再由Kibana將日志和數據呈現給用戶,而正是因為引入了Kafka(或者redis),才使得遠端的Logstash server因為故障停止運行之后,數據會先被存儲下來,從而避免數據的丟失。

3.3架構三

   這種架構將收集日志端換成了beats,這樣會更靈活,消耗資源會更少,擴展性也會更強。同時也可以配置Logstash和Elasticsearch集群用於支持大集群系統的運維日志數據監控和查詢。

4.FileBeat的工作原理

  filebeat由兩個主要組件組成:prospectors和harvesters。這兩個組件協同工作將文件變動發送到指定的輸出中。

  Haverster(收割機):負責讀取單個文件的內容。每個文件會啟動一個Haverster,每個Haverster會逐行讀取各個文件,並將文件內容發送到制定的輸出中。Haverster負責打開和關閉文件,意味着Haverster運行的時候,文件描述符處於打開的狀態,如果文件在收集中被重命名或者是被刪除,Filebeat會繼續讀取此文件。所以在Haverster關閉之前,磁盤是不會被釋放的。默認情況下filebeat會保持文件打開狀態,直到達到close_inactive(如果此選項打開,filebeat會在指定的時間內將不會再更新的文件句柄關閉,時間從haverster讀取最后一行的時間開始計時。如果文件句柄被關閉后,文件發生了變化,就會啟動一個新的Haverster。關閉文件句柄的時間不取決於文件的修改時間,如果這個參數配置不合適,就有可能發生日志不實的情況,由scan_frequency參數所決定,默認是10s.Haverster使用內部時間戳來記錄文件最后被搜集的時間。例如:設置5m則在Harvester讀取文件的最后一行之后,開始倒計時5分鍾,若5分鍾內文件無變化,則關閉文件句柄。默認5m)

   prospector(勘探者):負責管理Haverster並找到所有讀取源。

filebeat.prospectors:
- input_type: log
   path:
      - /data/xxx.log

   prospector會找到/data/下的所有log文件,並為每一個文件啟動一個Haverster。prospector會檢查每個文件,看Haverster是否已經啟動,是否需要啟動,或者文件是否可以忽略。如果Haverster關閉,只有在文件大小發生變化的時候Prospector才會執行檢查。只能檢查本地文件。

filebeat如何記錄文件的狀態:

  將文件狀態記錄在文件中,默認是在/var/lib/filebeat/registry。此狀態可以記住Haverster搜集文件的偏移量,若連接不上輸出設備,如ES等,filebeat會記錄發送前的最后一行,並再可以連接的時候繼續發送。Filebeat在運行的時候,Prospector狀態會被記錄在內存中。Filebeat重啟的時候,利用registry記錄的狀態來進行重建,用來還原到重啟之前的狀態。每個Prospector會為每個找到的文件記錄一個狀態,對於每個文件,Filebeat存儲唯一標識符以檢測文件是否先前被收集。

Filebeat如何保證事件至少被輸出一次:

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

5. Logstash工作原理

  Logstash事件處理有三個階段:inputs → filters → outputs。是一個接收,處理,轉發日志的工具。支持系統日志,webserver日志,錯誤日志,應用日志,總之包括所有可以拋出來的日志類型。

 Input:輸入數據到logstash:

一些常用的輸入為:

  • file:從文件系統的文件中讀取,類似於tail -f命令
  • syslog:在514端口上監聽系統日志消息,並根據RFC3164標准進行解析
  • redis:從redis service中讀取
  • beats:從filebeat中讀取

Filters:數據中間處理,對數據進行操作:

一些常用的過濾器為:

  • grok:解析任意文本數據,Grok是Logstash最重要的插件。它的主要作用就是將文本格式的字符串,轉換成為具體的結構化的數據,配合正則表達式使用。
  • 官方提供的grok表達式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
  • grok在線調試:https://grokdebug.herokuapp.com/
  • mutate:對字段進行轉換。例如對字段進行刪除、替換、修改、重命名等。
  • drop:丟棄一部分events不進行處理。
  • clone:拷貝 event,這個過程中也可以添加或移除字段。
  • geoip:添加地理信息(為前台kibana圖形化展示使用)

Outputs:outputs是logstash處理管道的最末端組件

一個event可以在處理過程中經過多重輸出,但是一旦所有的outputs都執行結束,這個event也就完成生命周期

一些常見的outputs為:

  • elasticsearch:可以高效的保存數據,並且能夠方便和簡單的進行查詢。
  • file:將event數據保存到文件中。
  • graphite:將event數據發送到圖形化組件中,一個很流行的開源存儲圖形化展示的組件。

Codecs:codecs 是基於數據流的過濾器,它可以作為input,output的一部分配置

Codecs可以幫助你輕松的分割發送過來已經被序列化的數據。

一些常見的codecs:

  • json:使用json格式對數據進行編碼/解碼。
  • multiline:將匯多個事件中數據匯總為一個單一的行。比如:java異常信息和堆棧信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM