Elk日誌分析系統

日誌分析是運維工程師解決系統故障、發現問題的主要手段。日誌包含多種類型,包括程序日誌、系統日誌以及安全日誌等。經過對日誌的分析,既能夠作到未雨綢繆、預防故障的發生,又能夠在故障發生時,尋找蛛絲馬跡、快速定位故障點。管理員也能夠經過體制瞭解到服務器的軟件信息、硬件信息、服務器負荷以及安全性相關的信息,如服務器是否被非法操做、磁盤空間是否即將耗盡、內存是否嚴重不足等。經過這些分析,管理員能夠及時採起措施。一般狀況下,每臺服務器或者客戶端都會產生日誌,相對而言,服務器日誌更加劇要,由於它存放着企業的重要數據,同時做爲服務器提供者,一旦出現問題,將影響全部客戶端的使用。一些大型的機房或者數據中心通常不會給服務器配置顯示設備,而逐臺遠程登陸設備查看日誌,須要每次系統認證成功後執行,且效率低下。
廣泛的作法就是日誌的集中管理,既將全部服務器的日誌集中發送到到日誌服務器中,如開源的Syslog。好處是能夠集中查看全部服務器的日誌,減輕了工做量,從安全性的角度來看,這種集中日誌管理能夠有效查詢以及跟蹤服務器日誌被非法操做的行爲,由於*非法進入的一瞬間,一些安全日誌已經被髮送到日誌服務器。好比銀行的監控系統,竊賊一旦發現監控設備,及時當即破壞這些設備也於事無補,由於監控畫面早已經發送至監控服務器器中。採用集中化管理日誌,也存在一些不足,如針對日誌的分析以及查找將變得十分困難,對日誌的逐條檢查雖然能夠獲取有價值的信息,可是工做量十分龐大,像Apache這樣的Web網站天天都有可能產生上萬條日誌。Linux雖然提供了文字編輯類的工具命令(如grep、awk、wc等),能夠快速定位已知關鍵字的日誌內容,卻沒法快速定位未知錯誤日誌。當面對更高要求的查詢、排序、統計以及數據分析時,加之龐大的機器數量。這些工具不免力不從心。開源實時日誌分析系統——ELK**應運而生。
ELK主要由三個開源工具組成:
Elasticsearch:是個開源分佈實時分析搜索引擎,創建在全文搜索引擎庫Apache Lucens基礎上,同時隱藏了Apache Luces的複雜性。Elasticsearch將全部的功能打包成一個獨立的服務,並提供了一個簡單的RESTful API接口,它具備分佈式、零配置、自動發現、索引自動分片、索引副本機制、RESTful風格接口、多數據源、自動搜索負載等特色;
Logstash:是一個徹底開源的工具,主要用於日誌收集,同時能夠對數據處理,並輸出到Elasticsearch;
Kibana:也是一個開源和免費的工具,Kibana能夠爲Logstash和Elasticsearch提供圖形化的日誌分析Web界面,能夠彙總、分析和搜索重要數據日誌;
ELK的工做原理,如圖:前端

