分佈式實時日誌分析解決方案 ELK 部署架構

1、概述

ELK 已經成爲目前最流行的集中式日誌解決方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等組件組成,來共同完成實時日誌的收集,存儲,展現等一站式的解決方案。本文將會介紹ELK常見的架構以及相關問題解決。git

  1. Filebeat:Filebeat是一款輕量級,佔用服務資源很是少的數據收集引擎,它是ELK家族的新成員,能夠代替Logstash做爲在應用服務器端的日誌收集引擎,支持將收集到的數據輸出到Kafka,Redis等隊列。
  2. Logstash:數據收集引擎,相較於Filebeat比較重量級,但它集成了大量的插件,支持豐富的數據源收集,對收集的數據能夠過濾,分析,格式化日誌格式。
  3. Elasticsearch:分佈式數據搜索引擎,基於Apache
    Lucene實現,可集羣,提供數據的集中式存儲,分析,以及強大的數據搜索和聚合功能。
  4. Kibana:數據的可視化平臺,經過該web平臺能夠實時的查看 Elasticsearch 中的相關數據,並提供了豐富的圖表統計功能。

2、ELK常見部署架構

2.一、Logstash做爲日誌收集器github

這種架構是比較原始的部署架構,在各應用服務器端分別部署一個Logstash組件,做爲日誌收集器,而後將Logstash收集到的數據過濾、分析、格式化處理後發送至Elasticsearch存儲,最後使用Kibana進行可視化展現,這種架構不足的是:Logstash比較耗服務器資源,因此會增長應用服務器端的負載壓力。web

clipboard.png

2.二、Filebeat做爲日誌收集器正則表達式

該架構與第一種架構惟一不一樣的是:應用端日誌收集器換成了Filebeat,Filebeat輕量,佔用服務器資源少,因此使用Filebeat做爲應用服務器端的日誌收集器,通常Filebeat會配合Logstash一塊兒使用,這種部署方式也是目前最經常使用的架構。緩存

clipboard.png

2.三、引入緩存隊列的部署架構安全

該架構在第二種架構的基礎上引入了Kafka消息隊列(還能夠是其餘消息隊列),將Filebeat收集到的數據發送至Kafka,而後在經過Logstasth讀取Kafka中的數據,這種架構主要是解決大數據量下的日誌收集方案,使用緩存隊列主要是解決數據安全與均衡Logstash與Elasticsearch負載壓力。性能優化

clipboard.png

2.四、以上三種架構的總結服務器

第一種部署架構因爲資源佔用問題,現已不多使用,目前使用最多的是第二種部署架構,至於第三種部署架構我的以爲沒有必要引入消息隊列,除非有其餘需求,由於在數據量較大的狀況下,Filebeat 使用壓力敏感協議向 Logstash 或 Elasticsearch 發送數據。若是 Logstash 正在繁忙地處理數據,它會告知 Filebeat 減慢讀取速度。擁塞解決後,Filebeat 將恢復初始速度並繼續發送數據。架構

推薦一個交流學習羣:478030634 裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多:併發

clipboard.png

3、問題及解決方案

問題:如何實現日誌的多行合併功能?

系統應用中的日誌通常都是以特定格式進行打印的,屬於同一條日誌的數據可能分多行進行打印,那麼在使用ELK收集日誌的時候就須要將屬於同一條日誌的多行數據進行合併。

解決方案:使用Filebeat或Logstash中的multiline多行合併插件來實現

在使用multiline多行合併插件的時候須要注意,不一樣的ELK部署架構可能multiline的使用方式也不一樣,若是是本文的第一種部署架構,那麼multiline須要在Logstash中配置使用,若是是第二種部署架構,那麼multiline須要在Filebeat中配置使用,無需再在Logstash中配置multiline。

一、multiline在Filebeat中的配置方式:

clipboard.png

  • pattern:正則表達式
  • negate:默認爲false,表示匹配pattern的行合併到上一行;true表示不匹配pattern的行合併到上一行
  • match:after表示合併到上一行的末尾,before表示合併到上一行的行首

如:

pattern: '['
negate: true
match: after

該配置表示將不匹配pattern模式的行合併到上一行的末尾

二、multiline在Logstash中的配置方式

clipboard.png

(1)Logstash中配置的what屬性值爲previous,至關於Filebeat中的after,Logstash中配置的what屬性值爲next,至關於Filebeat中的before。
(2)pattern => "%{LOGLEVEL}s*]" 中的LOGLEVEL是Logstash預製的正則匹配模式,預製的還有好多經常使用的正則匹配模式,詳細請看:https://github.com/logstash-p...

問題:如何將Kibana中顯示日誌的時間字段替換爲日誌信息中的時間?

默認狀況下,咱們在Kibana中查看的時間字段與日誌信息中的時間不一致,由於默認的時間字段值是日誌收集時的當前時間,因此須要將該字段的時間替換爲日誌信息中的時間。

解決方案:使用grok分詞插件與date時間格式化插件來實現

在Logstash的配置文件的過濾器中配置grok分詞插件與date時間格式化插件,如:

clipboard.png

如要匹配的日誌格式爲:「DEBUG[DefaultBeanDefinitionDocumentReader:106] Loading bean definitions」,解析出該日誌的時間字段的方式有:

① 經過引入寫好的表達式文件,如表達式文件爲customer_patterns,內容爲:
CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}s+%{TIME}
注:內容格式爲:[自定義表達式名稱] [正則表達式]
而後logstash中就能夠這樣引用:

clipboard.png

② 以配置項的方式,規則爲:(?<自定義表達式名稱>正則匹配規則),如:

clipboard.png

問題:如何在Kibana中經過選擇不一樣的系統日誌模塊來查看數據

通常在Kibana中顯示的日誌數據混合了來自不一樣系統模塊的數據,那麼如何來選擇或者過濾只查看指定的系統模塊的日誌數據?

解決方案:新增標識不一樣系統模塊的字段或根據不一樣系統模塊建ES索引

一、新增標識不一樣系統模塊的字段,而後在Kibana中能夠根據該字段來過濾查詢不一樣模塊的數據
這裏以第二種部署架構講解,在Filebeat中的配置內容爲:

clipboard.png
經過新增:log_from字段來標識不一樣的系統模塊日誌

二、根據不一樣的系統模塊配置對應的ES索引,而後在Kibana中建立對應的索引模式匹配,便可在頁面經過索引模式下拉框選擇不一樣的系統模塊數據。
這裏以第二種部署架構講解,分爲兩步:
① 在Filebeat中的配置內容爲:

clipboard.png
經過document_type來標識不一樣系統模塊

② 修改Logstash中output的配置內容爲:
在output中增長index屬性,%{type}表示按不一樣的document_type值建ES索引

4、總結

本文主要介紹了ELK實時日誌分析的三種部署架構,以及不一樣架構所能解決的問題,這三種架構中第二種部署方式是時下最流行也是最經常使用的部署方式,最後介紹了ELK做在日誌分析中的一些問題與解決方案,說在最後,ELK不只僅能夠用來做爲分佈式日誌數據集中式查詢和管理,還能夠用來做爲項目應用以及服務器資源監控等場景

相關文章
相關標籤/搜索