ELK入門及搭建使用
一、ELK是什么?
ELK是三個開源軟件的縮寫,分別表示:Elasticsearch , Logstash, Kibana
1、Elasticsearch
這是一個基于Lucene的分布式全文搜索框架,可以對logs進行分布式存儲。此為ELK的核心組件,日志的處理以及存儲全部由Elasticsearch 完成。
2、Logstash
主要是用來日志的搜集、分析、過濾日志的工具,用來部署到各自的服務器上收集Log日志,通過內置的ElasticSearch插件解析后輸出日志到ElasticSearch中。
3、kibana
可以多維度的展示Elasticsearch 中的數據。提供了豐富的UI組件,簡化了使用難度。
二、ELK為什么用以及解決什么問題?
項目初期的時候,服務器數量較少,一般來說對日志沒有過多的考慮,隨著應用的越來越多,日志散落在各個服務器的logs文件夾下,想要查找日志需要在眾多服務器上去逐一查找,效率非常低而且確實有很大的不方便。
當線上出現問題我們需要日志分析的時候大概會這么做:直接在日志文件中 grep ‘xx’ order.log就可以獲得自己想要的信息。
那你們想過這種方式的問題嗎?
1.日志量太大文本搜索太慢怎么辦、如何多維度查詢
2.應用太多,面臨數十上百臺應用時你該怎么辦(難道只能一臺一臺的去服務器上找?)
3.隨意登錄服務器查詢log對系統的穩定性及安全性肯定有影響
4.如果開發人員對Linux不太熟練,會造一定的困擾
ELK因此就應運而生,那么為什么要用ELK呢?ELK又能給我們解決哪些問題呢?
1.日志統一收集,管理,訪問。查找問題方便安全
2.使用簡單,可以大大提高定位問題的效率
3.可以對收集起來的log進行分析(建立日志可視化界面,使得日志分析更加便捷)
4.能夠提供錯誤報告,監控機制(當異常觸發時能夠及時通過短信、郵件等方式通知相關負責人員)
三、ELK架構
3.1 Logstash作為日志收集器
這種架構是比較原始的部署架構,在各應用服務器端分別部署一個Logstash組件,作為日志收集器,然后將Logstash收集到的數據過濾、分析、格式化處理后發送至Elasticsearch存儲,最后使用Kibana進行可視化展示,這種架構不足的是:
Logstash比較耗服務器資源,所以會增加應用服務器端的負載壓力。
3****.2 Filebeat作為日志收集器****(****目前使用最多的是****這****種部署架構****,如果不需要logstash做過濾和監控告警等特殊處理,可以直接棄用logstash****)
該架構與第一種架構唯一不同的是:應用端日志收集器換成了Filebeat,Filebeat輕量,占用服務器資源少,將日志數據發送到Logstash或者Elasticsearch時,Filebeat 使用背壓敏感協議,以應對更多的數據量。如果 Logstash 或者Elasticsearch正在忙于處理數據,則會告訴 Filebeat 減慢讀取速度。一旦擁堵得到解決,Filebeat 就會恢復到原來的步伐并繼續傳輸數據,所以使用Filebeat作為應用服務器端的日志收集器,一般Filebeat會配合Logstash一起使用(logstash主要是對日志消息進行過濾和傳輸及監控告警),這種部署方式也是目前最常用的架構。
3****.3 引入緩存隊列的部署架構
該架構在第二種架構的基礎上引入了Redis緩存隊列(還可以是其他消息隊列例如Kafka),將Filebeat收集到的數據發送至Redis,然后在通過Logstasth讀取Redis中的數據,這種架構主要是解決大數據量下的日志收集方案,使用緩存隊列主要是解決數據安全與均衡Logstash與Elasticsearch負載壓力。
3****.4 以上三種架構的總結
第一種部署架構由于資源占用問題,現已很少使用,目前使用最多的是第二種部署架構,至于第三種部署架構除非是第二種架構不能滿足性能要求或者有其他需求,因為在數據量較大的情況下,Filebeat 使用壓力敏感協議向 Logstash 或 Elasticsearch 發送數據。如果 Logstash 正在繁忙地處理數據,它會告知 Filebeat 減慢讀取速度。擁塞解決后,Filebeat 將恢復初始速度并繼續發送數據。
四、搭建ELK
版本:elasticsearch 5.6.12,logstash5.6.9,kibana5.3.0,filebeat5.6.3 四個版本(JDK需要1.8)
2、安裝filebeat
(1)解壓filebeat:tar zxvf filebeat-5.6.3-linux-x86_64
(2)filebeat-5.6.3-linux-x86_64目錄下編輯filebeat.yml文件
filebeat.prospectors:
-
type: log
enabled: true
Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/*.log
----------------------------- Logstash output --------------------------------
output.logstash:
The Logstash hosts
hosts: ["192.168.97.3:5044"] #logstash服務iP和端口,如果有多個logstash,可以寫多個。
bin目錄下啟動filebeat,啟動命令:./filebeat -e -c filebeat.yml
3.安裝logstash
(1)解壓logstash:tar zxvf logstash-5.6.9.tar.gz
(2)在config目錄創建配置文件:logstash.conf
(3)logstash.conf 做好input ,filter,output三大塊, 其中input是吸取logs文件下的所有log后綴的日志文件,filter是一個過濾函數,這里不用配置,output配置了導入到
hosts為192.168.97.3:9200的elasticsearch中,每天建一個索引。
input {
#file {
# type => "log"
# path => "/logs/*.log"
# start_position => "beginning"
#}
beats {
port => 5044
}
}
output {
stdout {
codec => rubydebug { }
}
elasticsearch {
hosts => "192.168.97.3:9200"
index => "log-%{+YYYY.MM.dd}"
}
}
(4)bin目錄下啟動logstash,啟動命令:./logstash -f ../config/logstash.conf,如果想要后臺運行啟動:./logstash -f ../config/logstash.conf &
4、安裝elasticSearch
elasticSearch啟動的時候需要注意,elasticSearch不能以root賬號啟動,所以還需要添加一個新賬戶。
4.1 解壓:tar zxvf elasticsearch-5.6.4.tar.gz
4.2 添加新賬戶:useradd es,
對新賬戶授權:chown -R es:es /usr/local/soft/elasticsearch-5.6.4
4.3安裝過程中可能會遇到如下幾個問題:
(1)max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
解決方法:vi /etc/security/limits.conf
user hard nofile 65536
user soft nofile 65536
(2)max number of threads [1024] for user [apps] is too low, increase to at least [2048]
解決辦法:vi /etc/security/limits.d/90-nproc.conf
修改如下內容:
- soft nproc 1024
修改為
- soft nproc 2048
(3)max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解決辦法:vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并執行命令:
sysctl -p
4.4 切換用戶角色:su es ,在bin 目錄下啟動elasticSearch,啟動命令:./elasticsearch ,如果需要后臺啟動:./elasticsearch -d
以上elasticsearch只是單機安裝,集群安裝如下:
4.5 同一臺機器安裝三臺elasticsearch集群:cp -r elasticsearch-5.6.12 elasticsearch-n1、cp -r elasticsearch-5.6.12 elasticsearch-n2、cp -r elasticsearch-5.6.12 elasticsearch-n3。
elasticsearch-n1 目錄的config目錄下elasticsearch.yml文件編輯
cluster.name: my-es #集群名稱
node.name: node-01 # 節點名稱
node.master: true #主節點(候選)
node.data: true #存儲數據
network.host: 192.168.97.3
http.port: 9200 #es對外提供訪問的端口
transport.tcp.port: 9300 #es集群之間通信的端口
單播(unicast)協議,指定要發現的節點信息了,可以不指定端口[默認9300]
discovery.zen.ping.unicast.hosts: ["192.168.97.3","192.168.97.3:8300","192.168.97.3:7300"]
默認是1看到的具有master節點資格的最小數量,然后才能在集群中做操作。官方的推薦值是(N/2)+1,如果只有2個節點設為1
discovery.zen.minimum_master_nodes: 2
====================================================================
elasticsearch-n2 目錄的config目錄下elasticsearch.yml文件編輯
cluster.name: my-es
node.name: node-02
node.master: false
node.data: true
network.host: 192.168.97.3
http.port: 8200
transport.tcp.port: 8300
discovery.zen.ping.unicast.hosts: ["192.168.97.3","192.168.97.3:8300","192.168.97.3:7300"]
discovery.zen.minimum_master_nodes: 2
======================================================================
elasticsearch-n3 目錄的config目錄下elasticsearch.yml文件編輯
cluster.name: my-es
node.name: node-03
node.master: true
node.data: true
network.host: 192.168.97.3
http.port: 7200
transport.tcp.port: 7300
discovery.zen.ping.unicast.hosts: ["192.168.97.3","192.168.97.3:8300","192.168.97.3:7300"]
discovery.zen.minimum_master_nodes: 2
5.安裝kibana
(1)解壓:tar zxvf kibana-5.3.0-linux-x86_64.tar.gz
(2)在config目錄下的kibana.yml文件中指定一下你需要讀取的elasticSearch地址和可供外網訪問的bind地址就可以了
elasticsearch.url: "http://192.168.97.3:9200"
server.host: 0.0.0.0
(3)bin目錄下啟動kibana,啟動命令:./kibana ,如果想要后臺啟動 :./kibana &
注意:
在es和logstash都安裝成功后,一定要先往logstash里面寫入日志,直到es的索引創建成功再來啟動kibana。訪問:<u>http://localhost:5601</u> 此時會進入配置界面,如下所示:其中紅框的內容是es的索引名字正則表達式,和logstash里面(index => "log-%{+YYYY.MM.dd}")的一致。這里用log-*就可以匹配