centos 7搭建ELK日誌分析系統

一、ELK的組成

ELK由ElasticSearch、Logstash和Kiabana三個開源工具組成,其官方網站爲https://www.elastic.co/cn

  • Elasticsearch:是個開源分佈實時分析搜索引擎,建立在全文搜索引擎庫Apache Lucens基礎上,同時隱藏了Apache Luces的複雜性。Elasticsearch將所有的功能打包成一個獨立的服務,並提供了一個簡單的RESTful API接口,它具有分佈式、零配置、自動發現、索引自動分片、索引副本機制、RESTful風格接口、多數據源、自動搜索負載等特點;

  • Logstash:是一個完全開源的工具,主要用於日誌收集,同時可以對數據處理,並輸出給Elasticsearch;

  • Kibana:也是一個開源和免費的工具,Kibana可以爲Logstash和Elasticsearch提供圖形化的日誌分析Web界面,可以彙總、分析和搜索重要數據日誌;

1、ELK的工作原理如下圖:

centos 7搭建ELK日誌分析系統
Logstash收集APPServer產生的Log,並存放到Elasticsearch羣集中,而Kibana則從ES羣集中查詢數據生成圖表,在返回給Browser。

簡單來說,進行日誌處理分析,一般需要經過以下幾個步驟:

  • 將日誌進行集中化管理;

  • 將日誌格式化(Logstash)並輸出到Elasticsearch;

  • 對格式化後的數據進行索引和存儲(Elasticsearch);

  • 前端數據的展示(Kibana);

2、Elasticsearch簡述

Elasticsearch是一個基於Lucene的搜索服務器,它穩定、可靠、快速,而且具有比較好的水平擴展能力、爲分佈式環境設計、在雲計算中被廣泛應用。Elasticsearch提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful Web接口。通過該接口,用戶可以通過瀏覽器和Elasticsearch通信。Elasticsearch使用Java開發的,並作爲Apache許可條款下的開放源碼分佈。Wikipedia、Stack、Overflow、GitHub等基於Elasticsearch來構建搜索引擎,所以具有實時搜索、穩定、可靠、快速、安裝使用方便等特點。

3、Elasticsearch的基礎核心概念

  • 接近實時(NRT):Elasticsearch是一個搜索速度接近實時的搜索憑條,相應速度非常快,從搜索一個文檔直到這個文檔能夠被搜索到只有一個輕微的延遲(一般情況下是1s);

  • 羣集(cluster):羣集就是由一個或多個節點組織在一起,在所有的節點上存放用戶數據,並一起提供索引和搜索功能,通過選舉產生主節點,並提供跨節點的聯合索引和搜索的功能。每個羣集都有一個標示的名稱,默認是Elasticsearch,每個節點是居於羣集名字加入到其羣集中的,一個羣集可以只有一個節點,爲了具備更好的容錯性,通常配置多個節點,在配置羣集時,建議配置爲羣集模式;

  • 節點(node):是指一臺單一的服務器,多個節點組織爲一個羣集,每個節點都存儲數據並參與羣集的索引和搜索功能。和羣集一樣,節點也是通過名字來標識的,默認情況下,在節點啓動時會隨機分配字符名,也可自定義。通過指定羣集名稱,節點可以加入到羣集中。默認情況下,每個節點都可以加入Elasticsearch羣集。如果羣集中有多個節點,它們將會自動組建一個名爲Elasticsearch的羣集;

  • 索引(Index):類似於關係型數據庫的中的“庫”。當索引一個文檔後,就可以使用Elasticsearch搜索到該文檔,也可以簡單地將索引理解爲存儲數據的地方,可以方便地進行全文索引。在index下面包含存儲數據庫的類型(Type),TYPE類似於關係型數據庫中的“表”,用來存放具體數據,而Type下面包含文檔(Document),文檔相當Yui關係型數據庫的“記錄”,一個文檔是一個可被索引的基礎信息單元;

  • 分片和副本:Elasticsearch將索引分爲若干部分,每個部分稱爲一個分片,每個分片就是一個全功能的獨立的索引。分片的數量一般在索引創建前指定,且創建索引後不能更改;分片的兩個最主要的原因:

  • 水平分割擴展,增大存儲量;

  • 分佈式並行跨分片操作,提高性能和吞吐量;
    一個好的數據存儲方案要求無論何種故障(如節點不可用)下數據都可用,並且具有較高的存儲效率。爲此,Elasticsearch將索引分片複製一份或多份,稱爲副本。副本是索引的另一個備份,用於數據冗餘以及負載分擔。默認情況下Elasticsearch自動對索引請求進行負載分擔。

