ELK日誌分析系統 超詳細!!理論+實操講解!!

zero咯發表於2020-11-13


一、ELK日誌分析系統簡介

1.1日誌處理的步驟

1.將APP servers的日誌進行集中化管理到Logstash agent

2.將日誌格式化(Logstash)並輸出到Elasticsearch cluster

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

4.前端資料的展示(Kibana)

5.可以線上檢視介面化展示

1.2 ELK日誌分析系統三部分

  • Elasticsearch
  • Logstash
  • Kibana

Logstash 收集APP server產生的log,然後存放到Elasticsearch叢集節點中

kibana從Elasticsearch叢集節點中查詢資料生成圖表,再返回給Brower
在這裡插入圖片描述

1.3日誌伺服器(一般)

  • 提高安全性
  • 集中存放日誌
    -缺陷:對日誌的分析困難

二、Elasticsearch介紹

2.1 Elasticsearch概述

1.提供了一個分散式多使用者能力的全文搜尋引擎
2.是一個基於Lucene的搜尋伺服器
3.基於restful web介面
4.使用java開發
5.作為apache許可條款下的開放原始碼釋出,是第二流行的企業搜尋引擎
6.被設計用於雲端計算中,能夠達到實時搜尋、穩定、可靠、快速、安裝實用方便的需求

2.2 Elasticsearch的概念

  • 接近實時(NRT)
    Elasticsearch是一個接近即時的搜尋平臺,從索引一個文件知道這個文件能夠被搜尋到的過程中有一個輕微的延遲(通常是1S)

  • 叢集(cluster)
    由一個及其以上的節點組織在一起,它們共同持有整個資料,並一起提供索引和搜尋功能

其中一個節點為主節點,這個節點是可以通過選舉產生,並提供跨節點的聯合索引和搜尋的功能

叢集有一個唯一標識的名字,預設是elaticsearch

叢集名字很重要,每個節點是基於叢集名字加入到其叢集中;因此,要確保叢集的唯一性,在不同環境中使用不同的叢集名字

一個叢集只可以有一個節點,建議在配置elasticsearch時,配置成叢集模式

  • 節點(node)
    節點就是一臺單一的伺服器,是叢集的一部分,儲存資料並參與叢集的索引和搜尋功能

像叢集一樣,節點之間可是通過名字來標識區分,預設是在節點啟動時隨機分配的字元名

當然,你可以自己定義,該名字很重要,起到在叢集中定位到對應的節點

節點可以通過指定叢集名字來加入到叢集中,預設情況下,每個節點被設定成加入到elasticsearch叢集。

如果啟動了多個節點,假設能夠自動發現對方,他們將會自動組建一個名為elastisearch的叢集

  • 索引(index)——索引(庫)——型別(表)——文件(記錄)
    一個索引就是一個擁有幾分相似特徵的文件的集合

比如說,你可以有一個客戶資料的索引、一個產品目錄的索引、還有一個訂單資料的索引

一個索引用一個名字來標識(必須全部是小寫字母組合),並且當我們要對相應的索引中的文件進行索引、收縮、更新和刪除的時候,都要用到這個名字

在一個叢集中,可以定義多個索引

  • 型別(type)
    在一個索引中,你可以定義一種或多種型別

一個型別是你的索引的一個邏輯上的分類分割槽,其寓意完全由你來定義

通常,會為具有一組共同欄位的文件定義一個型別

比如:我們假設運營一個部落格平臺並且將所有的資料儲存到一個索引中,在這個索引中,你可以為使用者資料定義一個型別,為部落格資料定義一個型別,也可以為評論資料定義另一個型別

  • 文件(Document)
    一個文件是一個可被索引的基礎資訊單元

比如:你可以擁有一個客戶的文件,某一個產品的文件;文件以JSON(Javascript Object Notation)格式來表示,json是一個通用的網際網路資料互動模式

在一個index/type內,你可以儲存任意多的文件

注意:雖然一個文件在物理上位於一個索引內,但是實際上一個文件必須在一個索引內可以被索引和分配一個型別

  • 分片和副本 (shards & replicas)
    在實際情況下,索引儲存的資料可能超過單個節點的硬體設定

比如十億個文件需要1TB空間儲存,可能不適合儲存在單個節點上,讀寫被限制在單個節點;從單個節點搜尋請求也太慢了

為了解決這個問題,elasticsearch叢集提供將索引分割開,進行分片的功能

當建立索引時,可以定義想要分片的數量

每一個分片就是一個全功能的獨立的索引,可以位於叢集中的任何節點上

2.3 為什麼要採用分片

1.可以進行水平分割橫向擴充套件,增大儲存量

2.分散式並行跨分片操作,提高效能和吞吐量

