摘要
顧名思義ELK是由Elasticsearch,Logstash,Kibana三大組件構成的一個基於web頁面的日志分析工具。
日志分析是運維工程師解決系統故障,發現問題的主要手段。日志包含多種類型,包括程序日志,系統日志以及安全日志等。通過對日志分析,預發故障的發生,又可以在故障發生時,尋找到蛛絲馬跡,快速定位故障點。及時解決。
組件結構:
- Elasticsearch:是一個開源分布式時實分析搜索引擎,建立在全文搜索引擎庫Apache Lucene基礎上,同時隱藏了Apache Lucene的復雜性。Elasticsearch將所有的功能打包成一個獨立的動畫片,索引副本機制,RESTful風格接口,多數據源。自動搜索等特點。
- Logstash :是一個完全開源的工具,主要用於日志收集,同時可以對數據處理,並輸出給Elasticarch
- Kibana:也是一個完全開源的工具,kibana可以為Logstash和Elasticsearch提供圖形化的日志分析。Web界面,可以匯總,分析和搜索重要數據日志。
一、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)
二、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無縫之集成
- 整合數據,復雜數據分析
- 讓更多團隊成員受益
- 接口靈活,分享更容易
- 配置簡單,可視化多數據源
- 簡單數據導出
三、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/head/,查看索引信息,顯示新的數據信息說明輸出到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日志文件的索引是否建立成功
總結
ELK日志分析系統是一款非常強大的日志分析工具,能夠幫助運維工程師更快更准確的定位到想要的日志,特別是kibana可視化工具,功能強大,使用起來非常人性化