1. 程式人生 > 實用技巧 >ELK日誌分析系統

ELK日誌分析系統

ELK日誌分析系統

目錄

  • 摘要
  • 一、ELK日誌分析系統簡介
    • 1.1、日誌伺服器
    • 1.2、ELK日誌分析系統
    • 1.3、日誌處理步驟
  • 二、ELK元件介紹
    • 2.1、ELasticsearch的概述
    • 2.2、Elasticsearch核心概念
    • 2.3、Logstash介紹
    • 2.4、Kibana介紹
  • 三、ELK日誌問及那系部署
    • 3.1、環境說明
    • 3.2、Elasticsearch配置(下面的操作都需要在node1、node2上配置)
    • 3.3、Logstash部署(apache上部署)
    • 3.4、在node1主機安裝kibana
  • 總結

摘要

顧名思義ELK是由Elasticsearch,Logstash,Kibana三大元件構成的一個基於web頁面的日誌分析工具。

日誌分析是運維工程師解決系統故障,發現問題的主要手段。日誌包含多種型別,包括程式日誌,系統日誌以及安全日誌等。通過對日誌分析,預發故障的發生,又可以在故障發生時,尋找到蛛絲馬跡,快速定位故障點。及時解決。

元件結構:

  • Elasticsearch:是一個開源分散式時實分析搜尋引擎,建立在全文搜尋引擎庫ApacheLucene基礎上,同時隱藏了ApacheLucene的複雜性。Elasticsearch將所有的功能打包成一個獨立的動畫片,索引副本機制,RESTful風格介面,多資料來源。自動搜尋等特點。
  • Logstash :是一個完全開源的工具,主要用於日誌收集,同時可以對資料處理,並輸出給Elasticarch
  • Kibana:也是一個完全開源的工具,kibana可以為Logstash和Elasticsearch提供圖形化的日誌分析。Web介面,可以彙總,分析和搜尋重要資料日誌。
Top

一、ELK日誌分析系統簡介

1.1、日誌伺服器

1.1.1、提高安全性

1.1.2、集中存放日誌

1.1.3、缺陷

對日誌的分析困難

1.2、ELK日誌分析系統

1.2.1、Elasticsearch

1.2.2、Logstash

1.2.3、Kibana

1.3、日誌處理步驟

1.3.1、將日誌進行集中化管理

1.3.2、將日誌格式化(Logstash)並輸出到(Elasticsearch)

1.3.3、對格式化後的資料進行索引和儲存(Elasticsearch)

1.3.4、前端資料的展示(Kibana)

Top

二、ELK元件介紹

2.1、ELasticsearch的概述

  • 提供了一個分散式多使用者能力的全文搜尋引擎

2.2、Elasticsearch核心概念

2.2.1、接近實時

  • elasticsearch是一個接近實時的搜尋平臺,這意味著,從索引一個文件直到這個文件能夠被搜尋到有一個輕微的延遲(通常是1秒)

2.2.2、叢集

  • 一個叢集就是由一個或多個節點組織在一起,它們共同持有你整個的資料,並一起提供索引和搜尋功能。其中一個節點為主節點,這個主節點是可以通過選舉產生的,並提供跨節點的聯合索引和搜尋的功能。叢集有一個唯一性標示的名字,預設是elasticsearch,叢集名字很重要,每個節點是基於叢集名字加入到其叢集中的。因此,確保在不同環境中使用不同的叢集名字。一個叢集可以只有一個節點。強烈建議在配置elasticsearch時,配置成叢集模式。

2.2.3、節點

  • 節點就是一臺單一的伺服器,是叢集的一部分,儲存資料並參與叢集的索引和搜尋功能。像叢集一樣,節點也是通過名字來標識,預設是在節點啟動時隨機分配的字元名。當然,你可以自己定義。該名字也很重要,在叢集中用於識別伺服器對應的節點。節點可以通過指定叢集名字來加入到叢集中。預設情況,每個節點被設定成加入到elasticsearch叢集。如果啟動了多個節點,假設能自動發現對方,他們將會自動組建一個名為elasticsearch的叢集。

