ELK日誌分析系統部署搭建

前言

日誌分析是運維工程師解決系統故障,發現問題的主要手段。日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解服務器的負荷,性能安全性,從而及時採取措施糾正錯誤。通常,日誌被分散的儲存在不同的設備上。如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統方法查閱日誌,即繁瑣又效率低下。爲此,我們可以使用集中化的日誌管理,例如:開源的syslog,將所有服務器上的日誌收集彙總。
集中化管理日誌後,日誌的統計和檢索又成爲一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於更高要求的查詢、排序和統計等要求,再加上龐大的機器數量,使用這樣的方法依然難免有點力不從心

ELK介紹

開源實時日誌分析ELK平臺能夠完美的解決我們上述的問題,ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成。 Elasticsearch是個開源分佈式搜索引擎,它的特點有:分佈式,零配置,自動發現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。Logstash是一個完全開源的工具,它可以對你的日誌進行收集、過濾,並將其存儲,供以後使用(如,搜索)。Kibana 也是一個開源和免費的工具,Kibana可以爲 Logstash 和 ElasticSearch 提供友好的日誌分析Web 界面,可以幫助您彙總、分析和搜索重要數據日誌。

ELK工作原理展示圖

在這裏插入圖片描述
Logstash收集AppServer產生的Log,並存放到ElasticSearch集羣中,而Kibana則從ES集羣中查詢數據生成圖表,再返回給Browser
進行日誌處理分析,一般需要經過以下幾個步驟:

(1)將日誌進行集中化管理(beats)
(2)將日誌格式化(logstash)
(3)對格式化後的數據進行索引和存儲(elasticsearch)
(4)前端數據的展示(kibana)

Elasticsearch介紹

Elasticsearch是一個基於Lucene的搜索服務器,它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。
Elasticsearch的基礎核心概念:
(1)接近實時–NRT
Elasticsearch是一個接近實時的搜索平臺,所以,從索引一個文檔直到這個文檔能夠被搜索到有一個輕微的延遲(通常是1秒)
(2)集羣–cluster
一個集羣就是由一個或多個節點組織在一起,它們共同持有整個數據,並一起提供索引和搜索功能。其中一個節點爲主節點,這個主節點是可以通過選舉產生的,並提供跨節點的聯合索引和搜索的功能。集羣有一個唯一性標示的名字,默認是elasticsearch,集羣名字很重要,每個節點是基於集羣名字加入到其集羣中的。因此,確保在不同環境中使用不同的集羣名字。一個集羣可以只有一個節點。建議在配置elasticsearch時,配置成集羣模式。
(3)節點–node
節點就是一臺單一的服務器,是集羣的一部分,存儲數據並參與集羣的索引和搜索功能。像集羣一樣,節點也是通過名字來標識,默認是在節點啓動時隨機分配的字符名。當然,你可以自己定義。該名字也很重要,在集羣中用於識別服務器對應的節點。
節點可以通過指定集羣名字來加入到集羣中。默認情況,每個節點被設置加入到elasticsearch集羣。如果啓動了多個節點,假設能自動發現對方,他們將會自動組建一個名爲elasticsearch的集羣。
(4)索引–index
一個索引就是一個擁有幾分相似特徵的文檔的集合。比如說,你可以有一個客戶數據的索引,另一個產品目錄的索引,還有一個訂單數據的索引。一個索引由一個名字來標識(必須全部是小寫字母的),並且當我們要對對應於這個索引中的文檔進行索引、搜索、更新和刪除的時候,都要使用到這個名字。在一個集羣中,可以定義任意多的索引。

  • 索引相對於關係型數據庫的庫

(5)類型–type
在一個索引中,可以定義一種或多種類型。一個類型是索引的一個邏輯上的分類/分區,其語義完全由你來定。通常,會爲具有一組共同字段的文檔定義一個類型。比如說,假設你運營一個博客平臺並且將你所有的數據存儲到一個索引中。在這個索引中,你可以爲用戶數據定義一個類型,爲博客數據定義另一個類型,當然,也可以爲評論數據定義另一個類型。

  • 類型相對於關係型數據庫的表

(6)文檔–document
一個文檔是一個可被索引的基礎信息單元。比如,你擁有某一個客戶的文檔,某一個產品的一個文檔,當然,也可以擁有某個訂單的一個文檔。文檔以JSON(Javascript Object Notation)格式來表示,而JSON是一個到處存在的互聯網數據交互格式。
在一個index/type裏面,可以存儲任意多的文檔。注意,雖然一個文檔在物理上位於一個索引中,實際上一個文檔必須在一個索引內被索引和分配一個類型。

  • 文檔相對於關係型數據庫的列

