天天看點

分布式實時日志分析解決方案ELK部署架構一、概述二、ELK常見部署架構三、問題及解決方案四、總結

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

Filebeat:Filebeat是一款輕量級,占用服務資源非常少的資料收集引擎,它是ELK家族的新成員,可以代替Logstash作為在應用伺服器端的日志收集引擎,支援将收集到的資料輸出到Kafka,Redis等隊列。

Logstash:資料收集引擎,相較于Filebeat比較重量級,但它內建了大量的插件,支援豐富的資料源收集,對收集的資料可以過濾,分析,格式化日志格式。

Elasticsearch:分布式資料搜尋引擎,基于Apache Lucene實作,可叢集,提供資料的集中式存儲,分析,以及強大的資料搜尋和聚合功能。

這種架構是比較原始的部署架構,在各應用伺服器端分别部署一個Logstash元件,作為日志收集器,然後将Logstash收集到的資料過濾、分析、格式化處理後發送至Elasticsearch存儲,最後使用Kibana進行可視化展示,這種架構不足的是:Logstash比較耗伺服器資源,是以會增加應用伺服器端的負載壓力。

分布式實時日志分析解決方案ELK部署架構一、概述二、ELK常見部署架構三、問題及解決方案四、總結

該架構與第一種架構唯一不同的是:應用端日志收集器換成了Filebeat,Filebeat輕量,占用伺服器資源少,是以使用Filebeat作為應用伺服器端的日志收集器,一般Filebeat會配合Logstash一起使用,這種部署方式也是目前最常用的架構。

分布式實時日志分析解決方案ELK部署架構一、概述二、ELK常見部署架構三、問題及解決方案四、總結

該架構在第二種架構的基礎上引入了Redis緩存隊列(還可以是其他消息隊列),将Filebeat收集到的資料發送至Redis,然後在通過Logstasth讀取Redis中的資料,這種架構主要是解決大資料量下的日志收集方案,使用緩存隊列主要是解決資料安全與均衡Logstash與Elasticsearch負載壓力。

分布式實時日志分析解決方案ELK部署架構一、概述二、ELK常見部署架構三、問題及解決方案四、總結

第一種部署架構由于資源占用問題,現已很少使用,目前使用最多的是第二種部署架構,至于第三種部署架構個人覺得沒有必要引入消息隊列,除非有其他需求,因為在資料量較大的情況下,Filebeat 使用壓力敏感協定向 Logstash 或 Elasticsearch 發送資料。如果 Logstash 正在繁忙地處理資料,它會告知 Filebeat 減慢讀取速度。擁塞解決後,Filebeat 将恢複初始速度并繼續發送資料。

問題:如何實作日志的多行合并功能?

系統應用中的日志一般都是以特定格式進行列印的,屬于同一條日志的資料可能分多行進行列印,那麼在使用ELK收集日志的時候就需要将屬于同一條日志的多行資料進行合并。

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

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

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

pattern:正規表達式 negate:預設為false,表示比對pattern的行合并到上一行;true表示不比對pattern的行合并到上一行 match:after表示合并到上一行的末尾,before表示合并到上一行的行首

如:

該配置表示将不比對pattern模式的行合并到上一行的末尾

2、multiline在Logstash中的配置方式

(1)Logstash中配置的what屬性值為previous,相當于Filebeat中的after,Logstash中配置的what屬性值為next,相當于Filebeat中的before。 (2)pattern => "%{LOGLEVEL}\s*\]" 中的LOGLEVEL是Logstash預制的正則比對模式,預制的還有好多常用的正則比對模式,詳細請看:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

問題:如何将Kibana中顯示日志的時間字段替換為日志資訊中的時間?

預設情況下,我們在Kibana中檢視的時間字段與日志資訊中的時間不一緻,因為預設的時間字段值是日志收集時的目前時間,是以需要将該字段的時間替換為日志資訊中的時間。

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

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

如要比對的日志格式為:“[DEBUG][20170811 10:07:31,359][DefaultBeanDefinitionDocumentReader:106] Loading bean definitions”,解析出該日志的時間字段的方式有:

① 通過引入寫好的表達式檔案,如表達式檔案為customer_patterns,内容為:

CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}

注:内容格式為:[自定義表達式名稱] [正規表達式]

然後logstash中就可以這樣引用:

② 以配置項的方式,規則為:(?

問題:如何在Kibana中通過選擇不同的系統日志子產品來檢視資料

一般在Kibana中顯示的日志資料混合了來自不同系統子產品的資料,那麼如何來選擇或者過濾隻檢視指定的系統子產品的日志資料?

解決方案:新增辨別不同系統子產品的字段或根據不同系統子產品建ES索引

1、新增辨別不同系統子產品的字段,然後在Kibana中可以根據該字段來過濾查詢不同子產品的資料

這裡以第二種部署架構講解,在Filebeat中的配置内容為:

通過新增:log_from字段來辨別不同的系統子產品日志

2、根據不同的系統子產品配置對應的ES索引,然後在Kibana中建立對應的索引模式比對,即可在頁面通過索引模式下拉框選擇不同的系統子產品資料。

這裡以第二種部署架構講解,分為兩步:

① 在Filebeat中的配置内容為:

在output中增加index屬性,%{type}表示按不同的document_type值建ES索引

本文主要介紹了ELK實時日志分析的三種部署架構,以及不同架構所能解決的問題,這三種架構中第二種部署方式是時下最流行也是最常用的部署方式,最後介紹了ELK作在日志分析中的一些問題與解決方案,說在最後,ELK不僅僅可以用來作為分布式日志資料集中式查詢和管理,還可以用來作為項目應用以及伺服器資源監控等場景。

本文轉自https://my.oschina.net/feinik/blog/1580625

繼續閱讀