《ELK日誌架構》——第一部分:ELK日誌架構學習

ELK是目前微服務技術下,專門爲日誌收集、分析的一套架構進入官網,我們可以看到比較詳細的介紹。ELK是三個開源軟件的縮寫,分別表示:Elasticsearch,Logstash和Kibana目前又新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於各個服務器上搜集日誌後傳輸給Logstash。整個架構圖如下(圖片源自官網)。官網提供的部分中文文檔
在這裏插入圖片描述
Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載。
Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。一般工作方式爲c/s架構,client端安寧莊在需要收集日誌的主機上,server端負責將收到的個節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。
Kibana也是一個開源的分析和可視化的工具,Kibana可以爲Logstash和Elasticsearch提供的日誌分析友好的web界面,可以幫助彙總、分析和搜索重要的數據日誌。
Filebeat隸屬於Beats。目前Beats包含四種工具:
1.Packetbeat(蒐集網絡流量數據)
2.Topbeat(蒐集系統、進程和文件系統級別的CPU和內存使用情況等數據)
3.Filebeat(蒐集文件數據)
4.Winlogbeat(蒐集Windows事件日誌數據)

  • Filebeat、Logstash、Kibana、Elasticsearch 官網文檔 1

爲什麼要用ELK,或者說ELK的應用場景是什麼?
一般大型系統是一個分佈式部署的架構,不同的服務模塊部署在不同的服務器上,問題出現時,大部分情況需要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日誌系統,可以提高定位問題的效率。
一個完整的集中式日誌系統,需要包含以下幾個主要特點:

  • 收集 - 能夠採集多種來源的日誌數據
  • 傳輸 - 能夠穩定的把日誌數據傳輸到中央系統
  • 存儲 - 高效的存儲日誌數據
  • 分析 - 可以支持UI分析
  • 警告 - 能夠提供錯誤報告,監控機制

而ELK則可以完美的解決上面的所有問題。

ELK常見架構模型:
  • 架構圖一:
    在這裏插入圖片描述

這是最簡單的一種ELK架構方式。優點是搭建簡單,易於上手。缺點是Logstash耗資源較大,運行佔用CPU和內存高。另外沒有消息隊列緩存,存在數據丟失隱患。

此架構由Logstash分佈於各個節點上搜集相關日誌、數據,並經過分析、過濾後發送給遠端服務器上的Elasticsearch進行存儲。Elasticsearch將數據以分片的形式壓縮存儲並提供多種API供用戶查詢,操作。用戶亦可以更直觀的通過配置Kibana Web方便的對日誌查詢,並根據數據生成報表。

  • 架構圖二:
    在這裏插入圖片描述

此種架構引入了消息隊列機制,位於各個節點上的Logstash Agent先將數據/日誌傳遞給Kafka(或者Redis),並將隊列中消息或數據間接傳遞給Logstash,Logstash過濾、分析後將數據傳遞給Elasticsearch存儲。

此架構由Logstash分佈於各個節點上搜集相關日誌、數據,並經過分析、過濾後發送給遠端服務器上的Elasticsearch進行存儲。Elasticsearch將數據以分片的形式壓縮存儲並提供多種API供用戶查詢,操作。用戶亦可以更直觀的通過配置Kibana Web方便的對日誌查詢,並根據數據生成報表。

  • 架構圖三:
    在這裏插入圖片描述

此種架構是對架構二進行了優化。該架構中各個模塊的責任如下:
Filebeat:輕量級數據收集引擎。基於原先 Logstash-fowarder 的源碼改造出來。換句話說:Filebeat就是新版的 Logstash-fowarder,也會是 ELK Stack 在 Agent 的第一選擇。
Kafka/Redis: 數據緩衝隊列。作爲消息隊列解耦了處理過程,同時提高了可擴展性。具有峯值處理能力,使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因爲突發的超負荷的請求而完全崩潰。
Logstash :數據收集處理引擎。支持動態的從各種數據源蒐集數據,並對數據進行過濾、分析、豐富、統一格式等操作,然後存儲以供後續使用。
Elasticsearch :分佈式搜索引擎。具有高可伸縮、高可靠、易管理等特點。可以用於全文檢索、結構化檢索和分析,並能將這三者結合起來。Elasticsearch 基於 Lucene 開發,現在使用最廣的開源搜索引擎之一,Wikipedia 、StackOverflow、Github 等都基於它來構建自己的搜索引擎。
Kibana :可視化平臺。它能夠搜索、展示存儲在 Elasticsearch 中索引數據。使用它可以很方便的用圖表、表格、地圖展示和分析數據。

