Elasticsearch + Logstash + Filebeat + Kibana搭建ELK日志分析平臺(tái)(官方推薦的BEATS架構(gòu))

file

俗話話說的號(hào),沒有金剛鉆,也不攬那瓷器活;日志分析可以說是所有大小系統(tǒng)的標(biāo)配了,不知道有多少菜鳥程序員有多喜歡日志,如果沒了日志,那自己寫的bug想不被別人發(fā)現(xiàn),可就難了;
有了它,就可將bug們統(tǒng)統(tǒng)消化在自己手里。

當(dāng)然了,作為一個(gè)架構(gòu)師搭建動(dòng)手搭建一個(gè)日志平臺(tái)也基本是必備技能了,雖然我們說架構(gòu)師基本不咋寫代碼了,但是如果需要的時(shí)候,還是能扛槍的

大家可以看下架構(gòu)師要具備的能力:
那些年薪50萬,卻不寫代碼的程序員,到底贏在哪?
原來,百萬年薪的架構(gòu)師都是這樣使用redis的!

ELK部署應(yīng)用與工作機(jī)制

3.1 ELK日志分析平臺(tái)介紹

ELK是三個(gè)開源軟件的縮寫,分別表示:Elasticsearch , Logstash和Kibana。Elasticsearch和Kibana我們上面做過講解。 Logstash 主要是用來日志的搜集、分析、過濾日志的工具,適用大數(shù)據(jù)量場(chǎng)景, 一般采用c/s模式,client端安裝在需要收集日志的主機(jī)上,server端負(fù)責(zé)將收到的各節(jié)點(diǎn)日志進(jìn)行過濾、修改等操作, 再一并發(fā)往Elasticsearch上做數(shù)據(jù)分析。

一個(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)用,是目前主流的一種日志分析平臺(tái)。

3.2 ELK部署架構(gòu)模式

3.2.1 簡(jiǎn)單架構(gòu)

file

這是最簡(jiǎn)單的一種ELK部署架構(gòu)方式, 由Logstash分布于各個(gè)節(jié)點(diǎn)上搜集相關(guān)日志、數(shù)據(jù),并經(jīng)過分析、過濾后發(fā)送給遠(yuǎn)端服務(wù)器上的Elasticsearch進(jìn)行存儲(chǔ)。 優(yōu)點(diǎn)是搭建簡(jiǎn)單, 易于上手, 缺點(diǎn)是Logstash耗資源較大, 依賴性強(qiáng), 沒有消息隊(duì)列緩存, 存在數(shù)據(jù)丟失隱患

3.2.2 消息隊(duì)列架構(gòu)

file

該隊(duì)列架構(gòu)引入了KAFKA消息隊(duì)列, 解決了各采集節(jié)點(diǎn)上Logstash資源耗費(fèi)過大, 數(shù)據(jù)丟失的問題, 各終端節(jié)點(diǎn)上的Logstash Agent 先將數(shù)據(jù)/日志傳遞給Kafka, 消息隊(duì)列再將數(shù)據(jù)傳遞給Logstash, Logstash過濾、分析后將數(shù)據(jù)傳遞給Elasticsearch存儲(chǔ), 由Kibana將日志和數(shù)據(jù)呈現(xiàn)給用戶。

3.2.3 BEATS架構(gòu)

file

該架構(gòu)的終端節(jié)點(diǎn)采用Beats工具收集發(fā)送數(shù)據(jù), 更靈活,消耗資源更少,擴(kuò)展性更強(qiáng)。同時(shí)可配置Logstash 和Elasticsearch 集群用于支持大集群系統(tǒng)的運(yùn)維日志數(shù)據(jù)監(jiān)控和查詢, 官方也推薦采用此工具, 本章我們采用此架構(gòu)模式進(jìn)行配置講解(如果在生產(chǎn)環(huán)境中, 可以再增加kafka消息隊(duì)列, 實(shí)現(xiàn)了beats+消息隊(duì)列的部署架構(gòu) )。

Beats工具包含四種:

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

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

3、Filebeat(搜集文件數(shù)據(jù))