2.4 開啟分片副本的主要原因

1.高可用性,以應對分片或者節點故障,處於這個原因,分片副本要在不同節點上
2.提高IO效能,增大吞吐量,搜尋可以並行在所有副本執行

1.總之,每個索引可以被分成多個分片,一個索引也可以被複制0次或者多次

2.一旦複製了,每個索引就有了主分片(可以作為複製源的原始分片)和複製分片(主分片的拷貝)之分

3.分片和副本的數量可以在索引建立的時候指定,在索引建立之後,你可以在任何時候動態改變副本的數量,但是你事後無法改變分片的數量

4.預設情況下,Elasticsearch中的每個索引被分片為5個主分片和1個副本,這意味著,如果你的叢集中至少有兩個節點的情況下,你的索引將會有5個主分片和另外5個副本分片(1個完全拷貝),這樣的話每個索引總共就有10個分片

三:Logstash介紹

3.1 Logstash概述

  • 一款強大的資料處理工具,可以實現資料傳輸、格式處理、格式化輸出
  • 工作思路:資料輸入(collect)、資料加工(如過濾、改寫等enrich)以及資料輸出(transport)
  • 由LRuby語言編寫,基於訊息(message-based)的簡單架構,並執行在Java虛擬機器(JVM)上。
  • 不同於分離的代理端(agent)或主機端(server),Logstash可配置單一的代理端(agent)與其他開源軟體結合,以實現不同的功能

3.2 Logstash主要元件

  • Shipper:日誌收集
    負責監控本地日誌檔案的變化,及時把日誌檔案的最新內容收集起來

通常,遠端代理端(agent)只需要執行這個元件即可

  • Indexer:日誌儲存
    負責接受日誌並寫入到本地檔案

  • Broker:日誌hub
    負責連結多個shipper和對應數目的indexer

  • Search and Storage
    允許對事件進行搜尋和儲存

  • Web Interface
    基於web的展示介面

以上元件在lLogstash架構中可以獨立部署,因此提供了很好的叢集擴充套件性

四:Kibana介紹

4.1 Kibana概述

  • 一個針對Elasticsearch的開源分析及視覺化平臺
  • 搜尋、檢視儲存在Elasticsearch索引中的資料
  • 通過各種圖示進行高階資料分析及展示
  • 讓海量資料更容易理解
  • 操作簡單,基於瀏覽器地使用者介面就可以快速建立儀表板(dashboard)實時顯示Elasticsearch查詢動態
  • 設定安裝Kibana非常簡單,無需編寫程式碼,幾分鐘內就可以完成Kibana安裝並啟動Elasticsearch監測

4.2 Kibana主要功能

  • Elasticsearch無縫之整合。Kibana架構為Elasticsearch定製,可以將任何結構化和非結構化加入Elasticsearch索引,Kibana還充分利用了Elasticsearch強大的搜尋和分析功能
  • 整合資料,複雜資料分析;根據海量資料建立柱形圖、折線圖、三代泥土、直方圖、餅圖和地圖;提升了Elasticsearch地分析能力,更夠更加智慧化地分析資料,執行數學轉化並且根據要求對資料切割分塊
  • 讓更多團隊成員受益;強大的資料視覺化讓各個業務崗位都可以直觀瞭解資料
  • 介面靈活,分享更容易;使用Kibana可以更加方便地建立儲存和分享資料,並將視覺化資料快速交流
  • 配置簡單,視覺化多資料來源;Kibana地配置和啟動非常簡單,使用者體驗友好,Kibana自帶web伺服器,可以快速執行;kibana可以非常方便地把來自logstash、ES-hadoop、Beats或第三方技術整合到Elasticsearch,支援地第三方技術包括apacheflume、fluentd等
  • 簡單資料匯出;Kibana可以方便地匯出感興趣地資料,與其他資料融合後快速建模分析,發現新結果

五:實操

環境:

IP地址節點安裝
20.0.0.101node1elasticsearch、node-v8.2.1.tar.gz、phantomjs
20.0.0.102node2elasticsearch、node-v8.2.1.tar.gz
20.0.0.103masterkibana、apache、logstash

實驗步驟

node1 配置

  1. 關閉防火牆與核心防護
[root@localhost ~]# hostnamectl set-hostname node1
[root@localhost ~]# su
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0

2.在兩個elk節點上配置域名解析,通過/etc/hosts檔案實現

[root@node2 ~]# vi /etc/hosts

在這裡插入圖片描述

[root@node1 ~]# java -version       ##檢查Java環境
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.安裝elasticsearch到opt目錄

[root@node1 ~]# cd /opt
[root@node1 opt]# rz -E
rz waiting to receive.
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm 