2.2.4、索引

  • 索引(庫)→型別(表)→文件(記錄)

2.2.5、分片和副本

  • 在實際情況下,索引儲存的資料可能超過單個節點的硬體限制。如一個10億文件需1TB空間可能不適合儲存在單個節點的磁碟上,或者從單個節點搜尋請求太慢了。為了解決這個問題,elasticsearch提供將索引分成多個分片的功能。當在建立索引時,可以定義想要分片的數量。每一個分片就是一個全功能的獨立的索引,可以位於叢集中任何節點上。
  • 每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作為複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和副本的數量可以在索引建立的時候指定。
  • 在索引建立之後,你可以在任何時候動態地改變副本的數量,但是你事後不能改變分片的數量。
    預設情況下,Elasticsearch中的每個索引被分片5個主分片和1個副本,這意味著,如果你的叢集中至少有兩個節點,你的索引將會有5個主分片和另外5個副本分片(1個完全拷貝),這樣的話每個索引總共就有10個分片。

2.3、Logstash介紹

2.3.1、Logstash介紹

  • 一款強大的資料處理工具
  • 可實現資料傳輸、格式處理、格式化輸出
  • 資料輸入、資料加工(如過濾,改寫等)以及資料輸出

2.3.2、Logstash主要元件

  • Shipper:日誌收集者,負責監控本地日誌檔案的變化,及時把日誌檔案的最新內容收集起來。通常,遠端代理端(agent)只需要執行這個元件即可
  • Indexer:日誌儲存者,負責接收日誌並寫入到本地檔案
  • Broker:日誌hub,負責連線多個shipper和多個indexer
  • Search and Storage:允許對事件進行搜尋和儲存
  • Web Interface:基於Web的展示介面

2.4、Kibana介紹

2.4.1、Kibana介紹

  • 一個針對Elasticsearch的開源分析及視覺化平臺
  • 搜尋、檢視儲存在Elasticsearch索引中的資料
  • 通過各種圖表進行高階資料分析及展示

2.4.2、Kibana主要功能

  • Elasticsearch無縫之整合
  • 整合資料,複雜資料分析
  • 讓更多團隊成員受益
  • 介面靈活,分享更容易
  • 配置簡單,視覺化多資料來源
  • 簡單資料匯出
Top

三、ELK日誌問及那系部署

3.1、環境說明

部署兩臺Elasticsearch做叢集,node1做ELK日誌分析系統

apache

20.0.0.30

httpd

Logstash

node1

20.0.0.10

Elasticsearch

Kinaba

node2

20.0.0.20

Elasticsearch

3.2、Elasticsearch配置(下面的操作都需要在node1、node2上配置)

3.2.1、安裝金鑰及elasticsearch源

 1 [root@node1 ~]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
 2 [root@node1 ~]# cd /etc/yum.repos.d/
 3 [root@node1 yum.repos.d]# vi elasticsearch.repo
 4 [elasticsearch-2.x]
 5 name=Elasticsearch repository for 2.x packages
 6 baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
 7 gpgcheck=1
 8 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
 9 enable=1
10 
11 [root@node1 ~]# yum list       #檢視yum清單
12 [root@node1 ~]# yum install elasticsearch -y    #安裝elasticsearch
13 [root@node1 ~]# yum install java -y      #安裝Java
14 [root@node1 ~]# java -version           #檢視Java版本
15 openjdk version "1.8.0_131"
16 OpenJDK Runtime Environment (build 1.8.0_131-b12)
17 OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

3.2.2、修改配置檔案

 1 [root@node1 yum.repos.d]# vi /etc/elasticsearch/elasticsearch.yml 
 2 17行 叢集名稱
 3 cluster.name: elastic
 4 
 5 23行 節點名稱
 6 node.name: linux-node1
 7 
 8 33行 工作目錄
 9 path.data: /data/es-data
10 path.logs: /var/log/elasticsearch/
11 
12 43行 防止交換swap分割槽
13 bootstrap.memory_lock: true
14 
15 54行 監聽網路
16 network.host: 0.0.0.0
17 
18 58行 埠
19 http.port: 9200