大體意思就是:Logstash收集APPServer產生的Log,並存放到Elasticsearch羣集中,而Kibana則從羣集中查詢數據生成圖表,在返回給Browser。
簡單來講,進行日誌處理分析,通常須要通過如下幾個步驟:
(1)將日誌進行集中化管理;
(2)將日誌格式化(Logstash)並輸出到Elasticsearch;
(3)對格式化後的數據進行索引和存儲(Elasticsearch);
(4)前端數據的展現(Kibana);
下面開始詳細介紹構建ELK日誌分析系統的三個工具:
1.Elasticsearch概述
Elasticsearch是一個基於Lucene的搜索服務器,它穩定、可靠、快速,並且具備比較好的水平擴展能力、爲分佈式環境設計、在雲計算中被普遍應用。Elasticsearch提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful Web接口。經過該接口,用戶能夠經過瀏覽器和Elasticsearch通訊。Elasticsearch使用Java開發的,並做爲Apache許可條款下的開放源碼分佈。Wikipedia、Stack、Overflow、GitHub等基於Elasticsearch來構建搜索引擎,因此具備實時搜索、穩定、可靠、快速、安裝使用方便等特色。
Elasticsearch的基礎核心概念:
接近實時(NRT):Elasticsearch是一個搜索速度接近實時的搜索憑條,相應速度很是快,從搜索一個文檔直到這個文檔可以被搜索到只有一個輕微的延遲(通常狀況下是1s);
羣集(cluster):羣集就是由一個或多個節點組織在一塊兒,在全部的節點上存放用戶數據,並一塊兒提供索引和搜索功能,經過選舉產生主節點,並提供跨節點的聯合索引和搜索的功能。每一個羣集都有一個標示的名稱,默認是Elasticsearch,每一個節點是居於羣集名字加入到其羣集中的,一個羣集能夠只有一個節點,爲了具有更好的容錯性,一般配置多個節點,在配置羣集時,建議配置爲羣集模式;
節點(node):是指一臺單一的服務器,多個節點組織爲一個羣集,每一個節點都存儲數據並參與羣集的索引和搜索功能。和羣集同樣,節點也是經過名字來標識的,默認狀況下,在節點啓動時會隨機分配字符名,也可自定義。經過指定羣集名稱,節點能夠加入到羣集中。默認狀況下,每一個節點均可以加入Elasticsearch羣集。若是羣集中有多個節點,它們將會自動組建一個名爲Elasticsearch的羣集;
索引(Index):相似於關係型數據庫的中的「庫」。當索引一個文檔後,就可使用Elasticsearch搜索到該文檔,也能夠簡單地將索引理解爲存儲數據的地方,能夠方便地進行全文索引。在index下面包含存儲數據庫的類型(Type),TYPE相似於關係型數據庫中的「表」,用來存放具體數據,而Type下面包含文檔(Document),文檔至關Yui關係型數據庫的「記錄」,一個文檔是一個可被索引的基礎信息單元;
分片和副本:Elasticsearch將索引分爲若干部分,每一個部分稱爲一個分片,每一個分片就是一個全功能的獨立的索引。分片的數量通常在索引建立前指定,且建立索引後不能更改;
分片的兩個最主要的緣由:
(1)水平分割擴展,增大存儲量;
(2)分佈式並行跨分片操做,提升性能和吞吐量;
一個合格的數據存儲方案要求不管何種故障(如節點不可用)下數據均可用,而且具備較高的存儲效率。爲此,Elasticsearch將索引分片複製一份或多份,稱爲副本。副本是索引的另外一個備份,用於數據冗餘以及負載分擔。默認狀況下Elasticsearch自動對索引請求進行負載分擔。
總之,索引能夠將分爲若干個分片。這些分片也能夠被複制0次(沒有複製)或屢次,當有副本存在是,做爲複製源的分片稱爲主分片,而做爲複製目標的分片稱爲複製分片。分片和副本的數量能夠在索引建立時指定。在索引建立後,能夠改變副本的數量,可是不能改變分片的數量。默認狀況,Elasticsearch中的每一個索引被分片爲5個主分片和1個副本。在兩個節點的場景下,每一個索引都將會有5個主分片和另外5個副本分片,每一個索引總共就有10個分片。
2.Logstash概述
Logstash有JRuby語言編寫,運行在Java虛擬機(JVM)上,是一款強大的數據處理工具,能夠實現數據傳輸、格式處理、格式化輸出。Logstash具備強大的插件功能,經常使用於日誌處理。Logstash可配置單一的代理端,與其餘開源軟件結合,實現不一樣的功能。
Logstash的理念很簡單,它只作三件事:數據輸入、數據加工(如過濾、改寫等)以及數據輸出。經過組合輸入和輸出,能夠實現鎖種需求。Logstash處理日誌時,典型的部署架構圖以下:java

Logstash的主要組件:
Shipper:日誌收集者。負責監控本地日誌文件的變化,及時收集最新的日誌文件內容。一般,遠程代理端(agent)只須要運行這個組件便可;
Indexer:日誌存儲者。負責接收日誌並寫入到本地文件;
Broker:日誌Hub。負責鏈接多個Shipper和Indexer;
Search and Stronage:容許對事件進行搜索和存儲;
Web Interface:基於Web的展現界面;
正是因爲以上組件在Logstash架構中可獨立部署,才提供了更好的羣集擴展性。
Logstash使用管道方式進行日誌的蒐集處理和輸出,優勢相似Linux系統的管道命令,將前一個流程的處理結構發送到後一個流程繼續處理。在Logstash中,包括了三個階段,分別是輸入(input)、處理(Filter,非必需)和輸出(output),三者的關係如圖:node