在這裡插入圖片描述
4.載入系統服務

[root@node1 opt]# systemctl daemon-reload 
[root@node1 opt]# systemctl enable elasticsearch.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

5.更改elasticsearch主配置檔案

[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml  /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml  
17 cluster.name: my-elk-cluster   ###叢集名字
23 node.name: node1           ####節點名字
33 path.data: /data/elk_data          ##資料存放路徑
37 path.logs: /var/log/elasticsearch/              ###日誌文存放目錄
43 bootstrap.memory_lock: false            ###不在啟動的時候鎖定記憶體
55 network.host: 0.0.0.0             ###提供服務繫結的IP地址,0.0.0.0代表所有地址
59 http.port: 9200            ####監聽埠9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]            ####叢集發現通過單播實現

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

[root@node1 opt]# mkdir -p /data/elk_data         ##建立日誌檔案目錄
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/        ####授權
[root@node1 opt]# systemctl start elasticsearch.service         ##開啟elasticsearch服務
[root@node1 opt]# netstat -anpt | grep 9200        ###過濾9200
tcp6       0      0 :::9200                 :::*                    LISTEN      38889/java       
[root@node1 opt]# systemctl status elasticsearch.service   ##檢視當前elasticsearch狀態

在這裡插入圖片描述
6.真機瀏覽器開啟http://20.0.0.101:9200/ 檢視節點資訊
在這裡插入圖片描述
7.檢查叢集健康狀態
http://20.0.0.101:9200/_cluster/health?pretty
在這裡插入圖片描述
8.上傳node-v8.2.1.tar.gz外掛到opt目錄

[root@node1 ~]# cd /opt
[root@node1 opt]# yum -y install gcc gcc-c++ make     //安裝依賴環境

在這裡插入圖片描述
9.編譯安裝node元件依賴包

[root@node1 opt]# tar xzvf node-v8.2.1.tar.gz
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./congfigure

在這裡插入圖片描述

[root@node1 node-v8.2.1]# make -j3 && make install

10.安裝phantomjs——前端框架,上傳到/usr/local/src目錄下

[root@node1 node-v8.2.1]# cd /usr/local/src
[root@node1 src]# ls
[root@node1 src]# rz -E
rz waiting to receive.
[root@node1 src]# ls
phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 src]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2  ## 解壓phantomjs壓縮包
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin              
[root@node1 bin]# cp phantomjs /usr/local/bin    //複製前端框架到bin目錄下

11.安裝elasticsearch-head.tar.gz 資料視覺化工具

[root@node1 bin]# cd /usr/local/src
[root@node1 src]# rz -E
rz waiting to receive.
[root@node1 src]# ls
elasticsearch-head.tar.gz     phantomjs-2.1.1-linux-x86_64.tar.bz2
phantomjs-2.1.1-linux-x86_64
[root@node1 src]# tar zxvf elasticsearch-head.tar.gz 
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install   

在這裡插入圖片描述
11.修改主配置檔案

[root@node1 elasticsearch-head]# cd ~
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml     ##配置檔案插在末尾
http.cors.enabled: true         ##開啟跨域訪問支援,預設的是false
http.cors.allow-origin: "*”           ####跨域訪問允許的域名地址

在這裡插入圖片描述

[root@node1 ~]# systemctl restart elasticsearch.service 
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &    //後臺執行

在這裡插入圖片描述

[root@node1 elasticsearch-head]# netstat -lunpt | grep 9200         //過濾9200
tcp6       0      0 :::9200                 :::*                    LISTEN      48735/java          
[root@node1 elasticsearch-head]# netstat -lunpt | grep 9100               //過濾9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      48486/grunt         

在這裡插入圖片描述
12.測試
真機開啟瀏覽器 http://20.0.0.101:9100/ 然後在elasticsearch後面的搜尋欄中輸入 http://20.0.0.101:9200/ 可以看到如下圖群集顯示健康是綠色的。
在這裡插入圖片描述
在這裡插入圖片描述
13.新增索引命令

[root@node2 elasticsearch-head]#  curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'

在這裡插入圖片描述

  • 配置Master伺服器
    1.安裝apache服務(httpd)
[root@master ~]# yum -y install httpd
[root@master ~]# systemctl start httpd.service     //開啟httpd服務
[root@master ~]# cd /var/log

在這裡插入圖片描述

[root@master log]# cd httpd/

在這裡插入圖片描述

[root@master ~]# java -version

在這裡插入圖片描述
2.安裝logstash

上傳logstash壓縮包到opt目錄下
[root@master ~]# cd /opt
[root@master opt]# rz -E
rz waiting to receive.
[root@master opt]# ls
logstash-5.5.1.rpm  rh