總之,索引可以將分爲若干個分片。這些分片也可以被複制0次(沒有複製)或多次,當有副本存在是,作爲複製源的分片稱爲主分片,而作爲複製目標的分片稱爲複製分片。分片和副本的數量可以在索引創建時指定。在索引創建後,可以改變副本的數量,但是不能改變分片的數量。默認情況,Elasticsearch中的每個索引被分片爲5個主分片和1個副本。在兩個節點的場景下,每個索引都將會有5個主分片和另外5個副本分片,每個索引總共就有10個分片。

4、Logstash介紹

Logstash有JRuby語言編寫,運行在Java虛擬機(JVM)上,是一款強大的數據處理工具,可以實現數據傳輸、格式處理、格式化輸出。Logstash具有強大的插件功能,常用於日誌處理。Logstash可配置單一的代理端,與其他開源軟件結合,實現不同的功能。

Logstash的理念很簡單,它只做三件事:數據輸入、數據加工(如過濾、改寫等)以及數據輸出。通過組合輸入和輸出,可以實現鎖種需求。Logstash處理日誌時,典型的部署架構圖如下:
centos 7搭建ELK日誌分析系統

Logstash的主要組件:

  • Shipper:日誌收集者。負責監控本地日誌文件的變化,及時收集最新的日誌文件內容。通常,遠程代理端(agent)只需要運行這個組件即可;

  • Indexer:日誌存儲者。負責接收日誌並寫入到本地文件;

  • Broker:日誌Hub。負責連接多個Shipper和Indexer;

  • Search and Stronage:允許對事件進行搜索和存儲;

  • Web Interface:基於Web的展示界面;

正是由於以上組件在Logstash架構中可獨立部署,才提供了更好的羣集擴展性。
Logstash使用管道方式進行日誌的蒐集處理和輸出,優點類似Linux系統的管道命令,將前一個流程的處理結構發送到後一個流程繼續處理。在Logstash中,包括了三個階段,分別是輸入(input)、處理(Filter,非必需)和輸出(output),三者的關係如圖:
centos 7搭建ELK日誌分析系統centos 7搭建ELK日誌分析系統
如圖中,整個流程爲Input收集數據,Filter處理數據、Output輸出數據。每個階段也可以指定多種方式,如輸出既可以輸出到Elasticsearch中,也可以指定到stdout在控制檯打印。這種插件式的組織方式,使得Logstash的擴展和定製非常方便。

5、Kibana介紹

Kibana是一個針對Elasticsearch的開源分析及可視化平臺,主要設計用來和Elasticsearch一起工作,可以搜索、查看存儲在Elasticsearch索引中的數據,並通過各種圖表進行高級數據分析和展示。Kibana可以讓數據看起來一目瞭然。它的操作十分簡單,基於瀏覽器的用戶界面可以讓用戶在任何位置都可以實時瀏覽。Kibana可以快速創建儀表板實時顯示查詢動態。Kibana使用非常簡單,只需添加索引就可以檢測Elasticsearch索引數據。