流程圖中,整個流程爲Input收集數據,Filter處理數據、Output輸出數據。每一個階段也能夠指定多種方式,如輸出既能夠輸出到Elasticsearch中,也能夠指定到stdout在控制檯打印。這種插件式的組織方式,時的Logstash的擴展和定製很是方便。
3.Kibana概述
Kibana是一個針對Elasticsearch的開源分析及可視化平臺,主要設計用來和Elasticsearch一塊兒工做,能夠搜索、查看存儲在Elasticsearch索引中的數據,並經過各類圖表進行高級數據分析和展現。Kibana可讓數據看起來一目瞭然。它的操做十分簡單,基於瀏覽器的用戶界面可讓用戶在任何位置均可以實時瀏覽。Kibana能夠快速建立儀表板實時顯示查詢動態。Kibana使用很是簡單,只需添加索引就能夠檢測Elasticsearch環境。
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三個工具之間的對應關係,實驗拓補圖以下:linux

實驗須要實現的功能有:
(1)配置ELK日誌分析羣集;
(2)使用Logstash收集日誌;
(3)使用Kibana查看分析日誌;
1、環境準備
建議兩臺node服務器的內存不能小於4G!
時間必須一致,不然會出現意想不到的錯誤!
兩個ELK節點的配置幾乎一致,操做以下:
[root@localhost ~]# vim /etc/hosts
//修改hosts文件,配置域名解析,填寫如下內容
……………… //省略部份內容
192.168.1.1 node1
192.168.1.2 node2
[root@localhost ~]# vim /etc/hostname
//編寫配置主機名的文件,修改其中的內容爲:
node1
//節點1叫node1,node2叫node2
[root@localhost ~]# vim /etc/sysconfig/selinux
//編寫SELinux配置文件,,修改其中內容爲:
SELINUX=disable
[root@localhost ~]# systemctl disable firewalld
//設置防火牆開機自行關閉
[root@localhost ~]# java -version
openjdk version "1.8.0_102"
OpenJDK Runtime Environment (build 1.8.0_102-b14)
OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)
//檢查Java環境
[root@localhost ~]# reboot
//從新啓動系統
兩臺機器基本環境配置完成以後,接下來纔開始真正的部署ELK日誌分析系統!
關於部署ELK所需的全部軟件都在網盤連接:https://pan.baidu.com/s/1PeJk6KhiNiMpZeksUH1fJQ
提取碼:14ez
建議先在windows本地進行解壓,不然壓縮方式Linux系統不便進行解壓縮!
2、部署Elasticsearch軟件
在node1和node2節點上都要部署Elasticsearch,下面以node1爲例,node2配置與node1相同!
(1)安裝Elasticsearch軟件
Elasticsearch軟件能夠經過RPM安裝、YUM安裝或者源碼安裝,生產環境中用戶能夠根據實際狀況進行安裝方式的選擇,本章採用RPM方式進行安裝。
[root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm .
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable elasticsearch.service
//啓用超級守護進程,設置服務爲開機自啓動
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
//編寫服務的配置文件,修改如下內容
……………………………………………… //省略部份內容,修改如下內容便可
cluster.name: my-application //定義羣集名稱
node.name: node1 //定義節點名稱
path.data: /data/elk_data //數據存放位置
path.logs: /var/log/elasticsearch //日誌存放位置
bootstrap.memory_lock: false //在啓動時不鎖定內存
network.host: 0.0.0.0 //提供服務綁定的IP地址,0.0.0.0表明全部地址
http.port: 9200 //服務監聽端口爲9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"] //羣集發現經過單播的方式
[root@node1 ~]# mkdir -p /data/elk_data
[root@node1 ~]# chown -R elasticsearch:elasticsearch /data/elk_data/
//建立數據存放路徑並受權
[root@node1 ~]# systemctl start elasticsearch.service
//服務較大,耐心等待直到9200端口被監聽便可!
[root@node1 ~]# netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 3192/java
訪問測試,測試效果如圖:web

一樣的方式搭建node2,而後測試羣集效果,效果圖以下:數據庫

經過以上方式查看羣集的狀態對用戶並不友好,能夠安裝Elasticsearch—head插件,能夠更方便地管理羣集!
(2)安裝Elasticsearch—head插件
Elasticsearch在5.0版本後,Elasticsearch—head插件須要做爲獨立服務進行安裝,須要使用npm命令,那麼在安裝插件以前,須要安裝node和phantomjs。其中,前者基於Chrome V8 引擎的JavaScript運行環境,而phantomjs是一個基於webkit的JavaScriptAPI,能夠理解爲一個隱形的瀏覽器,任何基於webkit瀏覽器作的事情,它均可以!
實驗環境,這些插件只在node1上進行安裝,實際根據須要而定!
1.編譯安裝node,時間較長,耐心等待
[root@node1 ~]# tar zxf node-v8.2.1.tar.gz -C /usr/src
//注意:解壓後的目錄不能有中文路徑
[root@node1 ~]# cd /usr/src/node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure && make && make install
//編譯安裝node
2.安裝phantomjs
[root@node1 ~]# tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/src/
[root@node1 ~]# cd /usr/src/phantomjs-2.1.1-linux-x86_64/bin/
[root@node1 bin]# cp phantomjs /usr/local/bin
3.安裝Elasticsearch—head
[root@node1 ~]# tar zxf elasticsearch-head.tar.gz -C /usr/src
[root@node1 ~]# cd /usr/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
4.修改Elasticsearch主配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
……………… //省略部份內容,填寫如下兩行內容
http.cors.enabled: true //開啓跨域訪問支持
http.cors.allow-origin: "" //跨域訪問容許的域名地址
[root@node1 ~]# systemctl restart elasticsearch
//重啓服務
5.啓動Elasticsearch—head插件
啓動插件時,必須在解壓後的Elasticsearch—head目錄下啓動服務,進程會讀取該目錄下的Gruntfile.js文件,不然將會啓動失敗;Elasticsearch—head監聽的端口默認是9100,經過該端口來判斷服務器是否正常啓動。
[root@node1 ~]# cd /usr/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
//前臺啓動,一旦關閉中斷,服務也將隨之關閉
[root@node1 ~]# netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::
LISTEN 90295/java
[root@node1 ~]# netstat -anpt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 90413/grunt
//判斷Elasticsearch服務和Elasticsearch-head插件服務啓動成功
經過Elasticsearch—head查看Elasticsearch服務信息,如圖:apache

接下來,經過命令插入一個測試索引,命令以下:
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' \
-H 'Content-Type: application/json' -d \
'{"user":"zhangsan","mesg":"hello world"}'
再次刷新瀏覽器進行查看,如圖:npm

3、安裝Kibana
(1)在node1上配置安裝Kibana
[root@node1 ~]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@node1 ~]# systemctl enable kibana
//安裝Kibana,並配置爲開機自啓動
(2)編輯Kibana配置文件
[root@node1 ~]# vim /etc/kibana/kibana.yml
……………… //省略部份內容,修改如下內容
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.1.1:9200"
kibana.index: ".kibana"
(3)啓動服務
[root@node1 ~]# systemctl start kibana
[root@node1 ~]# netstat -anpt | grep 5601
tcp 0 0 0.0.0.0:5601 0.0.0.0:* LISTEN 90791/node
//kibana服務默認監聽端口是5601
(4)訪問測試json

