一、ELK 概述
1、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 優勢明顯,是對它的替代。
2、為什么要使用 ELK
日志主要包括系統日志、應用程序日志和安全日志。系統運維和開發人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日志可以了解服務器的負荷,性能安全性,從而及時采取措施糾正錯誤。
往往單台機器的日志我們使用grep、awk等工具就能基本實現簡單分析,但是當日志被分散的儲存不同的設備上。如果你管理數十上百台服務器,你還在使用依次登錄每台機器的傳統方法查閱日志。這樣是不是感覺很繁瑣和效率低下。當務之急我們使用集中化的日志管理,例如:開源的syslog,將所有服務器上的日志收集匯總。集中化管理日志后,日志的統計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統計,但是對於要求更高的查詢、排序和統計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
一般大型系統是一個分布式部署的架構,不同的服務模塊部署在不同的服務器上,問題出現時,大部分情況需要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日志系統,可以提高定位問題的效率。
3、完整日志系統基本特征
收集:能夠采集多種來源的日志數據
傳輸:能夠穩定的把日志數據解析過濾並傳輸到存儲系統
存儲:存儲日志數據
分析:支持 UI 分析
警告:能夠提供錯誤報告,監控機制
4、ELK 的工作原理:
(1)在所有需要收集日志的服務器上部署Logstash;或者先將日志進行集中化管理在日志服務器上,在日志服務器上部署 Logstash。
(2)Logstash 收集日志,將日志格式化並輸出到 Elasticsearch 群集中。
(3)Elasticsearch 對格式化后的數據進行索引和存儲。
(4)Kibana 從 ES 群集中查詢數據生成圖表,並進行前端數據的展示。
二、 ELK Elasticsearch 集群部署
Node1節點(2C/4G):node1/192.168.80.10 Elasticsearch Kibana
Node2節點(2C/4G):node2/192.168.80.11 Elasticsearch
Apache節點:apache/192.168.80.12 Logstash Apache
systemctl stop firewalld setenforce 0
1、在Node1、Node2節點上操作
1.環境准備
#更改主機名、配置域名解析、查看Java環境 Node1節點:hostnamectl set-hostname node1 Node2節點:hostnamectl set-hostname node2
vim /etc/hosts 192.168.80.10 node1 192.168.80.11 node2 java -version #如果沒有安裝,yum -y install 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)
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
(3)修改elasticsearch主配置文件
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 -antp | grep 9200
(6)查看節點信息
瀏覽器訪問 http://192.168.80.10:9200 、 http://192.168.80.11:9200 查看節點 Node1、Node2 的信息。
瀏覽器訪問 http://192.168.80.10:9200/_cluster/health?pretty 、 http://192.168.80.11:9200/_cluster/health?pretty查看群集的健康情況,可以看到 status 值為 green(綠色), 表示節點健康運行。
瀏覽器訪問 http://192.168.80.10: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 && 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 & > elasticsearch-head@0.0.0 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://192.168.80.10:9100/ 查看索引信息,可以看見索引默認被分片5個,並且有一個副本。
點擊“數據瀏覽”,會發現在node1上創建的索引為 index-demo,類型為 test 的相關信息。
2、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{} } output { 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 => ["192.168.80.10:9200"] #指定 elasticsearch 服務器的地址和端口 index =>"system-%{+YYYY.MM.dd}" #指定輸出到 elasticsearch 的索引格式 } } systemctl restart logstash
瀏覽器訪問 http://192.168.80.10:9100/ 查看索引信息
3、ELK Kiabana 部署(在 Node1 節點上操作)
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://192.168.80.10:5601
第一次登錄需要添加一個 Elasticsearch 索引:
Index name or pattern
//輸入:system-* #在索引名中輸入之前配置的 Output 前綴“system”
單擊 “create” 按鈕創建,單擊 “Discover” 按鈕可查看圖表信息及日志信息。
數據展示可以分類顯示,在“Available Fields”中的“host”,然后單擊 “add”按鈕,可以看到按照“host”篩選后的結果
5.將 Apache 服務器的日志(訪問的、錯誤的)添加到 Elasticsearch 並通過 Kibana 顯示
vim /etc/logstash/conf.d/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.80.10:9200"] index => "apache_access-%{+YYYY.MM.dd}" } } if [type] == "error" { elasticsearch { hosts => ["192.168.80.10:9200"] index => "apache_error-%{+YYYY.MM.dd}" } } } cd /etc/logstash/conf.d/ /usr/share/logstash/bin/logstash -f apache_log.conf
瀏覽器訪問 http://192.168.200.18:9100 查看索引是否創建
瀏覽器訪問 http://192.168.80.10:5601 登錄 Kibana,單擊“Create Index Pattern”按鈕添加索引, 在索引名中輸入之前配置的 Output 前綴 apache_access-*,並單擊“Create”按鈕。在用相同的方法添加 apache_error-*索引。
選擇“Discover”選項卡,在中間下拉列表中選擇剛添加的 apache_access-* 、apache_error-* 索引, 可以查看相應的圖表及日志信息。
4、Filebeat+ELK 部署
Node1節點(2C/4G):node1/192.168.200.18 Elasticsearch Kibana
Node2節點(2C/4G):node2/192.168.200.19 Elasticsearch
Apache節點:apache/192.168.200.17 Logstash Apache
Filebeat節點:filebeat/192.168.200.13 Filebeat
//在 Node2 節點上操作
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.設置 filebeat 的主配置文件
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.200.19 --------------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” 按鈕可查看圖表信息及日志信息。