在這裡插入圖片描述

[root@master opt]# rpm -ivh logstash-5.5.1.rpm 
[root@master ~]# systemctl start logstash.service            ##開啟logstash服務
[root@master ~]# systemctl enable logstash.service            ##設定開機自啟
Created symlink from /etc/systemd/system/multi-user.target.wants/logstash.service to /etc/systemd/system/logstash.service.
[root@master ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/                     ###建立軟連結

3.輸入採用標準輸入,輸出採用標準輸出

[root@master ~]# logstash -e 'input { stdin{} } output { stdout{} }'
[root@master ~]# logstash -e 'input { stdin{} } output { stdout{codec=>rubydebug } }'
www.kgc.com  ###輸入內容
www.baidu.com    ###輸入

在這裡插入圖片描述
4.使用logstash將資訊寫入elasticsearch

[root@master ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["20.0.0.101:9200"] } }'
www.kgc.com
www.baidu.com

5.登入真機開啟瀏覽器輸入http://20.0.0.101:9100/ 檢視索引資訊
會增加如下圖所示的索引
在這裡插入圖片描述

[root@master ~]# chmod o+r /var/log/messages     //給其他人授予讀的許可權
[root@master ~]# ll /var/log/messages 
-rw----r--. 1 root root 2216038 Oct 29 03:17 /var/log/messages
[root@master ~]# cd /etc/logstash/

在這裡插入圖片描述
6.系統日誌檔案採集的配置檔案

[root@master logstash]# cd conf.d/
[root@master conf.d]# ls
[root@master conf.d]# vim system.conf
input {
        file{
        path => "/var/log/messages"
        type => "system"
        start_position => "beginning"
 }
}
output {
        elasticsearch {
        hosts => ["20.0.0.101:9200"]
        index => "system-%{+YYY.MM.dd}"
 }      
}
[root@master conf.d]# systemctl restart logstash.service   //重啟

7.登入真機開啟瀏覽器輸入http://20.0.0.101:9100/ 檢視索引資訊
會增加如下圖所示的索引
在這裡插入圖片描述
8.登入20.0.0.103 kibana主機
上傳kibana壓縮包到/usr/local/src目錄

[root@localhost ~]# hostnamectl set-hostname kibana
[root@localhost ~]# su
[root@kibana ~]# cd /usr/local/src
[root@kibana src]# rz -E
rz waiting to receive.

在這裡插入圖片描述

[root@kibana src]# rpm -ivh kibana-5.5.1-x86_64.rpm 
[root@kibana src]# cd /etc/kibana/
[root@kibana kibana]# cp kibana.yml kibana.yml.bak

9.修改kibana配置檔案

[root@kibana kibana]# vi kibana.yml      ###把該配置檔案中修改如下
2 server.port: 5601        ###kibana開啟的埠
7 server.host: "0.0.0.0"          ####kibana偵聽的地址
21 elasticsearch.url: "http://20.0.0.101:9200"     #####和elasticserach建立聯絡
30 kibana.index: ".kibana"         ##在elasticsearch中新增.kibana索引
[root@kibana kibana]# systemctl start kibana.service    ##啟動kibana服務
[root@kibana kibana]# systemctl enable kibana.service  ##開機自啟kibana服務
Created symlink from /etc/systemd/system/multi-user.target.wants/kibana.service to /etc/systemd/system/kibana.service.

Kibana 是為 Elasticsearch設計的開源分析和視覺化平臺。你可以使用 Kibana 來搜尋,檢視儲存在Elasticsearch 索引中的資料並與之互動。你可以很容易實現高階的資料分析和視覺化,以圖示的形式展現出來。

10.登入真機
瀏覽器輸入20.0.0.103:5601
建立一個索引名:system-* ###這是對接系統日誌檔案
如下圖所示
在這裡插入圖片描述

對接apache主機的apache日誌檔案

[root@master opt]# cd /etc/logstash/conf.d/
[root@master conf.d]# touch apache_log.conf
[root@master conf.d]# vi 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 => ["20.0.0.101:9200"]
        index => "apache_access-%{+YYY.MM.dd}"
  }
 }
        if [type] == "error" {
        elasticsearch {
        hosts => ["20.0.0.101:9200"]
        index => "apache_error-%{+YYY.MM.dd}"
  }
 }
}

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

11.登入主機
開啟輸入http://20.0.0.101:9100 檢視索引資訊,能發現apache_error apache_access

開啟瀏覽器輸入http://20.0.0.101:5601
點選左邊的management選項——》index patterns——》create index pattern——分別建立apache_error-*和 apache_access-*的索引
在這裡插入圖片描述

相關文章