ELK的搭建與配置理解

ELK介紹

需求背景

  • 業務發展越來越龐大,服務器越來越多
  • 各種訪問日誌、應用日誌、錯誤日誌量越來越多,導致運維人員無法很好的去管理日誌
  • 開發人員排查問題,需要到服務器上查日誌,不方便
  • 運營人員需要一些數據,需要我們運維到服務器上分析日誌

爲什麼要用到ELK:

一般我們需要進行日誌分析場景:直接在日誌文件中 grep、awk 就可以獲得自己想要的信息。但在規模較大也就是日誌量多而複雜的場景中,此方法效率低下,面臨問題包括日誌量太大如何歸檔、文本搜索太慢怎麼辦、如何多維度查詢。需要集中化的日誌管理,所有服務器上的日誌收集彙總。常見解決思路是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問。

大型系統通常都是一個分佈式部署的架構,不同的服務模塊部署在不同的服務器上,問題出現時,大部分情況需要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日誌系統,可以提高定位問題的效率。

一個完整的集中式日誌系統,需要包含以下幾個主要特點:

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

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

ELK簡介:

官網:https://www.elastic.co/cn/

ELK是三個開源軟件的縮寫,分別爲:Elasticsearch 、 Logstash以及Kibana , 它們都是開源軟件。不過現在還新增了一個Beats,它是一個輕量級的日誌收集處理工具(Agent),Beats佔用資源少,適合於在各個服務器上搜集日誌後傳輸給Logstash,官方也推薦此工具,目前由於原本的ELK Stack成員中加入了 Beats 工具所以已改名爲Elastic Stack。

Elastic Stack包含:

  • Elasticsearch是個開源分佈式搜索引擎,提供蒐集、分析、存儲數據三大功能。它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。Elasticsearch權威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
  • Logstash 主要是用來日誌的蒐集、分析、過濾日誌的工具,支持大量的數據獲取方式。一般工作方式爲c/s架構,client端安裝在需要收集日誌的主機上,server端負責將收到的各節點日誌進行過濾、修改等操作在一併發往elasticsearch上去。
  • Kibana 也是一個開源和免費的工具,Kibana可以爲 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 界面,可以幫助彙總、分析和搜索重要數據日誌。
  • Beats在這裏是一個輕量級日誌採集器,其實Beats家族有6個成員,早期的ELK架構中使用Logstash收集、解析日誌,但是Logstash對內存、cpu、io等資源消耗比較高。相比 Logstash,Beats所佔系統的CPU和內存幾乎可以忽略不計。目前Beats包含六種工具:
    • Packetbeat: 網絡數據(收集網絡流量數據)
    • Metricbeat: 指標 (收集系統、進程和文件系統級別的 CPU 和內存使用情況等數據)
    • Filebeat: 日誌文件(收集文件數據)
    • Winlogbeat: windows事件日誌(收集 Windows 事件日誌數據)
    • Auditbeat:審計數據 (收集審計日誌)
    • Heartbeat:運行時間監控 (收集系統運行時的數據)
      在這裏插入圖片描述
官方文檔:
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/

環境介紹

192.168.15.128 elasticsearch + kibana

192.168.15.130 logstash + es

192.168.15.131 filebeat + nginx + es

nginx版本爲1.14.0,其餘elk+filebeat版本均爲6.0.1並且全部防火牆關閉

nginx的安裝與部署

1)依賴包的安裝:yum install -y pcre-devel openssl-devel zlib-devel

2)tar zxf nginx-1.14.0.tar.gz

隱藏版本號: vim /usr/local/nginx-1.14.0/src/core/nginx.h

#define NGINX_VERSION “1.14.0”
#define NGINX_VER “nginx/” NGINX_VERSION

減少編譯內存: vim /usr/local/nginx-1.14.0/auto/cc/gcc

#debug

#CFLAGS="$CFLAGS -g"

3)編譯安裝

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-file-aio --with-threads --user=nginx --group=nginx

make && make install

4)日誌文件格式的指定: vim /usr/local/nginx/conf/nginx.conf

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent";

5)啓動nginx服務以及查看80端口是否開啓

filebeat的安裝與部署

1)tar zxf filebeat-6.0.1-linux-x86_64.tar.gz -C /usr/local