3.2.3、建立目錄及開啟服務

1 [root@node1 yum.repos.d]# mkdir -p /data/es-data
2 [root@node1 yum.repos.d]# chown -R elasticsearch:elasticsearch /data/es-data
3 [root@node1 yum.repos.d]# systemctl start elasticsearch.service 
4 [root@node1 yum.repos.d]# netstat -anpt | grep 9200
5 tcp6       0      0 :::9200                 :::*                    LISTEN      54134/java          

3.2.4、測試

1 http://20.0.0.10:9200

 1 [root@node1 yum.repos.d]# curl -i -XGET 'http://20.0.0.20:9200/_count?pretty' -d '{
 2 > "query": {
 3 >     "match_all": {}
 4 > }
 5 > }'
 6 HTTP/1.1 200 OK       #輸出項
 7 Content-Type: application/json; charset=UTF-8
 8 Content-Length: 95
 9 
10 {
11   "count" : 0,
12   "_shards" : {
13     "total" : 0,
14     "successful" : 0,
15     "failed" : 0
16   }
17 }
18 
19 [root@node2 yum.repos.d]# curl -i -XGET 'http://20.0.0.10:9200/_count?pretty' -d '{
20 > "query": {
21 >     "match_all": {}
22 > }
23 > }'
24 HTTP/1.1 200 OK      #輸出項
25 Content-Type: application/json; charset=UTF-8
26 Content-Length: 95
27 
28 {
29   "count" : 0,
30   "_shards" : {
31     "total" : 0,
32     "successful" : 0,
33     "failed" : 0
34   }
35 }

3.2.5、安裝Elasticsearch外掛

1 [root@node1 yum.repos.d]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head

3.2.6、測試

1 http://20.0.0.10:9200/_plugin/head/

3.2.7、符合查詢

  • 提交請求

  • 查詢

  • 刪除後再查詢

3.2.8、elasticsearch叢集部署

1 [root@node1 yum.repos.d]# vi /etc/elasticsearch/elasticsearch.yml
2 69行 單播列表自動發現機制
3 discovery.zen.ping.unicast.hosts: ["20.0.0.10", "20.0.0.20"]
4 
5 重啟服務
6 [root@node1 yum.repos.d]# systemctl restart elasticsearch.service

3.2.9、測試

1 http://20.0.0.10:9200/_plugin/head/

3.2.10、node-01和node-02日誌提示不讓鎖記憶體

1 [root@node1 elasticsearch]# less /var/log/elasticsearch/elastic.log
2 ......
3 [2020-11-18 10:36:42,959][WARN ][bootstrap                ] These can be adjusted by modifying /etc/security/limits.conf, for example: 
4         # allow user 'elasticsearch' mlockall
5         elasticsearch soft memlock unlimited
6         elasticsearch hard memlock unlimited
1 修改配置檔案
2 [root@node1 elasticsearch]# vi /etc/security/limits.conf 
3 //末尾插入
4 # allow user 'elasticsearch' mlockall
5 elasticsearch soft memlock unlimited
6 elasticsearch hard memlock unlimited
7 
8 [root@node1 elasticsearch]# systemctl stop elasticsearch.service 
9 [root@node1 elasticsearch]# systemctl start elasticsearch.service 

3.2.11、安裝監控元件

1 [root@node1 elasticsearch]# /usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf

3.2.12、測試

3.3、Logstash部署(apache上部署)

3.3.1、安裝httpd並開啟服務

1 [root@apache ~]# yum -y install httpd 
2 [root@apache ~]# systemctl start httpd
3 [root@apache ~]# netstat -anpt | grep httpd
4 tcp6       0      0 :::80                   :::*                    LISTEN      15620/httpd         
5 [root@apache ~]# echo '<h1>this is web!</h1>' > /var/www/html/index.html
6 [root@apache ~]# curl http://localhost
7 <h1>this is web!</h1>