(7)分片和副本–share&&replicas
在實際情況下,索引存儲的數據可能超過單個節點的硬件限制。如一個10億文檔需1TB空間,可能不適合存儲在單個節點的磁盤上,或者從單個節點搜索請求太慢了。爲了解決這個問題,elasticsearch提供將索引分成多個分片的功能。當在創建索引時,可以定義想要分片的數量。每一個分片就是一個全功能的獨立的索引,可以位於集羣中任何節點上。

  • 分片的兩個最主要原因:
    a. 水平分割擴展,增大存儲量
    b. 分佈式並行跨分片操作,提高性能和吞吐量

分佈式分片的機制和搜索請求的文檔如何彙總完全是有elasticsearch控制的,這些對用戶而言是透明的。網絡問題等等其它問題可以在任何時候不期而至,爲了健壯性,強烈建議要有一個故障切換機制,無論何種故障以防止分片或者節點不可用。 爲此,elasticsearch讓我們將索引分片複製一份或多份,稱之爲分片副本或副本。

  • 副本也有兩個最主要原因:
    a. 高可用性,以應對分片或者節點故障。出於這個原因,分片副本要在不同的節點上。
    b. 提高性能,增大吞吐量,搜索可以並行在所有副本上執行。

總之,每個索引可以被分成多個分片。一個索引也可以被複制0次(意思是沒有複製)或多次。一旦複製了,每個索引就有了主分片(作爲複製源的原來的分片)和複製分片(主分片的拷貝)之別。分片和副本的數量可以在索引創建的時候指定。在索引創建之後,可以在任何時候動態地改變副本的數量,但是你事後不能改變分片的數量。默認情況下,Elasticsearch中的每個索引被分片5個主分片和1個副本,這意味着,如果你的集羣中至少有兩個節點,你的索引將會有5個主分片和另外5個副本分片(1個完全拷貝),這樣的話每個索引總共就有10個分片

Logstash介紹

Logstash由JRuby語言編寫,基於消息(message-based)的簡單架構,並運行在Java虛擬機(JVM)上。不同於分離的代理端(agent)或主機端(server),LogStash可配置單一的代理端(agent)與其它開源軟件結合,以實現不同的功能
Logstash的理念很簡單,它只做3件事情:

  • Collect:數據輸入
  • Enrich:數據加工,如過濾,改寫等
  • Transport:數據輸出

1、logStash的主要組件:

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

正是由於以上組件在LogStash架構中可獨立部署,才提供了更好的集羣擴展性

2、LogStash主機分類:

  • 代理主機(agent host):作爲事件的傳遞者(shipper),將各種日誌數據發送至中心主機;只需運行Logstash 代理(agent)程序;
  • 中心主機(central host):可運行包括中間轉發器(Broker)、索引器(Indexer)、搜索和存儲器(Search and Storage)、Web界面端(Web Interface)在內的各個組件,以實現對日誌數據的接收、處理和存儲
Kibana介紹

Kibana是一個針對Elasticsearch的開源分析及可視化平臺,用來搜索、查看交互存儲在Elasticsearch索引中的數據。使用Kibana,可以通過各種圖表進行高級數據分析及展示。Kibana讓海量數據更容易理解。它操作簡單,基於瀏覽器的用戶界面可以快速創建儀表板(dashboard)實時顯示Elasticsearch查詢動態。設置Kibana非常簡單。無需編寫代碼,幾分鐘內就可以完成Kibana安裝並啓動Elasticsearch索引監測。
主要功能:
(1)Elasticsearch無縫之集成。Kibana架構爲Elasticsearch定製,可以將任何結構化和非結構化數據加入Elasticsearch索引。
Kibana還充分利用了Elasticsearch強大的搜索和分析功能。
(2)整合數據。Kibana能夠更好地處理海量數據,並據此創建柱形圖、折線圖、散點圖、直方圖、餅圖和地圖。
(3)複雜數據分析。Kibana提升了Elasticsearch分析能力,能夠更加智能地分析數據,執行數學轉換並且根據要求對數據切割分塊。
(4)讓更多團隊成員受益。強大的數據庫可視化接口讓各業務崗位都能夠從數據集合受益。
(5)接口靈活,分享更容易。使用Kibana可以更加方便地創建、保存、分享數據,並將可視化數據快速交流。
(6)配置簡單。Kibana的配置和啓用非常簡單,用戶體驗非常友好。Kibana自帶Web服務器,可以快速啓動運行。
(7)可視化多數據源。Kibana可以非常方便地把來自Logstash、ES-Hadoop、Beats或第三方技術的數據整合到Elasticsearch,支持的第三方技術包括Apache Flume、Fluentd等。
(8)簡單數據導出。Kibana可以方便地導出感興趣的數據,與其它數據集合並融合後快速建模分析,發現新結果。

實驗部署ELK日誌分析系統

實驗所需安裝包:
鏈接:https://pan.baidu.com/s/1JX2Ell6SFX1axi_jZX–Lw
提取碼:jjv7
1、安裝集羣方式,2個elasticsearch節點,並監控apache服務器日誌

