網站建設客戶告知書長春網站優(yōu)化團隊
一、 ELK日志分析系統(tǒng)概述
1、ELK簡介
ELK是三個開源軟件的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。新增了一個FileBeat,它是一個輕量級的日志收集處理工具(Agent),Filebeat占用資源少,適合于在各個服務器上搜集日志后傳輸給Logstash,官方也推薦此工具。
Elasticsearch是個開源分布式搜索引擎,提供搜集、分析、存儲數據三大功能。
它的特點有:分布式,零配置,自動發(fā)現,索引自動分片,索引副本機制,restful風格接口,多數據源,自動搜索負載等。主要負責將日志索引并存儲起來,方便業(yè)務方檢索查詢。
Logstash 主要是用來日志的搜集、分析、過濾日志的工具,支持大量的數據獲取方式。
一般工作方式為c/s架構,client端安裝在需要收集日志的主機上,server端負責將收到的各節(jié)點日志進行過濾、修改等操作在一并發(fā)往elasticsearch上去。
是一個日志收集、過濾、轉發(fā)的中間件,主要負責將各條業(yè)務線的各類日志統(tǒng)一收集、過濾后,轉發(fā)給 Elasticsearch 進行下一步處理。
Kibana 也是一個開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助匯總、分析和搜索重要數據日志。
2、 使用ELK的原因
日志主要包括系統(tǒng)日志、應用程序日志和安全日志。 系統(tǒng)運維和開發(fā)人員可以通過日志了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發(fā)生的原因。經常分析日志可以了解服務器的負荷, 性能安全性, 從而及時采取措施糾正錯誤。
往往單臺機器的日志我們使用grep、awk等工具就能基本實現簡單分析,但是當日志被分散的儲存不同的設備上。 如果你管理數十上百臺服務器,你還在使用依次登錄每臺機器的傳統(tǒng)方法查閱日志。這樣是不是感覺很繁瑣和效率低下。 當務之急我們使用集中化的日志管理, 例如∶ 開源的syslog,將所有服務器上的日志收集匯總。集中化管理日志后, 日志的統(tǒng)計和檢索又成為一件比較麻煩的事情,一般我們使用grep、awk和wc等Linux命令能實現檢索和統(tǒng)計,但是對于要求更高的查詢、排序和統(tǒng)計等要求和龐大的機器數量依然使用這樣的方法難免有點力不從心。
一般大型系統(tǒng)是一個分布式部署的架構,不同的服務模塊部署在不同的服務器上,問題出現時, 大部分情況需要根據問題暴露的關鍵信息,定位到具體的服務器和服務模塊,構建一套集中式日志系統(tǒng), 可以提高定位問題的效率。
3、 完整日志系統(tǒng)基本特征
收集∶能夠采集多種來源的日志數據
傳輸∶能夠穩(wěn)定的把日志數據解析過濾并傳輸到存儲系統(tǒng)
存儲∶存儲日志數據
分析∶支持 UI分析
警告∶能夠提供錯誤報告,監(jiān)控機制
4、ELK的工作原理
(1)在所有需要收集日志的服務器上部署Logstash; 或者先將日志進行集中化管理在日志服務器上, 在日志服務器上部署 Logs tash。
(2)Logstash 收集日志,將日志格式化并輸出到 Elasticsearch 群集中。
(3)Elasticsearch 對格式化后的數據進行索引和存儲。
(4)Kibana 從 ES 群集中查詢數據生成圖表,并進行前端數據的展示。
二、ELK日志分析系統(tǒng)集群部署的操作步驟
環(huán)境準備:
服務器類型 | IP地址 | 需要安裝的組件 | 硬件 |
---|---|---|---|
Node1節(jié)點 | 192.168.2.22 | Elasticsearch 、 Kibana | 2核4G |
Node2節(jié)點 | 192.168.2.66 | Elasticsearch | 2核4G |
Apache節(jié)點 | 192.168.2.200 | Logstash、Apache | 2核4G |
所有服務器關閉防火墻和SElinux
systemctl stop firewalld
setenforce 0
1、 ELK Elasticsearch 集群部署(在Node1、Node2節(jié)點上操作)
1.1、更改主機名、配置域名解析、查看Java環(huán)境
Node1節(jié)點:hostnamectl set-hostname node1
Node2節(jié)點:hostnamectl set-hostname node2vim /etc/hosts
192.168.2.22 node1
192.168.2.66 node2java -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)
1.2、部署 Elasticsearch 軟件
(1)安裝elasticsearch—rpm包
#上傳elasticsearch-5.5.0.rpm到/opt目錄下
cd /opt
rpm -ivh elasticsearch-5.5.0.rpm
(2)加載系統(tǒng)服務
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--取消注釋,指定節(jié)點名字:Node1節(jié)點為node1,Node2節(jié)點為node2
node.name: node1
--33--取消注釋,指定數據存放路徑
path.data: /data/elk_data
--37--取消注釋,指定日志存放路徑
path.logs: /var/log/elasticsearch/
--43--取消注釋,改為在啟動的時候不鎖定內存
bootstrap.memory_lock: false
--55--取消注釋,設置監(jiān)聽地址,0.0.0.0代表所有地址
network.host: 0.0.0.0
--59--取消注釋,ES 服務的默認監(jiān)聽端口為9200
http.port: 9200
--68--取消注釋,集群發(fā)現通過單播實現,指定要發(fā)現的節(jié)點 node1、node2
discovery.zen.ping.unicast.hosts: ["node1", "node2"]grep -v "^#" /etc/elasticsearch/elasticsearch.yml
(4)創(chuàng)建數據存放路徑并授權
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/
(5)啟動elasticsearch是否成功開啟
systemctl start elasticsearch.service
netstat -antp | grep 9200
(6)查看節(jié)點信息
瀏覽器訪問?http://192.168.2.22:9200?、?http://192.168.2.66:9200?查看節(jié)點 Node1、Node2 的信息。
瀏覽器訪問?http://192.168.2.22:9200/cluster/health?pretty?、?http://192.168.2.66:9200/cluster/health?pretty查看群集的健康情況,可以看到?status 值為 green(綠色), 表示節(jié)點健康運行。
瀏覽器訪問?http://192.168.2.22:9200/cluster/state?pretty?檢查群集狀態(tài)信息。
#使用上述方式查看群集的狀態(tài)對用戶并不友好,可以通過安裝 Elasticsearch-head 插件,可以更方便地管理群集。
1.3.安裝 Elasticsearch-head 插件
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作為獨立服務進行安裝,需要使用npm工具(NodeJS的包管理工具)安裝。
安裝 Elasticsearch-head 需要提前安裝好依賴軟件 node 和 phantomjs。
node:是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。
phantomjs:是一個基于 webkit 的JavaScriptAPI,可以理解為一個隱形的瀏覽器,任何基于 webkit 瀏覽器做的事情,它都可以做到。
(1)編譯安裝 node
#上傳軟件包 node-v8.2.1.tar.gz 到/opt
yum install gcc gcc-c++ make -ycd /opt
tar zxvf node-v8.2.1.tar.gzcd node-v8.2.1/
./configure
make && make install
(2)安裝 phantomjs
#上傳軟件包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到
vim /etc/elasticsearch/elasticsearch.yml
......
--末尾添加以下內容--
http.cors.enabled: true #開啟跨域訪問支持,默認為 false
http.cors.allow-origin: "*" #指定跨域訪問允許的域名地址為所有systemctl restart elasticsearch
(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 serverRunning "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100#elasticsearch-head 監(jiān)聽的端口是 9100
netstat -natp |grep 9100
(6)通過 Elasticsearch-head 查看 Elasticsearch 信息
通過瀏覽器訪問?http://192.168.2.22: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.2.22:9100/?查看索引信息,可以看見索引默認被分片5個,并且有一個副本。
點擊“數據瀏覽”,會發(fā)現在node1上創(chuàng)建的索引為 index-demo,類型為 test 的相關信息。
2、實例操作: ELK Elasticsearch 集群部署(在Node1、Node2節(jié)點上操作)
關閉防火墻
2.1、更改主機名、配置域名解析、查看Java環(huán)境
2.2、部署 Elasticsearch 軟件
(1)安裝elasticsearch—rpm包
(2)加載系統(tǒng)服務
(3)修改elasticsearch主配置文件
(4)創(chuàng)建數據存放路徑并授權
(5)啟動elasticsearch是否成功開啟
上面的步驟均需要在node1 node2操作,這里只列舉了Node1的配置,兩者配置相同,只需將配置文件中的Node節(jié)點名稱修改即可
(6)查看節(jié)點信息
查看node1和node2節(jié)點信息
檢查群集狀態(tài)信息
1.3.安裝 Elasticsearch-head 插件(node1 node2)
(1)編譯安裝 node
(2)安裝 phantomjs
(3)安裝 Elasticsearch-head 數據可視化工具
(4)修改 Elasticsearch 主配置文件
(5)啟動 elasticsearch-head 服務
(6)通過 Elasticsearch-head 查看 Elasticsearch 信息
(7)插入索引
3、 ELK Logstash 部署(在 Apache 節(jié)點上操作)
Logstash 一般部署在需要監(jiān)控其日志的服務器。在本案例中,Logstash 部署在 Apache 服務器上,用于收集 Apache 服務器的日志信息并發(fā)送到 Elasticsearch。
3.1.更改主機名
hostnamectl set-hostname apache
3.2.安裝Apahce服務(httpd)
yum -y install httpd
systemctl start httpd
3.3.安裝Java環(huán)境
yum -y install java
java -version
3.4.安裝logstash
#上傳軟件包 logstash-5.5.1.rpm 到/opt目錄下
cd /opt
rpm -ivh logstash-5.5.1.rpm
systemctl start logstash.service
systemctl enable logstash.serviceln -s /usr/share/logstash/bin/logstash /usr/local/bin/
3.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 #輸出結果(標準輸出)//執(zhí)行 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.229.90:9200"] } }'
輸入 輸出 對接
......
www.baidu.com #鍵入內容(標準輸入)
www.sina.com.cn #鍵入內容(標準輸入)
www.google.com #鍵入內容(標準輸入)
//結果不在標準輸出顯示,而是發(fā)送至 Elasticsearch 中,可瀏覽器訪問?http://192.168.2.22:9100/?查看索引信息和數據瀏覽。
3.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 配置文件,讓其收集系統(tǒng)日志/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.229.90:9200"] #指定 elasticsearch 服務器的地址和端口
index =>"system-%{+YYYY.MM.dd}" #指定輸出到 elasticsearch 的索引格式
}
}systemctl restart logstash
瀏覽器訪問?http://192.168.2.22:9100/?查看索引信息
4、實例操作: ELK Logstash 部署(在 Apache 節(jié)點上操作)
4.1.更改主機名
4.2.安裝Apahce服務(httpd)
4.3.安裝Java環(huán)境
3.4.安裝logstash
3.5.測試 Logstash
定義輸入和輸出流:輸入采用標準輸入,輸出采用標準輸出(類似管道)
定義輸入和輸出流:使用 rubydebug 輸出詳細格式顯示,codec 為一種編解碼器
3.6.定義 logstash配置文件
5、 ELK Kiabana 部署(在 Node1 節(jié)點上操作)
5.1.安裝 Kiabana
#上傳軟件包 kibana-5.5.1-x86_64.rpm 到/opt目錄
cd /opt
rpm -ivh kibana-5.5.1-x86_64.rpm
5.2.設置 Kibana 的主配置文件
vim /etc/kibana/kibana.yml
--2--取消注釋,Kiabana 服務的默認監(jiān)聽端口為5601
server.port: 5601
--7--取消注釋,設置 Kiabana 的監(jiān)聽地址,0.0.0.0代表所有地址
server.host: "0.0.0.0"
--28--取消注釋,配置es服務器的ip,如果是集群則配置該集群中master節(jié)點的ip
elasticsearch.url: ["http://192.168.2.22:9200"]
--37--取消注釋,設置在 elasticsearch 中添加.kibana索引
kibana.index: ".kibana"
--96--取消注釋,配置kibana的日志文件路徑(需手動創(chuàng)建),不然默認是messages里記錄日志
logging.dest: /var/log/kibana.log
5.3.啟動 Kibana 服務
systemctl start kibana.service
systemctl enable kibana.servicenetstat -natp | grep 5601
5.4.驗證 Kibana
瀏覽器訪問?http://192.168.2.22:5601
第一次登錄需要添加一個 Elasticsearch 索引:
Index name or pattern
//輸入:system-* #在索引名中輸入之前配置的 Output 前綴“system”
單擊 “create” 按鈕創(chuàng)建,單擊 “Discover” 按鈕可查看圖表信息及日志信息。
數據展示可以分類顯示,在“Available Fields”中的“host”,然后單擊 “add”按鈕,可以看到按照“host”篩選后的結果
5.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.2.22:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.2.22:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}cd /etc/logstash/conf.d/
/usr/share/logstash/bin/logstash -f apache_log.conf
瀏覽器訪問?http://192.168.2.22:9100?查看索引是否創(chuàng)建
瀏覽器訪問?http://192.168.2.22:5601?登錄 Kibana,單擊“Create Index Pattern”按鈕添加索引, 在索引名中輸入之前配置的 Output 前綴 apache_access-,并單擊“Create”按鈕。在用相同的方法添加 apache_error-索引。
選擇“Discover”選項卡,在中間下拉列表中選擇剛添加的 apache_access-* 、apache_error-* 索引, 可以查看相應的圖表及日志信息。
6、 ELK Kiabana 部署(在 Node1 節(jié)點上操作)
6.1.安裝 Kiabana
6.2.設置 Kibana 的主配置文件并啟動kibana服務
6.3.驗證 Kibana
① 添加system索引
② 單擊 “Discover” 按鈕可查看圖表信息及日志信息
6.4 將 Apache 服務器的日志(訪問的、錯誤的)添加到 Elasticsearch 并通過 Kibana 顯示
② 啟動添加到 Elasticsearch
瀏覽器訪問Kibana測試
瀏覽器進行訪問Apache服務器192.168.2.200,為了產生訪問日志
創(chuàng)建apache_access索引日志
創(chuàng)建apache_error索引日志
7、Filebeat+ELK 部署(接著上面實驗做)
服務器類型 | IP地址 | 需要安裝的組件 | 硬件 |
---|---|---|---|
Node1節(jié)點 | 192.168.2.22 | Elasticsearch 、 Kibana | 2核4G |
Node2節(jié)點 | 192.168.2.66 | Elasticsearch | 2核4G |
Apache節(jié)點 | 192.168.2.200 | Logstash、Apache | 2核4G |
Filebeat節(jié)點 | Node1節(jié)點 | Filebeat | 2核4G |
//在 Node1 節(jié)點上操作
7.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
7.2.設置 filebeat 的主配置文件
cd /usr/local/filebeatvim filebeat.yml
filebeat.prospectors:
- type: log #指定 log 類型,從日志文件中讀取消息
enabled: true
paths:
- /var/log/messages #指定監(jiān)控的日志文件
- /var/log/*.log
fields: #可以使用 fields 配置選項設置一些參數字段添加到 output 中
service_name: filebeat
log_type: log
service_id: 192.168.2.22--------------Elasticsearch output-------------------
(全部注釋掉)----------------Logstash output---------------------
output.logstash:
hosts: ["192.168.2.200:5044"] #指定 logstash 的 IP 和端口#啟動 filebeat
./filebeat -e -c filebeat.yml
7.3、在 Logstash 組件所在節(jié)點上新建一個 Logstash 配置文件
cd /etc/logstash/conf.dvim logstash.conf
input {
beats {
port => "5044"
}
}
output {
elasticsearch {
hosts => ["192.168.2.22:9200"]
index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}#啟動 logstash
logstash -f logstash.conf
7.4.瀏覽器訪問測試
瀏覽器訪問?http://192.168.2.22:5601?登錄 Kibana
單擊“Create Index Pattern”按鈕添加索引“filebeat-*”,單擊 “create” 按鈕創(chuàng)建,單擊 “Discover” 按鈕可查看圖表信息及日志信息。
8、Filebeat+ELK 部署(接著上面實驗做,我這里在Node1操作,可任意選臺虛擬機操作)
8.1.安裝 Filebeat
8.2.設置 filebeat 的主配置文件
在 Logstash 組件所在節(jié)點上新建一個 Logstash 配置文件(192.168.2.200)
使用logstash -f logstash.conf
命令進行啟動。
8.3 在 Node1 節(jié)點上操作,啟動 filebeat
要先啟動logstash才能啟動filebeat,否則會提示無法連接到logstash:Failed to connect: dial tcp 192.168.2.200:5044: getsockopt: connection refused
8.4.瀏覽器訪問?http://192.168.2.22:5601?登錄 Kibana測試,
① 單擊“Create Index Pattern”按鈕添加索引“filebeat-*”,單擊 “create” 按鈕創(chuàng)建,
② 單擊 “Discover” 按鈕可查看圖表信息及日志信息。