ELK架構模型中各個模塊工作原理:
  • Filebeat工作原理

Filebeat由兩個主要組件組成:prospectors(探測器) 和 harvesters(收割機)。這兩個組件協同工作將文件變動發送到指定的輸出中。


在這裏插入圖片描述
Harvester(收割機):負責讀取單個文件內容。每個文件會啓動一個Harvester,每個Harvester會逐行讀取各個文件,並將文件內容發送到指定處理程序(spooler)。處理程序會集合這些事件,最後filebeat會發送集合的數據到你指定的地點。Harvester負責打開和關閉文件,意味在Harvester運行的時候,文件描述符處於打開狀態,如果文件在收集中被重命名或者被刪除,Filebeat會繼續讀取此文件。所以在Harvester關閉之前,磁盤不會被釋放。默認情況filebeat會保持文件打開的狀態,直到達到close_inactive(如果此選項開啓,filebeat會在指定時間內將不再更新的文件句柄關閉,時間從harvester讀取最後一行的時間開始計時。若文件句柄被關閉後,文件發生變化,則會啓動一個新的harvester。關閉文件句柄的時間不取決於文件的修改時間,若此參數配置不當,則可能發生日誌不實時的情況,由scan_frequency參數決定,默認10s。Harvester使用內部時間戳來記錄文件最後被收集的時間。例如:設置5m,則在Harvester讀取文件的最後一行之後,開始倒計時5分鐘,若5分鐘內文件無變化,則關閉文件句柄。默認5m)。

Prospector(勘測者):負責管理Harvester並找到所有讀取源。

filebeat.prospectors:
- input_type: log
  paths:
    - /apps/logs/*/info.log

Prospector會找到/apps/logs/*目錄下的所有info.log文件,併爲每個文件啓動一個Harvester。Prospector會檢查每個文件,看Harvester是否已經啓動,是否需要啓動,或者文件是否可以忽略。若Harvester關閉,只有在文件大小發生變化的時候Prospector纔會執行檢查。只能檢測本地的文件。

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

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


- Logstash工作原理

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

在這裏插入圖片描述
Input:輸入數據到logstash
一些常用的輸入爲:
file:從文件系統的文件中讀取,類似於tial -f命令
syslog:在514端口上監聽系統日誌消息,並根據RFC3164標準進行解析
redis:從redis service中讀取
beats:從filebeat中讀取

Filters:數據中間處理,對數據進行操作
一些常用的過濾器爲:
grok:解析任意文本數據,Grok 是 Logstash 最重要的插件。它的主要作用就是將文本格式的字符串,轉換成爲具體的結構化的數據,配合正則表達式使用。內置120多個解析語法。
官方提供的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異常信息和堆棧信息。

【ELK日誌處理環境搭建】系列教程

《ELK日誌架構》——第一部分:ELK日誌架構學習
《ELK日誌架構》——第二部分:ELK架構環境搭建

歡迎關注本人個人公衆號,交流更多技術信息

在這裏插入圖片描述


  1. 官方文檔:
    Filebeat:
    https://www.elastic.co/cn/products/beats/filebeat
    https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html
    Logstash:
    https://www.elastic.co/cn/products/logstash
    https://www.elastic.co/guide/en/logstash/5.6/index.html
    Kibana:
    https://www.elastic.co/cn/products/kibana
    https://www.elastic.co/guide/en/kibana/5.5/index.html
    Elasticsearch:
    https://www.elastic.co/cn/products/elasticsearch
    https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html
    elasticsearch中文社區:
    https://elasticsearch.cn/ ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章