1)Kibana的主要功能

  • Elasticsearch無縫之集成:Kibana架構是爲了Elasticsearch定製的,可以將任何(結構化和非結構化)數據加入Elasticsearch索引。Kibana還充分李永樂Elasticsearch強大的搜索和分析功能;

  • 整合數據:Kibana可以讓海量數量變得更容易理解,根據數據內容可以創建形象的柱形圖、折線圖、散點圖、直方圖、餅圖和地圖等,以便用戶查看;

  • 複雜數據分析:Kibana提升了Elasticsearch的分析能力,能夠更加智能地分析數據,執行數據轉換並且根據要求對數據切割分塊;

  • 讓更多團隊成員受益:強大的數據庫可視化接口讓各業務崗位都能夠從數據集合受益;

  • 接口靈活,分享更容易:使用Kibana可以更加方便地創建、保存、分享數據,並將可視化數據快速交流;

  • 配置簡單:Kibana的配置和啓用非常簡單,用戶體驗非常友好。Kibana自帶Web服務器,可以快速啓動運行;

  • 可視化多數據源:Kibana可以非常方便地把來自Logstash、ES-Hadoop、Beats多第三方技術的數據整合到Elasticsearch,支持的第三方技術包括Apache、Flume、Fluentd等;

簡單數據導出:Kibana可以方便地導出感興趣的數據,與其他數據集合並融合後快速建模分析,發現新結果;

二、搭建ELK平臺

案例環境如下:
centos 7搭建ELK日誌分析系統

準備安裝環境:
準備三臺服務器,分別根據上述環境表配置網絡參數,我這裏是192.168.100.10-30。其次關閉防火牆和Selinux。其中Centos01和Centos02節點分配4GB(>2GB)內存,Apache節點分配1GB內存。此案例自行連接廣域網。

本案例實現功能如下:

  • 配置ELK日誌分析羣集;
  • 使用Logsttash收集日誌;
  • 使用Kibana查看分析日誌;

本案例用到的所有程序包請訪問:https://pan.baidu.com/s/1OK49eAIwbvwIV5swe0-8-w
提取碼:yiad

1、centos01基礎環境配置

[root@localhost ~]# hostnamectl set-hostname centos01
[root@localhost ~]# bash
[root@centos01 ~]# 
[root@centos01 ~]# vim /etc/hosts
192.168.100.10 centos01
192.168.100.20 centos02
[root@centos01 ~]# 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)
[root@centos01 ~]# vim /etc/sysconfig/selinux 
SELINUX=disabled
[root@centos01 ~]# systemctl stop firewalld
[root@centos01 ~]# reboot

2、centos02基礎環境配置

[root@localhost ~]# hostnamectl set-hostname centos02
[root@localhost ~]# bash
[root@centos02 ~]# 
[root@centos02 ~]# vim /etc/hosts
192.168.100.10 centos01
192.168.100.20 centos02
[root@centos02 ~]# 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)
[root@centos02 ~]# vim /etc/sysconfig/selinux 
SELINUX=disabled
[root@centos02 ~]# systemctl stop firewalld
[root@centos02 ~]# reboot

3、centos01安裝Elasticsearch軟件

[root@centos01 ~]# ls            <!--通過rz命令上傳elasticsearch包-->
anaconda-ks.cfg  elasticsearch-5.6.16.rpm  initial-setup-ks.cfg
[root@centos01 ~]# yum -y install elasticsearch-5.6.16.rpm   <!--安裝elasticsearch程序-->
[root@centos01 ~]# vim /etc/elasticsearch/elasticsearch.yml <!--修改elasticsearch配置文件-->
cluster.name: ELK        <!--定義羣集名稱-->
node.name: centos01      <!--定義節點名稱-->
network.host: 192.168.100.10          <!--提供服務綁定的IP地址-->
http.port: 9200                                                        <!--服務監聽端口爲9200-->
discovery.zen.ping.unicast.hosts: ["centos01", "centos02"] <!--羣集發現通過單播的方式-->
[root@centos01 ~]# systemctl daemon-reload <!--配置以守護進程方式運行elasticsearch-->
[root@centos01 ~]# /etc/init.d/elasticsearch start       <!--啓動elasticsearch服務-->
[root@centos01 ~]# systemctl start elasticsearch        <!--啓動elasticsearch服務-->
[root@centos01 ~]# systemctl enable elasticsearch       <!--設置開機自動啓動-->
[root@centos01 ~]# netstat -anptu | grep 9200  
            <!--監聽elasticsearch服務是否啓動成功(需要耐心等待幾秒纔可以監聽到)-->
