ELK 5.x 搭建大規模日志實時處理系統
一、背景
ELK Stack 是軟件集合 E lasticsearch、 L ogstash、 K ibana 的簡稱,由這三個軟件及其相關的組件可以打造大規模日志實時處理系統。
其中,Elasticsearch 是一個基于 Lucene 的、支持全文索引的分布式存儲和索引引擎,主要負責將日志索引并存儲起來,方便業務方檢索查詢。
Logstash 是一個日志收集、過濾、轉發的中間件,主要負責將各條業務線的各類日志統一收集、過濾后,轉發給 Elasticsearch 進行下一步處理。
Kibana 是一個可視化工具,主要負責查詢 Elasticsearch 的數據并以可視化的方式展現給業務方,比如各類餅圖、直方圖、區域圖等。
所謂“大規模”,指的是 ELK Stack 組成的系統以一種水平擴展的方式支持每天收集、過濾、索引和存儲 TB 規模以上的各類日志。
通常,各類文本形式的日志都在處理范圍,包括但不限于 Web 訪問日志,如 Nginx/Apache Access Log 。
基于對日志的實時分析,可以隨時掌握服務的運行狀況、統計 PV/UV、發現異常流量、分析用戶行為、查看熱門站內搜索關鍵詞等。
二、架構
ELK Stack 系統應用架構
上圖是 ELK Stack 實際應用中典型的一種架構,其中 filebeat 部署在具體的業務機器上,通過定時監控的方式獲取增量的日志,并轉發到 Kafka 消息系統暫存。
Kafka 以高吞吐量的特征,作為一個消息系統的角色,接收從 filebeat 收集轉發過來的日志,通常以集群的形式提供服務。
然后,Logstash 從 Kafka 中獲取日志,并通過 Input-Filter-Output 三個階段的處理,更改或過濾日志,最終輸出我們感興趣的數據。通常,根據 Kafka 集群上分區(Partition)的數量,1:1 確定 Logstash 實例的數量,組成 Consumer Group 進行日志消費。
最后,Elasticsearch 存儲并索引 Logstash 轉發過來的數據,并通過 Kibana 查詢和可視化展示,達到實時分析日志的目的。
Elasticsearch/Kibana 還可以通過安裝 x-pack 插件實現擴展功能,比如監控 Elasticsearch 集群狀態、數據訪問授權等。
三、實現
我們一步步安裝部署 ELK Stack 系統的各個組件,然后以網站訪問日志為例進行數據實時分析。
首先,到 ELK 官網 下載需要用到的 Filebeat/Logstash/Elasticsearch/Kibana 軟件安裝包。(推薦下載編譯好的二進制可執行文件,直接解壓執行就可以部署)
1、下載并配置 Filebeat,開啟日志增量監控
本文使用的版本是 5.2.2,解壓 Filebeat ,修改其中 filebeat.yml 的內容為:(詳細內容參見本文附錄鏈接)
filebeat.yml 配置文件示例
上述配置表示,Filebeat 定期監控:
/path/to/my/nginx/access/*.log
目錄下所有以 .log 結尾的文件,并且將增量日志轉發到 Kafka 集群。
然后,后臺啟動 Filebeat 進程:
nohup ./filebeat -c ./filebeat.yml &
這時候,在瀏覽器上訪問 Nginx 服務器并生成訪問日志后,Filebeat 會及時的將日志轉發到 Kafka 集群。轉發的時候,Filebeat 會傳輸 JOSN 對象,而且原生的 Nginx 日志文本會作為 message 字段,示例如下:
filebeat 傳輸內容
2、下載并配置 Kafka 集群
到 Kafka 官網 下載安裝包,本文使用的版本是 0.10.2.0,確認已安裝 java 運行環境
解壓后,編輯配置文件 conf/server.properties:(詳細內容參見本文附錄鏈接)
Kafka server configuration
啟動 Zookeeper:
nohup ./bin/zookeeper-server-start.sh config/zookeeper.properties &
啟動 Kafka Server:(指定 JMX_PORT 端口,可以通過 Kafka-manager 獲取統計信息)
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
然后,通過瀏覽器訪問:
Kafka-manager 界面
3、下載并配置 Logstash
本文使用的版本是 5.2.2,創建 logstash.conf 文件:(詳細內容參見本文附錄鏈接)
Logstash configuration
配置文件主要分為三大部分: Input / Filter / Output,對應收集、過濾、轉發三個階段。顯然,Input 階段只需要指定 Kafka 集群相關信息即可,Output 階段只需要指定 Elasticsearch 服務器相關的信息即可,比較復雜的是 Filter 過濾階段。
可以看到,上述配置中,grok 插件使用正則表達式將 Nginx 日志的各個字段匹配出來,包括訪問用戶 ip 地址、請求時間和地址、服務器響應字節以及用戶標示 User-Agent 等。
關于 Grok 的語法,可以參考: https://grokdebug.herokuapp.com/
然后,mutate、ruby、useragent、date、kv 等插件配合使用,過濾并獲取到感興趣的字段,最后輸出如下示例的 JOSN 對象:
Logstash 轉換后輸出的 JSON 對象
這就是最終存儲在 Elasticsearch 中的文檔內容。
接下來,就可以啟動 Logstash 進程了:
nohup ./bin/logstash -f ./logstash.conf &
4、配置并啟動 Elasticsearch 服務
本文使用的是 5.2.2 版本,下載并解壓后,修改 conf/elasticsearch.yml 內容如下:(詳細內容參見本文附錄鏈接)
Elasticsearch configuration
指定文檔和日志的存儲路徑以及監聽的地址和端口。
注意,應當保證有足夠的磁盤空間來存儲文檔,否則 ES 將拒絕寫入新數據。
安裝 x-pack 插件:
bin/elasticsearch-plugin install x-pack
另外,不能使用 root 用戶啟動 Elasticsearch 進程,建議新建賬戶 elasticsearch。
環境變量 ES_JAVA_OPTS 被讀取為 Elasticsearch 的最大內存空間,一般設置為你機器內存的一半即可,啟動 ES 服務:
ES_JAVA_OPTS="-Xms4g -Xmx4g"
nohup ./bin/elasticsearch &
如果啟動 Elasticsearch 出現以下錯誤提示:
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]
那么需要修改系統配置:
vi /etc/sysctl.conf 修改虛擬內存配置:
vm.max_map_count = 262144
對于 Ubuntu 系統需要執行:
sudo sysctl -w vm.max_map_count=262144
可以通過
sudo sysctl -w | grep max_map_count
查看修改結果是否生效
vi /etc/security/limits.conf 修改 文件描述符限制:
elasticsearch soft nofile 65536
elasticsearch hard nofile 65536
然后,退出終端,重新使用 elasticsearch 賬戶登錄,啟動 Elasticsearch 后,通過瀏覽器訪問 9200 端口,查看 Elasticsearch 狀態:
Elasticsearch server
4.1、安裝 Cerebro
Cerebro 時一個第三方的 Elasticsearch 集群管理軟件,可以方便地查看集群狀態:
Cerebro 界面
下載地址: https://github.com/lmenezes/cerebro
啟動進程后,可以在瀏覽器查看:
bin/cerebro -Dhttp.port=1234 -Dhttp.address=127.0.0.1
可以在管理后臺修改模板,優化索引配置,例如:
關閉備份,節省磁盤空間:"number_of_replicas": "0"
修改索引配置
5、配置并啟動 Kibana 服務
本文使用的版本是5.2.2,下載 Kibana ,修改 conf/kibana.yml ,內容為:(詳細內容參見本文附錄鏈接)
Kibana configuration
安裝 x-pack 插件:
bin/kibana-plugin install x-pack
啟動 Kibana 進程:
nohup ./bin/kibana &
tips:最好手動退出一下終端
exit
否則,關閉終端后,Kibana 進程可能也停止運行了。
然后,就可以在瀏覽器訪問 Kibana 了:
Kibana 界面
注意:
初次訪問 Kibana 的時候,需要配置一個默認的 ES 索引,一般填寫 .monitoring* 即可,這是因為在上述安裝 x-pack 后,會自動開始監控 Elasticsearch 集群的狀態,并將監控結果以 .monitoring* 命名索引文件
接下來,就可以使用 Kibana 的可視化功能分析日志了:
Kibana Visualize 功能
Kibana 可視化數據分析
5.1 分析各個接口的請求量
在 Kibana 管理后臺,選擇 Visualize >> AreaChart >> logstash-* 索引:
選擇 Area chart
選擇 logstash-* 索引
接口請求量分布圖
將 x 軸 (X-Axis) 的類型選擇為 Date-Histogram,按照參數 request 拆分圖形 (Split-Area)
四、總結
綜上,我們配置并部署了 ELK Stack 的整套組件,實現了日志收集、過濾、索引和可視化的全部流程,基于這套系統我們就可以實時的分析業務。
五、附錄:
1、ELK 各個組件運行過程中會產生大量的日志,所以需要注意日志處理,要么 > /dev/null 全部忽略,要么存儲在大磁盤空間,否則可能寫滿磁盤導致進程被 killed
2、上述安裝過程使用的配置文件下載: https://github.com/Ceelog/elkstack
3、通過水平擴展 Kafka、Elasticsearch 集群,可以實現日均幾百萬到數十億的日志實時處理
來自:https://juejin.im/entry/58c91059128fe1006c7753fb