ELK 5.x 搭建大規模日志實時處理系統

MorrisFolse 7年前發布 | 101K 次閱讀 ELK Stack Kibana ElasticSearch 搜索引擎

一、背景

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

 

 本文由用戶 MorrisFolse 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!