tcp6       0      0 192.168.100.10:9200     :::*                    LISTEN      1557/java  

4、centos02安裝Elasticsearch軟件

[root@centos02 ~]# ls            <!--通過rz命令上傳elasticsearch包-->
anaconda-ks.cfg  elasticsearch-5.6.16.rpm  initial-setup-ks.cfg
[root@centos02 ~]# yum -y install elasticsearch-5.6.16.rpm   <!--安裝elasticsearch程序-->
[root@centos02 ~]# vim /etc/elasticsearch/elasticsearch.yml <!--修改elasticsearch配置文件-->
cluster.name: ELK        <!--定義羣集名稱-->
node.name: centos02      <!--定義節點名稱-->
network.host: 192.168.100.20          <!--提供服務綁定的IP地址-->
http.port: 9200                                                        <!--服務監聽端口爲9200-->
discovery.zen.ping.unicast.hosts: ["centos01", "centos02"] <!--羣集發現通過單播的方式-->
[root@centos02 ~]# systemctl daemon-reload <!--配置以守護進程方式運行elasticsearch-->
[root@centos02 ~]# /etc/init.d/elasticsearch start       <!--啓動elasticsearch服務-->
[root@centos02 ~]# systemctl start elasticsearch        <!--啓動elasticsearch服務-->
[root@centos02 ~]# systemctl enable elasticsearch       <!--設置開機自動啓動-->
[root@centos02 ~]# netstat -anptu | grep 9200  
            <!--監聽elasticsearch服務是否啓動成功(需要耐心等待幾秒纔可以監聽到)-->
tcp6       0      0 192.168.100.20:9200     :::*                    LISTEN      1557/java  

5、通過客戶端訪問兩個節點

配置客戶端IP地址通過瀏覽器訪問centos01
centos 7搭建ELK日誌分析系統

配置客戶端IP地址通過瀏覽器訪問centos02
centos 7搭建ELK日誌分析系統

6、安裝elasticsearch-head圖形化管理ELK工具

1)centos01節點

<!--上傳node壓縮包,解壓縮安裝到/usr/local/中 -->
[root@centos01 ~]# ls
anaconda-ks.cfg  elasticsearch-5.6.16.rpm  initial-setup-ks.cfg  node-v4.2.2-linux-x64.tar.gz
[root@centos01 ~]# tar zxvf node-v4.2.2-linux-x64.tar.gz -C /usr/local/   <!---->
[root@centos01 local]# mv node-v4.2.2-linux-x64/ node   <!--修改名字爲node-->
[root@centos01 local]# ln -s /usr/local/node/bin/npm /usr/local/bin/npm<!--連接管理命令-->
[root@centos01 local]# ln -s /usr/local/node/bin/node /usr/local/bin/node<!--連接管理命令-->
[root@centos01 ~]# vim /etc/profile       <!--配置環境變量加載node-->
export NODE_HOME=/usr/local/node
export PATH=$PATH:$NODE_HOME/bin
export BODE_PATH=$NODE_HOME/lib/node_modules/
[root@centos01 ~]# source /etc/profile  <!--刷新環境變量-->
[root@centos01 ~]# vim /etc/elasticsearch/elasticsearch.yml   
                   <!--修改elasticsearch連接elasticsearch-head-->
