1. 程式人生 > 其它 >ELK 日誌分析系統概述及部署

ELK 日誌分析系統概述及部署

ELK 日誌分析系統概述及部署

1、ELK概述:

ELK簡介 :

  ELK平臺是一套完整的日誌集中處理解決方案,將 ElasticSearch、Logstash 和 Kiabana 三個開源工具配合使用, 完成更強大的使用者對日誌的查詢、排序、統計需求
ElasticSearch:是基於Lucene(一個全文檢索引擎的架構)開發的分散式儲存檢索引擎,用來儲存各類日誌。
Elasticsearch 是用 Java 開發的,可通過 RESTful Web 介面,讓使用者可以通過瀏覽器與 Elasticsearch 通訊。
Elasticsearch 是個分散式搜尋和分析引擎,優點是能對大容量的資料進行接近實時的儲存、搜尋和分析操作。
Logstash:作為資料收集引擎。它支援動態的從各種資料來源蒐集資料,並對資料進行過濾、分析、豐富、統一格式等操作,然後儲存到使用者指定的位置,一般會發送給 Elasticsearch。
Logstash 由JRuby 語言編寫,執行在 Java 虛擬機器(JVM)上,是一款強大的資料處理工具, 可以實現資料傳輸、格式處理、格式化輸出。Logstash 具有強大的外掛功能,常用於日誌處理。
Kiabana:是基於 Node.js 開發的展示工具,可以為 Logstash 和 ElasticSearch 提供圖形化的日誌分析 Web 介面展示,可以彙總、分析和搜尋重要資料日誌。
Filebeat:輕量級的開源日誌檔案資料蒐集器。通常在需要採集資料的客戶端安裝 Filebeat,並指定目錄與日誌格式,Filebeat 就能快速收集資料,併發送給 logstash 進行解析,或是直接發給 Elasticsearch 儲存,效能上相比運行於 JVM 上的 logstash 優勢明顯,是對它的替代。

  

為什麼要使用 ELK :

  日誌主要包括系統日誌、應用程式日誌和安全日誌。系統運維和開發人員可以通過日誌瞭解伺服器軟硬體資訊、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以瞭解伺服器的負荷,效能安全性,從而及時採取措施糾正錯誤。
往往單臺機器的日誌我們使用grep、awk等工具就能基本實現簡單分析,但是當日志被分散的儲存不同的裝置上。如果你管理數十上百臺伺服器,你還在使用依次登入每臺機器的傳統方法查閱日誌。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日誌管理,例如:開源的syslog,將所有伺服器上的日誌收集彙總。集中化管理日誌後,日誌的統計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心

一般大型系統是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率。

完整日誌系統基本特徵 :

  • 收集:能夠採集多種來源的日誌資料
  • 傳輸:能夠穩定的把日誌資料解析過濾並傳輸到儲存系統
  • 儲存:儲存日誌資料
  • 分析:支援 UI 分析 警告:能夠提供錯誤報告,監控機制

ELK 的工作原理 :

  1. 在所有需要收集日誌的伺服器上部署Logstash;或者先將日誌進行集中化管理在日誌伺服器上,在日誌伺服器上部署 Logstash
  2. Logstash 收集日誌,將日誌格式化並輸出到 Elasticsearch 群集中
  3. Elasticsearch 對格式化後的資料進行索引和儲存
  4. Kibana 從 ES 群集中查詢資料生成圖表,並進行前端資料的展示

2、ELK Elasticsearch 叢集部署(在Node1、Node2節點上操作):

環境準備:

Node1節點(2C/4G):node1/20.0.0.20 Elasticsearch

Node2節點(2C/4G):node2/20.0.0.30 Elasticsearch

Apache節點:apache/20.0.0.40 Logstash Apache Kibana

systemctl stop firewalld
setenforce 0

1.環境準備
#更改主機名、配置域名解析、檢視Java環境
Node1節點:hostnamectl set-hostname node1
Node2節點:hostnamectl set-hostname node2

vim /etc/hosts
20.0.0.20   node1
20.0.0.40   node2

