一、背景
ELK Stack 是軟件集合?Elasticsearch氨肌、Logstash鸿秆、Kibana 的簡稱,由這三個軟件及其相關的組件可以打造大規(guī)模日志實時處理系統(tǒng)怎囚。
其中卿叽,Elasticsearch 是一個基于 Lucene 的、支持全文索引的分布式存儲和索引引擎恳守,主要負責將日志索引并存儲起來考婴,方便業(yè)務方檢索查詢。
Logstash 是一個日志收集催烘、過濾沥阱、轉發(fā)的中間件,主要負責將各條業(yè)務線的各類日志統(tǒng)一收集伊群、過濾后考杉,轉發(fā)給 Elasticsearch 進行下一步處理。
Kibana 是一個可視化工具舰始,主要負責查詢 Elasticsearch 的數(shù)據(jù)并以可視化的方式展現(xiàn)給業(yè)務方崇棠,比如各類餅圖、直方圖丸卷、區(qū)域圖等枕稀。
所謂“大規(guī)模”及老,指的是 ELK Stack 組成的系統(tǒng)以一種水平擴展的方式支持每天收集抽莱、過濾、索引和存儲 TB 規(guī)模以上的各類日志骄恶。
通常食铐,各類文本形式的日志都在處理范圍,包括但不限于 Web 訪問日志僧鲁,如 Nginx/Apache Access Log 虐呻。
基于對日志的實時分析,可以隨時掌握服務的運行狀況寞秃、統(tǒng)計 PV/UV斟叼、發(fā)現(xiàn)異常流量、分析用戶行為春寿、查看熱門站內搜索關鍵詞等朗涩。
二、架構
上圖是 ELK Stack 實際應用中典型的一種架構绑改,其中 filebeat 部署在具體的業(yè)務機器上谢床,通過定時監(jiān)控的方式獲取增量的日志兄一,并轉發(fā)到 Kafka 消息系統(tǒng)暫存。
Kafka 以高吞吐量的特征识腿,作為一個消息系統(tǒng)的角色出革,接收從 filebeat 收集轉發(fā)過來的日志,通常以集群的形式提供服務渡讼。
然后骂束,Logstash 從 Kafka 中獲取日志,并通過 Input-Filter-Output 三個階段的處理成箫,更改或過濾日志展箱,最終輸出我們感興趣的數(shù)據(jù)。通常伟众,根據(jù) Kafka 集群上分區(qū)(Partition)的數(shù)量析藕,1:1 確定 Logstash 實例的數(shù)量,組成 Consumer Group 進行日志消費凳厢。
最后账胧,Elasticsearch 存儲并索引 Logstash 轉發(fā)過來的數(shù)據(jù),并通過 Kibana 查詢和可視化展示先紫,達到實時分析日志的目的治泥。
Elasticsearch/Kibana 還可以通過安裝 x-pack 插件實現(xiàn)擴展功能,比如監(jiān)控 Elasticsearch 集群狀態(tài)遮精、數(shù)據(jù)訪問授權等居夹。
三、實現(xiàn)
我們一步步安裝部署 ELK Stack 系統(tǒng)的各個組件本冲,然后以網站訪問日志為例進行數(shù)據(jù)實時分析准脂。
首先,到?ELK 官網?下載需要用到的 Filebeat/Logstash/Elasticsearch/Kibana 軟件安裝包檬洞。(推薦下載編譯好的二進制可執(zhí)行文件狸膏,直接解壓執(zhí)行就可以部署)
1、下載并配置 Filebeat添怔,開啟日志增量監(jiān)控
本文使用的版本是 5.2.2湾戳,解壓 Filebeat ,修改其中 filebeat.yml 的內容為:(詳細內容參見本文附錄鏈接)
上述配置表示广料,F(xiàn)ilebeat 定期監(jiān)控:
/path/to/my/nginx/access/*.log
目錄下所有以 .log 結尾的文件砾脑,并且將增量日志轉發(fā)到 Kafka 集群。
然后艾杏,后臺啟動 Filebeat 進程:
nohup ./filebeat -c ./filebeat.yml &
這時候韧衣,在瀏覽器上訪問 Nginx 服務器并生成訪問日志后,F(xiàn)ilebeat 會及時的將日志轉發(fā)到 Kafka 集群。轉發(fā)的時候畅铭,F(xiàn)ilebeat 會傳輸 JOSN 對象萧求,而且原生的 Nginx 日志文本會作為 message 字段,示例如下:
2顶瞒、下載并配置 Kafka 集群
到 Kafka 官網 下載安裝包,本文使用的版本是 0.10.2.0元旬,確認已安裝 java 運行環(huán)境
解壓后榴徐,編輯配置文件 conf/server.properties:(詳細內容參見本文附錄鏈接)
啟動 Zookeeper:
nohup ./bin/zookeeper-server-start.sh config/zookeeper.properties &
啟動 Kafka Server:(指定 JMX_PORT 端口,可以通過 Kafka-manager 獲取統(tǒng)計信息)
JMX_PORT=9001
nohup ./bin/kafka-server-start.sh config/server.properties &
2.1匀归、安裝 Kafka-Manager
kafka-manager 是 Yahoo 公司開源的一個 kafka 集群管理工具坑资。
可以在 Github 上下載安裝:https://github.com/yahoo/kafka-manager
如果你通過 sbt 編譯太慢的話,可以直接下載本文附件穆端,這是一個編譯好的安裝包袱贮,解壓后,修改配置文件 conf/application.conf 即可運行:
bin/kafka-manager -Dconfig.file=/path/to/application.conf -Dhttp.port=8080
然后体啰,通過瀏覽器訪問:
3攒巍、下載并配置 Logstash
本文使用的版本是 5.2.2,創(chuàng)建 logstash.conf 文件:(詳細內容參見本文附錄鏈接)
配置文件主要分為三大部分: Input / Filter / Output荒勇,對應收集柒莉、過濾、轉發(fā)三個階段沽翔。顯然兢孝,Input 階段只需要指定 Kafka 集群相關信息即可,Output 階段只需要指定 Elasticsearch 服務器相關的信息即可仅偎,比較復雜的是 Filter 過濾階段跨蟹。
可以看到,上述配置中橘沥,grok 插件使用正則表達式將 Nginx 日志的各個字段匹配出來窗轩,包括訪問用戶 ip 地址、請求時間和地址威恼、服務器響應字節(jié)以及用戶標示 User-Agent 等品姓。
關于 Grok 的語法,可以參考:https://grokdebug.herokuapp.com/
然后箫措,mutate腹备、ruby、useragent斤蔓、date植酥、kv 等插件配合使用,過濾并獲取到感興趣的字段,最后輸出如下示例的 JOSN 對象:
這就是最終存儲在 Elasticsearch 中的文檔內容友驮。
如果你想自定義開發(fā)插件漂羊,參見:https://juejin.im/post/58ca9d47570c3500589206d5
接下來,就可以啟動 Logstash 進程了:
nohup ./bin/logstash -f ./logstash.conf &
4卸留、配置并啟動 Elasticsearch 服務
本文使用的是 5.2.2 版本走越,下載并解壓后,修改 conf/elasticsearch.yml 內容如下:(詳細內容參見本文附錄鏈接)
指定文檔和日志的存儲路徑以及監(jiān)聽的地址和端口耻瑟。
注意旨指,應當保證有足夠的磁盤空間來存儲文檔,否則 ES 將拒絕寫入新數(shù)據(jù)喳整。
安裝 x-pack 插件:
bin/elasticsearch-plugin install x-pack
另外谆构,不能使用 root 用戶啟動 Elasticsearch 進程,建議新建賬戶 elasticsearch框都。
環(huán)境變量 ES_JAVA_OPTS 被讀取為 Elasticsearch 的最大內存空間搬素,一般設置為你機器內存的一半即可,啟動 ES 服務:
ES_JAVA_OPTS="-Xms4g -Xmx4g"
nohup ./bin/elasticsearch &
如果啟動 Elasticsearch 出現(xiàn)以下錯誤提示:
max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]
那么需要修改系統(tǒng)配置:
vi /etc/sysctl.conf 修改虛擬內存配置:
vm.max_map_count = 262144
對于 Ubuntu 系統(tǒng)需要執(zhí)行:
sudo sysctl -w vm.max_map_count=262144
可以通過
sudo sysctl -a | grep max_map_count
查看修改結果是否生效
vi /etc/security/limits.conf 修改 文件描述符限制:
elasticsearch ? ?soft? ? nofile? ? 65536
elasticsearch ? ?hard? ? nofile? ? 65536
然后魏保,退出終端熬尺,重新使用 elasticsearch 賬戶登錄,啟動 Elasticsearch 后囱淋,通過瀏覽器訪問 9200 端口猪杭,查看 Elasticsearch 狀態(tài):
4.1、安裝 Cerebro
Cerebro 時一個第三方的 Elasticsearch 集群管理軟件妥衣,可以方便地查看集群狀態(tài):
下載地址:https://github.com/lmenezes/cerebro
啟動進程后皂吮,可以在瀏覽器查看:
bin/cerebro -Dhttp.port=1234 -Dhttp.address=127.0.0.1
可以在管理后臺修改模板,優(yōu)化索引配置税手,例如:
關閉備份蜂筹,節(jié)省磁盤空間:"number_of_replicas": "0"
5、配置并啟動 Kibana 服務
本文使用的版本是5.2.2芦倒,下載 Kibana 艺挪,修改 conf/kibana.yml ,內容為:(詳細內容參見本文附錄鏈接)
安裝 x-pack 插件:
bin/kibana-plugin install x-pack
啟動 Kibana 進程:
nohup ./bin/kibana &
tips:最好手動退出一下終端
exit
否則兵扬,關閉終端后麻裳,Kibana 進程可能也停止運行了。
然后器钟,就可以在瀏覽器訪問 Kibana 了:
注意:
初次訪問 Kibana 的時候津坑,需要配置一個默認的 ES 索引,一般填寫 .monitoring* 即可傲霸,這是因為在上述安裝 x-pack 后疆瑰,會自動開始監(jiān)控 Elasticsearch 集群的狀態(tài)眉反,并將監(jiān)控結果以 .monitoring* 命名索引文件
接下來,就可以使用 Kibana 的可視化功能分析日志了:
5.1 分析各個接口的請求量
在 Kibana 管理后臺穆役,選擇 Visualize >> AreaChart >> logstash-* 索引:
將 x 軸 (X-Axis) 的類型選擇為 Date-Histogram寸五,按照參數(shù) request 拆分圖形 (Split-Area)
四、總結
綜上耿币,我們配置并部署了 ELK Stack 的整套組件梳杏,實現(xiàn)了日志收集、過濾淹接、索引和可視化的全部流程秘狞,基于這套系統(tǒng)我們就可以實時的分析業(yè)務。
五蹈集、附錄:
1、ELK 各個組件運行過程中會產生大量的日志雇初,所以需要注意日志處理拢肆,要么 > /dev/null 全部忽略,要么存儲在大磁盤空間靖诗,否則可能寫滿磁盤導致進程被 killed
2郭怪、上述安裝過程使用的配置文件下載:https://github.com/Ceelog/elkstack
3、通過水平擴展 Kafka刊橘、Elasticsearch 集群鄙才,可以實現(xiàn)日均幾百萬到數(shù)十億的日志實時處理
4、參考資料:
https://www.elastic.co/guide/index.html
https://www.elastic.co/guide/en/logstash/current/deploying-and-scaling.html
https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details
5促绵、磁盤對 Elasticsearch 的性能影響很大攒庵,能上 SSD 是最好的,否則本地磁盤也行败晴,如果是云存儲的話會導致機器負載極高
6浓冒、部署 Kafka Broker 節(jié)點的機器不要跑其他會產生大量磁盤I/O的程序,這樣才能保證 Kafka 磁盤 I/O 效率最高尖坤,從而提升吞吐量稳懒,當然,部署一個 Logstash 實例沒有問題
7慢味、為了提升 Logstash 的吞吐量场梆,可以適當增加 CPU 核數(shù),然后在啟動 Logstash 的時候指定worker 數(shù)量和 CPU 核數(shù)一致
8纯路、在 Logstash 處理日志的階段或油,盡量把不必要的字段刪除,這樣既能提高 ES 的索引速率感昼,又能節(jié)省磁盤空間
(還有疑問装哆?聯(lián)系作者微博/微信 @Ceelog,轉載請注明出處 )