http.cors.enabled: true 
http.cors.allow-origin: "*" 

<!--接下來安裝elasticsearch-head-->

[root@centos01 ~]# git clone git://github.com/mobz/elasticsearch-head.git   <!--配置安裝源-->
[root@centos01 ~]# ls
anaconda-ks.cfg  elasticsearch-5.6.16.rpm  elasticsearch-head  initial-setup-ks.cfg  node-v4.2.2-linux-x64.tar.gz
[root@centos01 ~]# mv elasticsearch-head /usr/local/<!--修改elasticsearch-head安裝位置-->
[root@centos01 ~]# cd /usr/local/elasticsearch-head/
[root@centos01 elasticsearch-head]# npm install -g grunt-cli    <!--安裝grunt-cli程序-->
[root@centos01 elasticsearch-head]# grunt -version    <!--檢查grunt是否安裝成功-->
grunt-cli v1.3.2
[root@centos01 ~]# vim /usr/local/elasticsearch-head/Gruntfile.js    
                       <!--修改elasticsearch-head的Gruntfile.js配置文件-->
99                                         keepalive: true, 
100                                         hostname: "*  
[root@centos01 ~]# vim /usr/local/elasticsearch-head/_site/app.js   
                         <!--修改elasticsearch-head的app.js配置文件-->
4374                         this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") 
|| "http://192.168.100.10:9200";    <!--將http後面的localhost改爲此服務器IP地址-->
<!--接下來開始安裝npm-->
[root@centos01 ~]# cd /usr/local/elasticsearch-head/    <!---->
[root@centos01 elasticsearch-head]# npm install     <!--安裝npm -->
[root@centos01 elasticsearch-head]# grunt server&<!--啓動grunt服務,將服務運行在後臺-->
[root@centos01 ~]# /etc/init.d/elasticsearch restart    <!--重啓elasticsearch服務-->
[root@centos01 ~]# netstat -anptu | grep 9200    <!--監聽elasticsearch服務是否啓動-->
tcp6       0      0 192.168.100.10:9200     :::*                    LISTEN      1557/java           
[root@centos01 ~]# netstat -anptu | grep 9100    <!--監聽grunt服務是否啓動-->
tcp6       0      0 :::9100                 :::*                    LISTEN      3400/grunt

centos02節點和centos01節點配置相同,就是改一下IP地址即可,參考centos01節點自行配置即可。

現在就可以通過瀏覽器訪問http://192.168.100.10:9100 去查看羣集信息了
centos 7搭建ELK日誌分析系統

7、安裝logstash

<!--上傳logstash壓縮包到服務器 -->
[root@centos01 ~]# ls
anaconda-ks.cfg  elasticsearch-5.6.16.rpm  initial-setup-ks.cfg  logstash-5.5.1.rpm  node-v4.2.2-linux-x64.tar.gz
[root@centos01 ~]# rpm -ivh logstash-5.5.1.rpm    <!--安裝logstash-->
[root@centos01 ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/<!--優化安裝命令-->
[root@centos01 ~]# mkdir -p /usr/share/logstash/config   <!--創建存儲數據目錄-->
[root@centos01 ~]# ln -s /etc/logstash/* /usr/share/logstash/config/<!--配置存儲數據目錄-->
[root@centos01 ~]# systemctl start logstash    <!--啓動logstash服務-->
[root@centos01 ~]# systemctl enable logstash   <!--設置開機自動啓動-->
[root@centos01 ~]# logstash -e 'input { stdin {} } output { stdout {} }'   
             <!--寫入測試數據,測試日誌服務器-->
The stdin plugin is now waiting for input:
www.baidu.com         <!--自行輸入,完成後強制退出-->
2019-12-19T07:44:26.487Z centos01 www.baidu.com

[root@centos01 ~]# logstash -e 'input { stdin {} } output { stdout { codec=> rubydebug } }' 
<!--寫入測試數據,測試日誌服務器-->
The stdin plugin is now waiting for input:
www.baidu.com   <!--自行輸入,完成後強制退出-->
{
    "@timestamp" => 2019-12-19T07:48:34.006Z,
      "@version" => "1",
          "host" => "centos01",
       "message" => "www.baidu.com"
}

[root@centos01 ~]# logstash -e 'input { stdin {} } output { elasticsearch { hosts =>
["192.168.100.10:9200"] } }'  <!--寫入測試數據,測試日誌服務器-->
The stdin plugin is now waiting for input:
www.baidu.com  <!--自行輸入,完成後強制退出-->