4、Winlogbeat(搜集 Windows 事件日志數(shù)據(jù))

3.3 ELK工作機(jī)制

3.3.1 Filebeat工作機(jī)制

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

file

Harvester(收割機(jī)):負(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

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(勘測(cè)者):負(fù)責(zé)管理Harvester并找到所有讀取源。

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

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如何記錄發(fā)送狀態(tài):

將文件狀態(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ù)發(fā)送成功:

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)的事件,都會(huì)在filebeat重啟之后重新發(fā)送。這可確保至少發(fā)送一次,但有可能會(huì)重復(fù)??赏ㄟ^設(shè)置shutdown_timeout 參數(shù)來設(shè)置關(guān)閉之前的等待事件回應(yīng)的時(shí)間(默認(rèn)禁用)。

3.3.2 Logstash工作機(jī)制

Logstash事件處理有三個(gè)階段:inputs → filters → outputs。是一個(gè)接收,處理,轉(zhuǎn)發(fā)日志的工具。支持系統(tǒng)日志,webserver日志,錯(cuò)誤日志,應(yīng)用日志等。

file

Input:輸入數(shù)據(jù)到logstash。

支持的輸入類型:

file:從文件系統(tǒng)的文件中讀取,類似于tail -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è)解析語法。

官方提供的grok表達(dá)式

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異常信息和堆棧信息。

3.4 Logstash安裝配置