2)vim /usr/local/filebeat-6.0.1-linux-x86_64/filebeat.yml

filebeat.prospectors:
- type: log
  enabled: true
  paths:
  - /usr/local/nginx/logs/access.log
output.logstash:
  hosts: ["192.168.15.130:5044"]

filebeat將數據通過input的放式傳送給logstash中,logstash將數據進行過濾。

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

**Harvester(收割機):**負責讀取單個文件內容。每個文件會啓動一個Harvester,每個Harvester會逐行讀取各個文件,並將文件內容發送到制定輸出中。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的安裝與部署

參考:https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/index.html

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

​ 我們需要爲它指定Input和Output(當然Input和Output可以爲多個)。由於我們需要把Java代碼中Log4j的日誌輸出到ElasticSearch中,因此這裏的Input就是Log4j,而Output就是ElasticSearch。

1)wget https://artifacts.elastic.co/downloads/logstash/logstash-6.0.1rpm

​ rpm -ivh logstash-6.0.1.rpm

2)vim /etc/logstash/conf.d/nginx.conf

input {
  beats {  
    host => "192.168.15.130"
    port => 5044
  }
}
filter {
  grok {
    match => {
	"message" => [ "%{IPORHOST:clientip} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:%{NUMBER:bytes_read}|-) %{QS:referrer} %{QS:agent}"
		]
	     }
       }
}
output {
  elasticsearch { 
           	hosts => ["192.168.15.128:9200"] 
                index => "haoningning-%{+YYYY.MM.dd}"
                }
  stdout {
        codec => rubydebug
    }
}

Input:輸入數據到logstash。

一些常用的輸入爲:

​ file:從文件系統的文件中讀取,類似於tail -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異常信息和堆棧信息。

3)檢查配置是否有錯(出現紅色框的代表正確)

cd /usr/share/logstash/bin && ./logstash -t -f /etc/logstash/conf.d/nginx.conf在這裏插入圖片描述
這個時候會發現端口5044被監聽,logstash服務啓動成功。

使用multiline插件

我們在用Logstash收集日誌的時候會碰到日誌會錯行,這個時候我們需要把錯的行歸併到上一行,使某條數據完整;也防止因爲錯行導致其他字段的不正確。在Logstash-filter插件中,multiline插件可以解決這個問題

配置重點就在於:

file {
                path=> [ "/opt/Oracle/Middleware/wlserver_10.3/common/nodemanager/servers/api_server*/logs/api_server*.out"]
                type=>"apiserver_log"
                codec => multiline{
                        pattern => "^\^A\["
                        negate => true
                        what => previous
                }
        }

這裏所採用的是正則匹配行頭的方式來實現合併錯行的:假如某一行行頭不能匹配\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2},則把此行歸併到上一行,如此可以實現錯行合一的效果。

在這裏第二行開頭爲:07705e58772f6c 228,此行不能匹配\d{4}-\d{1,2}-\d{1,2}\s\d{1,2}:\d{1,2}:\d{1,2}這個正則,所以把第二行歸併到第一行。

這種方式會造成延遲一條的現象:因爲如果沒有下一條數據能匹配這個正則,則說明此條數據還有可能繼續錯行,所以在第三行數據來之後,匹配成功,錯行結束,第一條日誌纔會往下走(進行分割,直至索引進ES)

elasticsearch服務的安裝與配置

在三臺節點上分別配置,根據相關服務器,修改配置的不同地方

1)wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.1.rpm

rpm -ivh elasticsearch-6.0.1.rpm

2)配置文件的兩個位置

/etc/elasticsearch/elasticsearch.yml #用於配置集羣節點相關信息

/etc/sysconfig/elasticsearch #配置服務本身相關的配置

3)vim /etc/elasticsearch/elasticsearch.yml

cluster.name: my-es  # 集羣中的名稱
node.name: master-node  # 該節點名稱(在其他節點寫的是其他主機名)
node.master: true  # 意思是該節點爲主節點(其他節點:false)
node.data: false  # 表示這不是數據節點(其他節點:true)
network.host: 0.0.0.0  # 監聽全部ip,在實際環境中應設置爲一個安全的ip
http.port: 9200  # es服務的端口號
discovery.zen.ping.unicast.hosts: ["192.168.15.128", "192.168.15.130", "192.168.15.131"] # 配置自動發現