3.3.2、安裝金鑰及Logstash源

 1 [root@node1 elasticsearch]# rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
 2 [root@node1 elasticsearch]# vi /etc/yum.repos.d/logstash.repo
 3 [logstash-2.1]
 4 name=Logstash repository for 2.1.x packages
 5 baseurl=http://packages.elastic.co/logstash/2.1/centos
 6 gpgcheck=1
 7 gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
 8 enable=1
 9 
10 安裝Logstash
11 [root@node1 elasticsearch]# yum install logstash -y

3.3.3、安裝java環境,沒有自帶安裝使用yum -y install java安裝

1 [root@apache ~]# yum -y install java
2 [root@apache ~]# java -version
3 openjdk version "1.8.0_131"
4 OpenJDK Runtime Environment (build 1.8.0_131-b12)
5 OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
6 [root@apache bin]# ln -s /opt/logstash/bin/logstash /usr/local/bin/

3.3.4、logstash(apache)與elasticsearch(node)功能是否正常,做對接測試

1 [root@apache bin]# logstash -e 'input { stdin{} } output { stdout{} }'
2 Settings: Default filter workers: 1
3 Logstash startup completed
4 www.baidu.com                       #隨便輸入幾個網址
5 2020-11-18T07:53:59.480Z apache www.baidu.com
6 www.163.com  
7 2020-11-18T07:54:12.187Z apache www.163.com
8 www.aliyun.com     
9 2020-11-18T07:54:36.980Z apache www.aliyun.com
1 logstash命令選項解釋:
2 -f:指定logstash的配置檔案,根據配置檔案配置logstash
3 -e:後面跟著字串,該字串可以被當做logstash的配置(如果是“ ”,則預設使用stdin做輸入,stdout為輸出)
4 -t:測試配置檔案是否正確,然後退出
5 #輸入採用標準輸入,輸出採用標準輸出

3.3.5、使用rubydebug顯示詳細輸出,codec為一種編解碼器

 1 [root@apache bin]# logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug } }'
 2 Settings: Default filter workers: 1
 3 Logstash startup completed
 4 www.baidu.com
 5 {
 6        "message" => "www.baidu.com",
 7       "@version" => "1",
 8     "@timestamp" => "2020-11-18T08:40:57.598Z",
 9           "host" => "apache"
10 }

3.3.6、使用logstash將資訊輸出給elasticsearch

1 [root@apache bin]# logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["20.0.0.10:9200"] } }'
2 Settings: Default filter workers: 1
3 Logstash startup completed
4 abc123      #輸入內容
5 tom456
6 123jerry

3.3.7、開啟瀏覽器輸入http://20.0.0.10:9200/_plugin/dead/,檢視索引資訊,顯示新的資料資訊說明輸出到elasticsearch成功

3.3.8、在apache主機中做對接配置,logstash收集系統日誌

 1 logstash配置檔案主要由三部分組成:input、output、filter
 2 [root@apache bin]# chmod o+r /var/log/messages   #允許其他使用者訪問
 3 [root@apache bin]#  ll /var/log/messages
 4 -rw----r--. 1 root root 250721 11月 18 16:40 /var/log/message
 5 
 6 [root@apache ~]# vi /etc/logstash/conf.d/system.conf
 7 input {                    #logstash輸入:從/var/log/messages輸入,型別為system,起始位                     置為從頭開始
 8         file {
 9           path => "/var/log/messages"
10           type => "system"
11           start_position => "beginning"
12         }
13       }
14 
15 output {                #logstash輸出:輸出給elasticsearch(以IP地址指定位置)
16         elasticsearch {
17         hosts => ["20.0.0.10:9200"]
18         index => "system-%{+YYY.MM.dd}"
19         }
20       }
21 
22 [root@apache ~]# systemctl restart logstash.service

3.3.9、開啟瀏覽器輸入http://20.0.0.10:9200/_plugin/dead/,檢視索引資訊,顯示新的索引資訊代表logstash蒐集到的日誌資訊成功輸出給elasticsearch

3.4、在node1主機安裝kibana

