1、前言:前端
日誌分析是咱們運維解決系統故障、發現問題的主要手段。爲了能夠集中管理多臺服務器的日誌記錄,開源實時日誌分析ELK平臺應用而生,ELK由Elasticsearch、Logstash和Kibana三個開源工具組成,這三個工具能夠分別部署在不一樣的服務器上,而且相互關聯,不過須要收集哪臺服務器的日誌,就須在該服務器上部署Logstash。更多相關介紹,請移步至Elastic官網。java
ELK的工做原理以下(懂得其中原理,纔可部署一個高可用的ELK平臺):
Logstash收集APPServer(應用服務器)產生的log,並存放到Elasticsearch羣集中,而Kibana則從Elasticsearch羣集中查詢數據生成圖表,在返回給browser(瀏覽器)。簡單來講,進行日誌處理分析,通常須要如下幾個步驟:node
- Logstash將日誌進行集中化管理。
- 將日誌格式化(Logstash)並輸出到Elasticsearch。
- Elasticsearch對格式化後的數據進行索引和存儲。
- Kibana對前端數據的展現。
2、搭建ELK平臺:linux
(一)部署前準備:數據庫
[root@node1 ~]# hostname #查看主機名 node1 [root@node1 ~]# cat /etc/hosts #更改本地解析文件,添加以下兩行 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 node1 # 添加 192.168.1.2 node2 #添加 #添加完畢後,保存退出便可。 [root@node1 ~]# java -version #檢查Java環境 openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
node2節點:apache
[root@node2 ~]# hostname #查看主機名 node2 [root@node2 ~]# cat /etc/hosts #更改本地解析文件,添加以下兩行 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.1 node1 # 添加 192.168.1.2 node2 # 添加 [root@node2 ~]# java -version #檢查Java環境 openjdk version "1.8.0_161" OpenJDK Runtime Environment (build 1.8.0_161-b14) OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
(二)開始安裝Elasticsearch:
一、node1配置以下:npm
[root@node1 ~]# mount /dev/cdrom /media #掛載我提供的.iso文件 [root@node1 ~]# cd /media #切換至光盤掛載目錄 [root@node1 media]# cp * /usr/src #將全部軟件包複製至指定目錄 [root@node1 media]# cd /usr/src #切換至指定目錄 [root@node1 src]# rpm -ivh elasticsearch-5.5.0.rpm #安裝Elasticsearch。 [root@node1 src]# systemctl daemon-reload [root@node1 src]# systemctl enable elasticsearch.service #設置爲開機自啓動 Created symlink from /etc/systemd/system/multi-user.target.wants..................... [root@node1 src]# 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 #在啓動的時候不鎖定內存 network.host: 0.0.0.0 #提供服務綁定的IP地址,0.0.0.0表明全部地址 http.port: 9200 #偵聽端口 discovery.zen.ping.unicast.hosts: ["node1", "node2"] #羣集發現經過單播實現 #修改完畢後,保存退出便可。 [root@node1 src]# mkdir -p /data/elk_data #建立數據存放目錄 [root@node1 src]# chown -R elasticsearch:elasticsearch /data/elk_data/ #更改屬主及屬組 [root@node01 ~]# mkdir -p /var/log/elasticsearch/ [root@node01 ~]# chown -R elasticsearch:elasticsearch /var/log/elasticsearch/ [root@node1 src]# systemctl start elasticsearch.service #啓動服務 [root@node1 src]# netstat -anpt | grep 9200 #端口號不會立馬看到,啓動服務後再等待十秒左右纔可查看到 tcp6 0 0 :::9200 :::* LISTEN 3410/java
二、node2配置以下:bootstrap
[root@node2 ~]# mount /dev/cdrom /media #掛載我提供的.iso文件 [root@node2 ~]# cd /media #切換至光盤掛載目錄 [root@node2 media]# cp * /usr/src #將全部軟件包複製至指定目錄 [root@node2 media]# cd /usr/src #切換至指定目錄 [root@node2 src]# rpm -ivh elasticsearch-5.5.0.rpm #安裝Elasticsearch。 [root@node2 src]# systemctl daemon-reload [root@node2 src]# systemctl enable elasticsearch.service #設置爲開機自啓動 Created symlink from /etc/systemd/system/multi-user.target.wants..................... [root@node2 src]# scp root@192.168.1.1:/etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/ #將node1的配置文件複製過來 The authenticity of host '192.168.1.1 (192.168.1.1)' can t be established. ECDSA key fingerprint is SHA256:BS+lKMN05pYF3F1XeIYU69VnHjzKBiBiMZ1SDKgsxxs. ECDSA key fingerprint is MD5:ba:0b:a7:47:55:01:6f:41:41:5f:ee:b8:88:bf:7a:60. Are you sure you want to continue connecting (yes/no)? yes #輸入「yes」 Warning: Permanently added 192.168.1.1 (ECDSA) to the list of known hosts. root@192.168.1.1 s password: #輸入對端主機用戶的密碼 elasticsearch.yml 100% 2851 1.8MB/s 00:00 [root@node2 src]# vim /etc/elasticsearch/elasticsearch.yml #稍做修改 node.name: node2 #就更改一下節點名稱便可,其他不變 #更改後保存退出。 [root@node2 src]# mkdir -p /data/elk_data #建立數據存放目錄 [root@node2 src]# chown -R elasticsearch:elasticsearch /data/elk_data/ #更改屬主及屬組 [root@node01 ~]# mkdir -p /var/log/elasticsearch/ [root@node01 ~]# chown -R elasticsearch:elasticsearch /var/log/elasticsearch/ [root@node2 src]# systemctl start elasticsearch.service #啓動服務 [root@node2 src]# netstat -anpt | grep 9200 #同理,等會再查看端口 tcp6 0 0 :::9200 :::* LISTEN 4191/java
三、查看節點信息:vim
node1的節點信息:
node2的節點信息:
訪問http://192.168.1.1:9200/_cluster/health?pretty 查看羣集的健康狀態:
訪問http://192.168.1.1:9200/_cluster/state?pretty 查看羣集的狀態信息:
經過以上方式查看羣集狀體對咱們顯示的並不友好,能夠經過安裝Elasticsearch-head插件,能夠更方便的管理羣集:centos
在node1安裝Elasticsearch-head插件(須要提早安裝node和phantomjs):
[root@node1 src]# tar zxf node-v8.2.1.tar.gz #解壓node源碼包 [root@node1 src]# cd node-v8.2.1/ #切換至解壓後的目錄 [root@node1 node-v8.2.1]# ./configure && make && make install #安裝,時間較長,約需40分鐘左右 [root@node1 src]# tar jxf 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/ #複製該文件到指定目錄 [root@node1 bin]# cd /usr/src [root@node1 src]# tar zxf elasticsearch-head.tar.gz #解包 [root@node1 src]# cd elasticsearch-head/ #切換至解壓後的目錄 [root@node1 elasticsearch-head]# npm install #安裝依賴包 [root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml #編輯主配置文件,在任意位置添加以下兩行: http.cors.enabled: true #添加該行,開啓跨域訪問支持 http.cors.allow-origin: "*" #添加該行,跨域訪問容許的域名地址 [root@node1 elasticsearch-head]# systemctl restart elasticsearch #重啓服務 [root@node1 elasticsearch-head]# npm run start & #設置服務後臺啓動,若是前臺啓動,一旦關閉中斷,服務也將關閉。 #而且啓動服務時,必須在解壓後的elasticsearch-head下啓動服務, #進程會讀取該目錄下的一個文件,不然可能啓動失敗。 [root@node1 elasticsearch-head]# netstat -anpt | grep 9100 #查看端口號9100 tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 105465/grunt [root@node1 elasticsearch-head]# netstat -anpt | grep 9200 #查看端口號9200 tcp6 0 0 :::9200 :::* LISTEN 105380/java
如今就能夠經過瀏覽器訪問http://192.168.1.1:9100 去查看羣集信息了,以下:
四、安裝Kibana(可單獨安裝在一臺服務器上,我這裏資源有限,因此安裝在了node1上):
[root@node1 ~]# cd /usr/src [root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm #安裝Kibana [root@node1 src]# systemctl enable kibana #設置開機自啓 [root@node1 src]# vim /etc/kibana/kibana.yml #編輯主配置文件,修改如下幾項 server.port: 5601 #Kibana打開的端口 server.host: "0.0.0.0" #Kibana偵聽的地址,0.0.0.0表明該主機上的全部地址 elasticsearch.url: "http://192.168.1.1:9200" #和Elasticsearch創建鏈接 kibana.index: ".kibana" #在Elasticsearch中添加.kibana索引 [root@node1 src]# systemctl start kibana #啓動Kibana
五、配置apache服務器(自行搭建網站):
[root@Web ~]# systemctl start httpd #啓動httpd服務 [root@Web ~]# java -version #檢查Java環境是否爲1.8 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) [root@Web ~]# mount /dev/cdrom /media #掛載我提供的.iso文件 mount: /dev/sr0 寫保護,將以只讀方式掛載 [root@Web ~]# cd /media [root@Web media]# rpm -ivh logstash-5.5.1.rpm #安裝logstash [root@Web media]# systemctl daemon-reload [root@Web media]# systemctl enable logstash.service #設置開機自啓動 [root@Web media]# cd /etc/logstash/conf.d/ #切換至指定路徑 [root@Web conf.d]# vim apache_log.conf #編輯採集apache日誌文件和系統日誌 #如下就以系統日誌爲例作解釋,其他的照着來就行,格式都差很少 input { file{ path => "/var/log/messages" #指定要收集的日誌文件 type => "system" #指定類型爲system,能夠自定義,type值和output{ } 中的type對應便可 start_position => "beginning" #從開始處收集 } 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] == "system" { #若是type爲system, elasticsearch { #就輸出到Elasticsearch服務器 hosts => ["192.168.1.1:9200"] #Elasticsearch監聽地址及端口 index => "system-%{+YYYY.MM.dd}" #指定索引格式 } } 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}" } } } #寫完保存退出便可。 [root@Web ~]# chmod o+r /var/log/messages #賦予該目錄其餘人的讀權限 [root@Web conf.d]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ #建立命令軟鏈接 [root@Web conf.d]# systemctl start logstash #啓動服務 [root@Web conf.d]# logstash -f apache_log.conf & #指定剛纔編寫文件爲Logstash的配置文件,而且在後臺運行
六、建立索引:
一、經過瀏覽器訪問 http://192.168.1.1:9100 查看索引是否建立:
關於索引,有幾個很重要的概念:
剛纔建立的索引,在我標記紅框中,能夠看到node1和node2對應的位置,都有綠色背景的0、一、二、三、四、5表示是該索引被分爲了5個分片,其中由於在Logstash中指定的Elasticsearch服務器是node1,因此node1的分片是主分片,node2會自動同步node1的分片,node2的分片爲備份分片,稱爲副本,用來提供數據冗餘及負載分擔。默認狀況下,Elasticsearch自動對索引請求進行負載分擔。
如今訪問http://192.168.1.1:5601 登陸到Kibana,添加索引:
關於apache的錯誤日誌索引,自行添加便可,添加完畢後,單擊「discover」便可,在下面的下拉列表選擇一個索引,如apache_access-,能夠查看相應的圖表及日誌信息:
齊活....................