4)開啓相關三臺服務

systemctl start elasticsearch.service

此時發現9200和9300端口都被監聽。(9200是集羣通信,9300是數據傳輸用的)

5)查看集羣之間的情況

curl '192.168.77.128:9200/_cluster/health?pretty'	#集羣的健康檢查
curl '192.168.77.128:9200/_cluster/state?pretty'	#集羣的詳細信息

kibana的安裝與部署

1)wget https://artifacts.elastic.co/downloads/kibana/kibana-6.0.1-x86_64.rpm

rpm -ivh kibana-6.0.1-x86_64.rpm

2)配置kibana:

vim /etc/kibana/kibana.yml  # 增加以下內容
server.port: 5601  # 配置kibana的端口
server.host: 192.168.15.128  # 配置監聽ip
elasticsearch.url: "http://192.168.15.128:9200"  # 配置es服務器的ip,如果是集羣則配置該集羣中主節點的ip
logging.dest: /var/log/kibana.log  # 配置kibana的日誌文件路徑,不然默認是messages裏記錄日誌

3)創建日誌文件: touch /var/log/kibana.log; chmod 777 /var/log/kibana.log

4)開啓kibana服務並檢查端口

systemctl start kibana ; netstat -lntp |grep 5601

1)開啓日誌收集開啓logstash:
cd  /usr/share/logstash/bin &&  ./logstash -f /etc/logstash/conf.d/nginx.conf

2)開啓filebeat日誌採集:
cd /usr/local/filebeat-6.0.1-linux-x86_64/  &&  ./filebeat -e -c filebeat.yml

3)在kibana頁面查看日誌展示

FAQ

(1)安裝es啓動的時候,報錯顯示沒有java環境。因爲elasticsearch是java開發的,所以必須配置java環境。在這裏插入圖片描述
解決過程:安裝jdk環境:yum install -y jdk-8u121-linux-x64.rpm

最開始我安裝了1.7的配置,依舊報錯,顯示環境至少應該1.8,卸載之後直接安裝1.8的jdk環境。

(2)在啓動es的時候出現內存沒有鎖導致服務啓動失敗。
在這裏插入圖片描述
解決過程:首先查看es的日誌,發現/var/log/elasticsearch目錄下沒有產生日誌,查看/var/log/message的時候出現以上報錯,經過查詢修改如下:vim /etc/elasticsearch/elasticsearch.yml

#bootstrap.memory_lock: true

(3)在配置vim /etc/elasticsearch/elasticsearch.yml的時候network.host本來只配置了es的ip,但是服務啓動依舊失敗,查看日誌之後,依照網上修改爲:“network.host: 0.0.0.0 # 監聽全部ip”之後成功啓動

(4)在安裝logstash的時候,出現以下報錯:顯示內存不足導致不能分配資源給systemctl。
在這裏插入圖片描述

解決辦法:查看vim /etc/logstash/jvm.options文件的時候發現最大和最小內存限制爲(-Xms256m -Xmx1g)

嘗試修改文件配置,但是並沒有生效,因爲虛擬機內存是1G,所以修改虛擬機內存爲2G重新安裝。

卸載之前的安裝rpm -e logstash(我之前用全部文件名卸載,但是不能成功),重新安裝。

(5)網上的錯誤,在我做的時候提前看了,所以沒遇到這個問題。
在這裏插入圖片描述
(6)logstash檢查文件的時候出現報錯:
在這裏插入圖片描述
解決過程:http://grokdebug.herokuapp.com/ 可以在這個地方進行grok的debug分析。

檢查中發現配置文件的filter中的fork缺少中括號,並且在output裏面沒有寫index所以導致的錯誤。在啓動之前應該使用“ ./logstash -t -f /etc/logstash/conf.d/nginx.conf”檢查配置文件是否正確

(7)之前出現日誌收集未成功,是因爲虛擬機沒有配置正確的時間,按時間劃分的話,並不能正確採集到日誌。更改不按時間過濾之後,出現以下圖,正常採集。
在這裏插入圖片描述

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