java -version	
#如果沒有安裝,yum -y install java 2.部署 Elasticsearch 軟體 (1)安裝elasticsearch—rpm包 #上傳elasticsearch-5.5.0.rpm到/opt目錄下 cd /opt rpm -ivh elasticsearch-5.5.0.rpm (2)載入系統服務 systemctl daemon-reload systemctl enable elasticsearch.service (node1 . 2 都要操作) (3)修改elasticsearch主配置檔案 node2 也要一樣的操作 cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak vim /etc/elasticsearch/elasticsearch.yml --17--取消註釋,指定叢集名字 cluster.name: my-elk-cluster --23--取消註釋,指定節點名字:Node1節點為node1,Node2節點為node2 node.name: node1 --33--取消註釋,指定資料存放路徑 path.data: /data/elk_data --37--取消註釋,指定日誌存放路徑 path.logs: /var/log/elasticsearch/ --43--取消註釋,改為在啟動的時候不鎖定記憶體 bootstrap.memory_lock: false --55--取消註釋,設定監聽地址,0.0.0.0代表所有地址 network.host: 0.0.0.0 --59--取消註釋,ES 服務的預設監聽埠為9200 http.port: 9200 --68--取消註釋,叢集發現通過單播實現,指定要發現的節點 node1、node2 discovery.zen.ping.unicast.hosts: ["node1", "node2"] grep -v "^#" /etc/elasticsearch/elasticsearch.yml (4)建立資料存放路徑並授權 mkdir -p /data/elk_data chown elasticsearch:elasticsearch /data/elk_data/ (5)啟動elasticsearch是否成功開啟 systemctl start elasticsearch.service netstat -natp | grep 9200 (6)檢視節點資訊 瀏覽器訪問 http://20.0.0.20:9200 、 http://20.0.0.30:9200 檢視節點 Node1、Node2 的資訊。 瀏覽器訪問 http://20.0.0.20:9200/_cluster/health?pretty 、
http://192.168.80.11:9200/_cluster/health?pretty檢視群集的健康情況,可以看到 status 值為 green(綠色), 表示節點健康執行。 瀏覽器訪問 http://20.0.0.20:9200/_cluster/state?pretty 檢查群集狀態資訊。 #使用上述方式檢視群集的狀態對使用者並不友好,可以通過安裝 Elasticsearch-head 外掛,可以更方便地管理群集。 3.安裝 Elasticsearch-head 外掛 Elasticsearch 在 5.0 版本後,Elasticsearch-head 外掛需要作為獨立服務進行安裝,需要使用npm工具(NodeJS的包管理工具)安裝。 安裝 Elasticsearch-head 需要提前安裝好依賴軟體 node 和 phantomjs。 node:是一個基於 Chrome V8 引擎的 JavaScript 執行環境。 phantomjs:是一個基於 webkit 的JavaScriptAPI,可以理解為一個隱形的瀏覽器,任何基於 webkit 瀏覽器做的事情,它都可以做到。 (1)編譯安裝 node #上傳軟體包 node-v8.2.1.tar.gz 到/opt yum install gcc gcc-c++ make -y cd /opt tar zxvf node-v8.2.1.tar.gz cd node-v8.2.1/ ./configure make -j4 && make install (2)安裝 phantomjs #上傳軟體包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到 cd /opt tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/ cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin cp phantomjs /usr/local/bin (3)安裝 Elasticsearch-head 資料視覺化工具 #上傳軟體包 elasticsearch-head.tar.gz 到/opt cd /opt tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/ cd /usr/local/src/elasticsearch-head/ npm install (4)修改 Elasticsearch 主配置檔案 vim /etc/elasticsearch/elasticsearch.yml ...... --末尾新增以下內容-- http.cors.enabled: true #開啟跨域訪問支援,預設為 false http.cors.allow-origin: "*" #指定跨域訪問允許的域名地址為所有 systemctl restart elasticsearch (5)啟動 elasticsearch-head 服務 #必須在解壓後的 elasticsearch-head 目錄下啟動服務,程序會讀取該目錄下的 gruntfile.js 檔案,否則可能啟動失敗。 cd /usr/local/src/elasticsearch-head/ npm run start & > [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 #elasticsearch-head 監聽的埠是 9100 netstat -natp |grep 9100 (6)通過 Elasticsearch-head 檢視 Elasticsearch 資訊 通過瀏覽器訪問 http://192.168.80.10:9100/ 地址並連線群集。如果看到群集健康值為 green 綠色,代表群集很健康。 (7)插入索引 #通過命令插入一個測試索引,索引為 index-demo,型別為 test。 curl -X PUT '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 } 瀏覽器訪問 http://20.0.0.20:9100/ 檢視索引資訊,可以看見索引預設被分片5個,並且有一個副本。 點選“資料瀏覽”,會發現在node1上建立的索引為 index-demo,型別為 test 的相關資訊。

  