3.4.1、在node1主機安裝kibana

 1 上傳kibana-4.3.1-linux-x64.tar.gz到/root下
 2 [root@node1 ~]# tar zxf kibana-4.3.1-linux-x64.tar.gz 
 3 [root@node1 ~]# mv kibana-4.3.1-linux-x64 kibana
 4 [root@node1 ~]# mv kibana /usr/local/
 5 [root@node1 ~]# cd /usr/local/kibana/
 6 [root@node1 kibana]# vi config/kibana.yml 
 7 
 8 //2行 kibana開啟的埠
 9 server.port: 5601     
10 
11 //5行 kibana偵聽的地址
12 server.host: "0.0.0.0"
13 
14 
15 //12行 和elasticsearch建立聯絡
16 elasticsearch.url: "http://20.0.0.10:9200"
17 
18 //20行 在elasticsearch中新增.kibana索引
19 kibana.index: ".kibana"
20 
21 [root@node1 kibana]# yum -y install screen
22 
23 啟動kibana
24 [root@node1 kibana]# /usr/local/kibana/bin/kibana
25   log   [17:53:46.904] [info][status][plugin:kibana] Status changed from uninitialized to green - Ready
26   log   [17:53:46.933] [info][status][plugin:elasticsearch] Status changed from uninitialized to yellow - Waiting for Elasticsearch
27   log   [17:53:46.944] [info][status][plugin:kbn_vislib_vis_types] Status changed from uninitialized to green - Ready
28   log   [17:53:46.951] [info][status][plugin:markdown_vis] Status changed from uninitialized to green - Ready
29   log   [17:53:46.955] [info][status][plugin:metric_vis] Status changed from uninitialized to green - Ready
30   log   [17:53:46.958] [info][status][plugin:spyModes] Status changed from uninitialized to green - Ready
31   log   [17:53:46.966] [info][status][plugin:statusPage] Status changed from uninitialized to green - Ready
32   log   [17:53:46.969] [info][status][plugin:table_vis] Status changed from uninitialized to green - Ready
33   log   [17:53:46.978] [info][listening] Server running at http://0.0.0.0:5601
34   log   [17:53:51.976] [info][status][plugin:elasticsearch] Status changed from yellow to yellow - No existing Kibana index found
35   log   [17:53:54.602] [info][status][plugin:elasticsearch] Status changed from yellow to green - Kibana index ready

3.4.2、瀏覽器中登入20.0.0.10:5601,首次登入提示建立一個索引名字:
填入system-*,即對接系統日誌檔名

3.4.3、同時也能看到剛才在kibana.yml中新增的在elasticsearch中新增.kibana索引配置生效了(用於驗證kibana和elasticsearch是否成功連線)

3.4.4、新增logstash配置,收集apache服務的訪問日誌和錯誤日誌中的資料

 1 [root@apache ~]# cd /etc/logstash/conf.d/
 2 [root@apache conf.d]# vi apache_log.conf
 3 input {
 4         file {
 5           path => "/etc/httpd/logs/access_log"
 6           type => "access"
 7           start_position => "beginning"
 8         }
 9 
10         file {
11           path => "/etc/httpd/logs/error_log"
12           type => "error"
13           start_position => "beginning"
14         }
15    }
16 output {
17         if [type] == "access" {
18           elasticsearch {
19             hosts => ["20.0.0.10:9200"]
20             index => "apache_access-%{+YYY.MM.dd}"
21           }
22         }
23         if [type] == "error" {
24           elasticsearch {
25             hosts => ["20.0.0.10:9200"]
26             index => "apache_error-%{+YYY.MM.dd}"
27           }
28         }
29     }
30 
31 [root@apache conf.d]# logstash -f apache_log.conf    #指定logstash的配置檔案,根據apache_log.conf配置logstash(-f可以不重啟載入)

3.4.5、瀏覽器訪問http://20.0.0.10:9200/_plugin/head/,檢視apache日誌檔案的索引是否建立成功

Top

總結

ELK日誌分析系統是一款非常強大的日誌分析工具,能夠幫助運維工程師更快更準確的定位到想要的日誌,特別是kibana視覺化工具,功能強大,使用起來非常人性化