在192.168.116.141機(jī)器節(jié)點(diǎn)上進(jìn)行安裝:

  1. 下載解壓

    下載:

    cd /usr/local
    wget https://artifacts.elastic.co/downloads/logstash/logstash-7.10.2-linux-x86_64.tar.gz
    

    解壓:

    tar -xvf logstash-7.10.2-linux-x86_64.tar.gz
    
  2. 創(chuàng)建數(shù)據(jù)存儲(chǔ)與日志記錄目錄

    [root@localhost logstash-7.10.2]# mkdir -p /usr/local/logstash-7.10.2/data
    [root@localhost logstash-7.10.2]# mkdir -p /usr/local/logstash-7.10.2/logs
    
  3. 修改配置文件:

    vi /usr/local/logstash-7.10.2/config/logstash.yml 
    

    配置內(nèi)容:

    # 數(shù)據(jù)存儲(chǔ)路徑
    path.data: /usr/local/logstash-7.10.2/data
    # 監(jiān)聽主機(jī)地址
    http.host: "192.168.116.141"
    # 日志存儲(chǔ)路徑
    path.logs: /usr/local/logstash-7.10.2/logs
    #啟動(dòng)監(jiān)控插件
    xpack.monitoring.enabled: true 
    #Elastic集群地址
    xpack.monitoring.elasticsearch.hosts:["http://192.168.116.140:9200","http://192.168.116.140:9201","http://192.168.116.140:9202"]
    
  4. 創(chuàng)建監(jiān)聽配置文件:

    vi /usr/local/logstash-7.10.2/config/logstash.conf 
    

    配置:

    input {
      beats {
        # 監(jiān)聽端口
        port => 5044
      }
    }
    
    output {
    
      stdout {
        # 輸出編碼插件
        codec => rubydebug
      }
    
      elasticsearch {
        # 集群地址
        hosts => ["http://192.168.116.140:9200","http://192.168.116.140:9201","http://192.168.116.140:9202"]
    
      }
    }
    
  5. 啟動(dòng)服務(wù):

    以root用戶身份執(zhí)行:

    ## 后臺(tái)啟動(dòng)方式
    nohup  /usr/local/logstash-7.10.2/bin/logstash -f /usr/local/logstash-7.10.2/config/logstash.conf &
    ##
    ./logstash -f ../config/logstash.conf
    

    成功啟動(dòng)后會(huì)顯示以下日志:

    [2020-10-15T06:57:40,640][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
    

    訪問地址: http://192.168.116.141:9600/, 可以看到返回信息:

    file

3.5 Filebeat安裝配置

在192.168.116.141機(jī)器節(jié)點(diǎn)上操作:

  1. 下載解壓

    與ElasticSearch版本一致, 下載7.10.2版本。

    cd /usr/local
    wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.10.2-linux-x86_64.tar.gz
    

    解壓:

    tar -xvf filebeat-7.10.2-linux-x86_64.tar.gz
    
  2. 修改配置文件

    vi /usr/local/filebeat-7.10.2/filebeat.yml
    

    修改內(nèi)容:

    # 需要收集發(fā)送的日志文件
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/messages
    # 如果需要添加多個(gè)日志,只需要添加
    - type: log
      enabled: true
      paths:
        - /var/log/test.log    
    # filebeat 配置模塊, 可以加載多個(gè)配置
    filebeat.config.modules:  
      path: ${path.config}/modules.d/*.yml  
      reload.enabled: false    
    # 索引分片數(shù)量設(shè)置
    setup.template.settings:
      index.number_of_shards: 2
    # kibana 信息配置
    setup.kibana:
      host: "192.168.116.140:5601"
    # logstash 信息配置 (注意只能開啟一項(xiàng)output設(shè)置, 如果采用logstash, 將output.elasticsearch關(guān)閉)
    output.logstash:  
      hosts: ["192.168.116.141:5044"]
    # 附加metadata元數(shù)據(jù)信息
    processors:
      - add_host_metadata: ~
      - add_cloud_metadata: ~
    
  3. 啟動(dòng)服務(wù)

    ## 后臺(tái)啟動(dòng)
    nohup /usr/local/filebeat-7.10.2/filebeat -e -c /usr/local/filebeat-7.10.2/filebeat.yml &
    ## 
    ./filebeat -e -c filebeat.yml
    

    啟動(dòng)成功后顯示日志:

    2020-12-15T07:09:33.922-0400    WARN    beater/filebeat.go:367  Filebeat is unable to load the Ingest Node pipelines for the configured modules because the Elasticsearch output is not configured/enabled. If you have already loaded the Ingest Node pipelines or are using Logstash pipelines, you can ignore this warning.
    2020-12-15T07:09:33.922-0400    INFO    crawler/crawler.go:72   Loading Inputs: 1
    2020-12-15T07:09:33.923-0400    INFO    log/input.go:148        Configured paths: [/var/log/messages]
    2020-12-15T07:09:33.923-0400    INFO    input/input.go:114      Starting input of type: log; ID: 14056778875720462600 
    2020-12-15T07:09:33.924-0400    INFO    crawler/crawler.go:106  Loading and starting Inputs completed. Enabled inputs: 1
    2020-12-15T07:09:33.924-0400    INFO    cfgfile/reload.go:150   Config reloader started
    

    我們監(jiān)聽的是/var/log/messages系統(tǒng)日志信息, 當(dāng)日志發(fā)生變化后, filebeat會(huì)通過logstash上報(bào)到Elasticsearch中。 我們可以查看下集群的全部索引信息:

    http://192.168.116.140:9200/_cat/indices?v

    可以看到, 已經(jīng)生成了名為logstash-2021.07.20-000001索引。

3.6 Kibana配置與查看數(shù)據(jù)

  1. 進(jìn)入Kibana后臺(tái), 進(jìn)行配置:

    http://192.168.116.140:5601

    file

    進(jìn)入【Management】--> 在Index Pattern中輸入"logstash-*" --> 點(diǎn)擊【next step】, 選擇"@timestamp",

    file

    點(diǎn)擊【 Create index pattern 】進(jìn)行創(chuàng)建。

file
  1. 查看數(shù)據(jù)

    進(jìn)入【Discover】, 可以查看到收集的數(shù)據(jù):

file

如果沒有顯示, 可以重新調(diào)整Time Range時(shí)間范圍。

本文由育博學(xué)谷狂野架構(gòu)師發(fā)布
如果本文對(duì)您有幫助,歡迎關(guān)注和點(diǎn)贊;如果您有任何建議也可留言評(píng)論或私信,您的支持是我堅(jiān)持創(chuàng)作的動(dòng)力
轉(zhuǎn)載請(qǐng)注明出處!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容