3、ELK Logstash 部署(在 Apache 節點上操作):

Logstash 一般部署在需要監控其日誌的伺服器。在本案例中,Logstash 部署在 Apache 伺服器上,用於收集 Apache 伺服器的日誌資訊併發送到 Elasticsearch。

1.更改主機名
hostnamectl set-hostname apache

2.安裝Apahce服務(httpd)
yum -y install httpd
systemctl start httpd

3.安裝Java環境
yum -y install java
java -version

4.安裝logstash
#上傳軟體包 logstash-5.5.1.rpm 到/opt目錄下
cd /opt
rpm -ivh logstash-5.5.1.rpm                           
systemctl start logstash.service                      
systemctl enable logstash.service

ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

5.測試 Logstash
Logstash 命令常用選項:
-f:通過這個選項可以指定 Logstash 的配置檔案,根據配置檔案配置 Logstash 的輸入和輸出流。
-e:從命令列中獲取,輸入、輸出後面跟著字串,該字串可以被當作 Logstash 的配置(如果是空,則預設使用 stdin 作為輸入,stdout 作為輸出)。
-t:測試配置檔案是否正確,然後退出。

定義輸入和輸出流:
#輸入採用標準輸入,輸出採用標準輸出(類似管道)
logstash -e 'input { stdin{} } ouput { stdout{} }'
......
www.baidu.com										#鍵入內容(標準輸入)
2020-12-22T03:58:47.799Z node1 www.baidu.com		#輸出結果(標準輸出)
www.sina.com.cn										#鍵入內容(標準輸入)
2017-12-22T03:59:02.908Z node1 www.sina.com.cn		#輸出結果(標準輸出)

//執行 ctrl+c 退出

#使用 rubydebug 輸出詳細格式顯示,codec 為一種編解碼器
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
......
www.baidu.com										#鍵入內容(標準輸入)
{
    "@timestamp" => 2020-12-22T02:15:39.136Z,		#輸出結果(處理後的結果)
      "@version" => "1",
          "host" => "apache",
       "message" => "www.baidu.com"
}

#使用 Logstash 將資訊寫入 Elasticsearch 中
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.80.10:9200"] } }'
			 輸入				輸出			對接
......
www.baidu.com										#鍵入內容(標準輸入)
www.sina.com.cn										#鍵入內容(標準輸入)
www.google.com										#鍵入內容(標準輸入)

//結果不在標準輸出顯示,而是傳送至 Elasticsearch 中,可瀏覽器訪問 http://192.168.80.10:9100/ 檢視索引資訊和資料瀏覽。

6.定義 logstash配置檔案
Logstash 配置檔案基本由三部分組成:input、output 以及 filter(可選,根據需要選擇使用)。

#格式如下:
input {...}
filter {...}
output {...}

#在每個部分中,也可以指定多個訪問方式。例如,若要指定兩個日誌來原始檔,則格式如下:
input {
	file { path =>"/var/log/messages" type =>"syslog"}
	file { path =>"/var/log/httpd/access.log" type =>"apache"}
}

#修改 Logstash 配置檔案,讓其收集系統日誌/var/log/messages,並將其輸出到 elasticsearch 中。
chmod +r /var/log/messages					#讓 Logstash 可以讀取日誌

vim /etc/logstash/conf.d/system.conf
input {
    file{
        path =>"/var/log/messages"						#指定要收集的日誌的位置
        type =>"system"									#自定義日誌型別標識
        start_position =>"beginning"					#表示從開始處收集
    }
}
output {
    elasticsearch {										#輸出到 elasticsearch
        hosts => ["20.0.0.20:9200"]					#指定 elasticsearch 伺服器的地址和埠
        index =>"system-%{+YYYY.MM.dd}"					#指定輸出到 elasticsearch 的索引格式
    }
}

systemctl restart logstash 

瀏覽器訪問 http://20.0.0.20:9100/ 檢視索引資訊

4、ELK Kiabana 部署(在 Apache 節點上操作):