其實到這裏,功能已經能夠實現了,當時爲了有更好的效果,建議搭建一臺Web服務器並安裝Logstash!
4、安裝Logstash
Logstash是部署在須要監控其日誌的應用服務器上!
(1)在Apache服務器上安裝Logstash
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
//安裝httpd服務,並啓動
[root@localhost ~]# rpm -ivh logstash-5.5.1.rpm
[root@localhost ~]# systemctl start logstash
(2)編寫Logstash服務的配置文件
Logstash配置文件有三部分組成:input、output、filter(根據須要),所以標準的格式爲:
input {...}
filter {...}
output {...}
在每一個部分中,也能夠指定多個訪問方式。例如:若要指定兩個日誌來源文件,則格式以下:
input {
file { path =>"/var/log/messages" type =>"syslog"}
file { path =>"/var/log/apache/access.log" type =>"apache"}
}
編寫logstash配置文件apache_log.conf
[root@localhost ~]# vim /etc/logstash/conf.d/apache_log.conf
//必須在這個目錄下,叫什麼文件名無所謂,內容以下:bootstrap

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.1.1:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.1.1:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
爲了讓Apache服務器產生一些日誌文件,建議找個PC多訪問幾回apache!
[root@localhost ~]# systemctl restart logstash
[root@localhost ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache_log.conf
//重啓服務,並指定配置文件
訪問測試,首先訪問9100端口,等待索引文件生成後,再訪問5601端口!如圖:

若是出現這種狀況,如圖:

可是仍是建議時間最好同步,不然不明白日誌產生的時間,從而作出錯誤的決定!!!同理添加錯誤日誌及系統日誌都是同樣的方法!若是是檢測Apache的系統日誌,Apache服務器上的配置文件就應該這樣寫![root@localhost ~]# chmod o+r /var/log/messages//首先受權[root@localhost ~]# vim /etc/logstash/conf.d/system.confinput {file{path => "/var/log/messages"type => "system"start_position => "beginning"}}output {elasticsearch {hosts => ["192.168.1.1:9200"]index => "system-%{+YYYY.MM.dd}"}}實驗完成

相關文章
相關標籤/搜索