centos02和centos01是相同配置,請自行配置。

接下來通過客戶端瀏覽器訪問9100查看日誌
centos 7搭建ELK日誌分析系統

centos 7搭建ELK日誌分析系統

8、安裝kibana

<!--上傳kibana-5.5.1-x86_64.rpm包到服務器-->
[root@centos01 ~]# ls
anaconda-ks.cfg           initial-setup-ks.cfg     logstash-5.5.1.rpm
elasticsearch-5.6.16.rpm  kibana-5.5.1-x86_64.rpm  node-v4.2.2-linux-x64.tar.gz
[root@centos01 ~]# rpm -ivh kibana-5.5.1-x86_64.rpm   <!--安裝kibana-->
[root@centos01 ~]# vim /etc/kibana/kibana.yml  <!--修改kibana主配置文件-->
server.port: 5601   <!--服務監聽的端口號-->
server.host: "0.0.0.0"   <!--允許所有網段-->
elasticsearch.url: "http://192.168.100.10:9200"   <!--連接elasticsearch的url-->
[root@centos01 ~]# systemctl start kibana   <!--啓動kibana服務-->
[root@centos01 ~]# systemctl enable kibana   <!--設置開機自動啓動-->

centos02和上面相同配置,將連接elasticsearch的url的IP地址改爲centos02的IP地址即可,自行配置。

現在可以通過客戶端瀏覽器訪問5601端口
centos 7搭建ELK日誌分析系統

9、配置監控網站服務器

[root@centos03 ~]# yum -y install httpd   <!--安裝httpd-->
[root@centos03 ~]# systemctl start httpd    <!--啓動服務-->
[root@centos03 ~]# systemctl enable httpd   <!--設置開機自動啓動-->

<!--上傳logstash到網站服務器,安裝logstash-->

[root@centos03 ~]# ls
anaconda-ks.cfg  initial-setup-ks.cfg  logstash-5.5.1.rpm  
[root@centos03 ~]# rpm -ivh logstash-5.5.1.rpm   <!--安裝logstash-->
[root@centos03 ~]# vim /etc/logstash/conf.d/apache_error.conf <!--配置監控網站的錯誤日誌-->
input {
        file {
                path => "/var/log/httpd/error_log"
                type => "error"
                start_position => "beginning"
                }
}
output {
        if [type] == "error" {
                elasticsearch {
                        hosts => ["192.168.100.10:9200"]
                        index => "apache_error-%{+YYYY.MM.dd}"
                        }
                }
}  
[root@centos03 ~]# systemctl start logstash.service    <!--啓動logstash服務-->
[root@centos03 ~]# systemctl enable logstash.service  <!--設置開機自動啓動-->
[root@centos03 ~]# /usr/share/logstash/bin/logstash -f 
/etc/logstash/conf.d/apache_error.conf   <!--啓動監控網站服務器-->

1)現在可以通過瀏覽器訪問驗證是否監控成功

centos 7搭建ELK日誌分析系統

2)查看監控網站服務器的日誌

centos 7搭建ELK日誌分析系統

3)重啓網站服務器和監控服務;瀏覽器再次查看監控網站服務器的日誌

centos 7搭建ELK日誌分析系統
自行在kibana服務器添加索引。

—————— 本文至此結束,感謝閱讀 ——————

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