1.安裝 Kiabana
#上傳軟體包 kibana-5.5.1-x86_64.rpm 到/opt目錄
cd /opt
rpm -ivh kibana-5.5.1-x86_64.rpm

2.設定 Kibana 的主配置檔案
vim /etc/kibana/kibana.yml
--2--取消註釋,Kiabana 服務的預設監聽埠為5601
server.port: 5601
--7--取消註釋,設定 Kiabana 的監聽地址,0.0.0.0代表所有地址
server.host: "0.0.0.0"
--21--取消註釋,設定和 Elasticsearch 建立連線的地址和埠
elasticsearch.url: "http://192.168.80.10:9200" 
--30--取消註釋,設定在 elasticsearch 中新增.kibana索引
kibana.index: ".kibana"

3.啟動 Kibana 服務
systemctl start kibana.service
systemctl enable kibana.service

netstat -natp | grep 5601

4.驗證 Kibana
瀏覽器訪問 http://20.0.0.20:5601
第一次登入需要新增一個 Elasticsearch 索引:
Index name or pattern
//輸入:system-*			#在索引名中輸入之前配置的 Output 字首“system”

單擊 “create” 按鈕建立,單擊 “Discover” 按鈕可檢視圖表資訊及日誌資訊。
資料展示可以分類顯示,在“Available Fields”中的“host”,然後單擊 “add”按鈕,可以看到按照“host”篩選後的結果

5、cd /etc/logstash/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.184.10:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.184.10:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}

/usr/share/logstash/bin/logstash -f apache_log.conf



cd /etc/logstash/conf.d/
/usr/share/logstash/bin/logstash -f apache_log.conf

瀏覽器訪問 http://20.0.0.20:9100 檢視索引是否建立

瀏覽器訪問 http://20.0.0.20:5601 登入 Kibana,單擊“Create Index Pattern”按鈕新增索引, 在索引名中輸入之前配置的 Output 字首 apache_access-*,並單擊“Create”按鈕。在用相同的方法新增 apache_error-*索引。
選擇“Discover”選項卡,在中間下拉列表中選擇剛新增的 apache_access-* 、apache_error-* 索引, 可以檢視相應的圖表及日誌資訊。 

  

5、Filebeat+ELK 部署:

環境準備
Node1節點(2C/4G):20.0.0.20 Elasticsearch Filebeat Node2節點(2C4G):20.0.0.30 Elasticsearch Apache節點:20.0.0.40 Logstash Apache Kibana
//在 Node1 節點上操作
1.安裝 Filebeat
#上傳軟體包 filebeat-6.2.4-linux-x86_64.tar.gz 到/opt目錄
tar zxvf filebeat-6.2.4-linux-x86_64.tar.gz
mv filebeat-6.2.4-linux-x86_64/ /usr/local/filebeat


2.設定 Kibana 的主配置檔案
cd /usr/local/filebeat

vim filebeat.yml
filebeat.prospectors:
- type: log         #指定 log 型別,從日誌檔案中讀取訊息
  enabled: true
  paths:
    - /var/log/messages       #指定監控的日誌檔案
    - /var/log/*.log
  fields:           #可以使用 fields 配置選項設定一些引數欄位新增到 output 中
    service_name: filebeat
    log_type: log
    service_id: 192.168.80.13

--------------Elasticsearch output-------------------
(全部註釋掉)

----------------Logstash output---------------------
output.logstash:
  hosts: ["192.168.80.12:5044"]      #指定 logstash 的 IP 和埠

#啟動 filebeat
./filebeat -e -c filebeat.yml


4.在 Logstash 元件所在節點上新建一個 Logstash 配置檔案
cd /etc/logstash/conf.d

vim logstash.conf
input {
    beats {
        port => "5044"
    }
}
output {
    elasticsearch {
        hosts => ["192.168.80.10:9200"]
        index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
    }
    stdout {
        codec => rubydebug
    }
}

#啟動 logstash
logstash -f logstash.conf


5.瀏覽器訪問 http://192.168.80.10:5601 登入 Kibana,單擊“Create Index Pattern”按鈕新增索引“filebeat-*”,
單擊 “create” 按鈕建立,單擊 “Discover” 按鈕可檢視圖表資訊及日誌資訊。

  

自古英雄多磨難