主機 操作系統 主機名 IP地址 主要軟件
服務器 Centos7.6 node1 192.168.7.128 Elasticsearch、Kibana
服務器 Centos7.6 node2 192.168.7.129 Elasticsearch
服務器 Centos7.6 apache 192.168.7.134 Logstash、Apache

2、安裝配置Elasticsearch(在node1、node2節點上)
(1)設置環境,將需要的安裝包上傳至/opt目錄下

#安裝環境包
[root@localhost ~]# yum install gcc gcc-c++ -y
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# su
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# setenforce 0
[root@node1 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@node1 ~]# vim /etc/hosts
192.168.7.128   node1
192.168.7.129   node2
#查看Java環境
[root@node1 ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
#如果無Java環境需手動安裝
[root@node1 ~]# yum install java -y
#配置完成重啓虛擬機

(2)安裝elasticsearch

[root@node1 ~]# cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm 

(3)更改elasticsearch主配置文件

[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
#集羣名字
cluster.name: my-elk-cluster              
#節點名字
node.name: node1                          
#數據存放路徑
path.data: /data/elk_data                   
#日誌存放路徑
path.logs: /var/log/elasticsearch/      
#不在啓動的時候鎖定內存
bootstrap.memory_lock: false            
#提供服務綁定的IP地址,0.0.0.0代表所有地址
network.host: 0.0.0.0                           
#偵聽端口爲9200
http.port: 9200                                    
#集羣發現通過單播實現
discovery.zen.ping.unicast.hosts: ["node1", "node2"]     

(4)創建數據存放路徑並授權

[root@node1 opt]# mkdir -p /data/elk_data
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/

(5)加載系統服務

[root@node1 opt]# systemctl daemon-reload 

(6)啓動elasticsearch查看是否成功開啓

[root@node1 opt]# systemctl start elasticsearch.service
[root@node1 opt]# systemctl enable elasticsearch.service
[root@node1 opt]# netstat -natp | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      1542/java

(7)查看節點信息,使用瀏覽器打開http://192.168.7.128:9200
在這裏插入圖片描述在這裏插入圖片描述
(8)集羣檢查健康和狀態
①檢查集羣健康情況,使用瀏覽器打開http://192.168.7.128:9200/_cluster/health?pretty
在這裏插入圖片描述
②檢查集羣狀態信息使用瀏覽器打開http://192.168.7.128:9200/_cluster/state?pretty
在這裏插入圖片描述
3、安裝elasticsearch-head插件

  • 上述查看集羣的方式,及其不方便,我們可以通過安裝elasticsearch-head插件後,來管理集羣

(1)安裝環境依賴包node組件

[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
[root@node1 node-v8.2.1]# make -j3
[root@node1 node-v8.2.1]# make install

(2)安裝phantomjs

#上傳軟件包到/usr/local/src/
[root@node1 node-v8.2.1]# cd /usr/local/src/
[root@node1 src]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin

(3)安裝elasticsearch-head

#上傳軟件包到/usr/local/src/
[root@node1 bin]# cd /usr/local/src/
[root@node1 src]# tar xzvf elasticsearch-head.tar.gz
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install

(4)修改主配置文件

[root@node1 ~]# vi /etc/elasticsearch/elasticsearch.yml
#下面配置文件,插末尾
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@node1 ~]# systemctl restart elasticsearch

(5)啓動elasticsearch-head,啓動服務器

[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
[1] 81761
[root@node1 elasticsearch-head]# 
> [email protected] start /usr/local/src/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

[root@node1 ~]# netstat -natp | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      81689/java          
[root@node1 ~]# netstat -natp | grep 9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      81771/grunt 

(6)在瀏覽器輸入http://192.168.7.128:9100
在Elasticsearch 後面的欄目中輸入http://192.168.7.128:9200
然後點連接 會發現:集羣健康值: green (0 of 0)
在這裏插入圖片描述
在這裏插入圖片描述
(7)創建索引爲index-demo,類型爲test

[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
{
  "_index" : "index-demo",
  "_type" : "test",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "failed" : 0
  },
  "created" : true
}

(8)打開瀏覽器輸入http://192.168.7.128:9100查看索引信息
在這裏插入圖片描述
上面圖可以看見索引默認被分片5個,並且有一個副本
點擊數據瀏覽–會發現在node1上創建的索引爲index-demo,類型爲test, 相關的信息
在這裏插入圖片描述
4、安裝logstash並做一些日誌蒐集輸出到elasticsearch中(在apache節點上)
(1)安裝apache服務

[root@apache ~]# yum install httpd -y
[root@apache ~]# systemctl start httpd

(2)查看java環境,沒有需要安裝

[root@apache ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)

(3)安裝logstash

[root@apache ~]# cd /opt
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
[root@apache opt]# systemctl start logstash.service
[root@apache opt]# systemctl enable logstash.service
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

(4)對接測試logstash(Apache)與elasticsearch(node)功能是否正常
Logstash這個命令測試字段描述解釋:

  • -f:通過這個選項可以指定logstash的配置文件,根據配置文件配置logstash
  • -e:後面跟着字符串 該字符串可以被當做logstash的配置(如果是” ”,則默認使用stdin做爲輸入、stdout作爲輸出)
  • -t:測試配置文件是否正確,然後退出

①輸入採用標準輸入,輸出採用標準輸出

[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
······省略部分內容
22:32:58.734 [[main]-pipeline-manager] INFO  logstash.pipeline - Pipeline main started
The stdin plugin is now waiting for input:
22:32:58.830 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com			//手動輸入
2020-03-25T14:33:28.053Z apache www.baidu.com
www.sina.com.cn			//手動輸入
2020-03-25T14:33:39.763Z apache www.sina.com.cn

②使用rubydebug顯示詳細輸出,codec爲一種編解碼器

[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
······省略部分內容
22:39:01.592 [[main]-pipeline-manager] INFO  logstash.pipeline - Pipeline main started
The stdin plugin is now waiting for input:
22:39:01.658 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com
{
    "@timestamp" => 2020-03-25T14:39:08.238Z,
      "@version" => "1",
          "host" => "apache",
       "message" => "www.baidu.com"
}

③使用logstash將信息寫入elasticsearch中(輸入、輸出對接)

[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.7.128:9200"] } }'
······省略部分內容
22:41:59.327 [[main]-pipeline-manager] INFO  logstash.pipeline - Pipeline main started
The stdin plugin is now waiting for input:
22:41:59.411 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com
www.sina.com.cn

④打開瀏覽器輸入http://192.168.7.128:9100,查看索引信息
在這裏插入圖片描述在這裏插入圖片描述
(5)對接配置
Logstash配置文件主要由三部分組成:input、output、filter(根據需要配置)

[root@apache opt]# chmod o+r /var/log/messages
[root@apache opt]# ll /var/log/messages
-rw----r--. 1 root root 276152 3月  25 22:48 /var/log/messages
[root@apache opt]# vi /etc/logstash/conf.d/system.conf 
input {
       file{
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
        }
      }
output {
        elasticsearch {
          hosts => ["192.168.7.128:9200"]
          index => "system-%{+YYYY.MM.dd}"
          }
        }

[root@apache opt]# systemctl restart logstash.service

打開瀏覽器查看索引
在這裏插入圖片描述
5、安裝kibana(在node1節點)

#上傳kibana-5.5.1-x86_64.rpm 到/usr/local/src目錄
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@node1 src]# cd /etc/kibana/
[root@node1 kibana]# vi kibana.yml
# kibana打開的端口
server.port: 5601             
#kibana偵聽的地址
server.host: "0.0.0.0"        
#和elasticsearch建立聯繫
elasticsearch.url: "http://192.168.100.41:9200"       
#在elasticsearch中添加.kibana索引
kibana.index: ".kibana"   
   
[root@node1 kibana]# systemctl start kibana.service  
[root@node1 kibana]# systemctl enable kibana.service  

打開瀏覽器輸入http://192.168.7.128:5601
首次登陸需要創建一個索引名稱:system-*,這是對接系統日誌文件
在這裏插入圖片描述
6、對接Apache主機的Apache日誌文件(訪問日誌、錯誤日誌)

[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache conf.d]# touch apache_log.conf
[root@apache conf.d]# vim apache_log.conf 
input {
       file{
        path => "/etc/httpd/logs/access_log"
        type => "access"
        start_position => "beginning"
        }
       file{
        path => "/etc/httpd/logs/error_log"
        type => "error"
        start_position => "beginning"
        }

      }
output {
        if [type] == "access" {
        elasticsearch {
          hosts => ["192.168.7.128:9200"]
          index => "apache_access-%{+YYYY.MM.dd}"
          }
        }
        if [type] == "error" {
        elasticsearch {
          hosts => ["192.168.7.128:9200"]
          index => "apache_error-%{+YYYY.MM.dd}"
          }
        }
        }

[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf

使用瀏覽器訪問http://192.168.7.134,再訪問http://192.168.7.128:9100,查看索引信息
多出了兩個Apache的日誌文件信息
在這裏插入圖片描述
使用瀏覽器訪問地址http://192.168.7.128:5601,創建apache_error-*apache_access-*的索引
①先點擊management選項
在這裏插入圖片描述
②選擇index patterns
在這裏插入圖片描述
③點擊create index pattern創建索引
在這裏插入圖片描述
④創建完成就可以在discover項查看Apache的訪問日誌信息了
在這裏插入圖片描述

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