1. 程式人生 > >分散式實時日誌分析解決方案ELK部署架構

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

0?wx_fmt=gif&wxfrom=5&wx_lazy=1

日誌是分析線上問題的重要手段,通常我們會把日誌輸出到控制檯或者本地檔案中,排查問題時通過根據關鍵字搜尋本地日誌,但越來越多的公司,專案開發中採用分散式的架構,日誌會記錄到多個伺服器或者檔案中,分析問題時可能需要檢視多個日誌檔案才能定位問題,如果相關專案不是一個團隊維護時溝通成本更是直線上升。把各個系統的日誌聚合並通過關鍵字連結一個事務處理請求,是分析分散式系統問題的有效的方式。

ELK(elasticsearch+logstash+kibana)是目前比較常用的日誌分析系統,包括日誌收集(logstash),日誌儲存搜尋(elasticsearch),展示查詢(kibana),我們使用ELK作為日誌的儲存分析系統並通過為每個請求分配requestId連結相關日誌。ELK具體結構如下圖所示:

一、概述

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

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

2. Logstash:資料收集引擎,相較於Filebeat比較重量級,但它集成了大量的外掛,支援豐富的資料來源收集,對收集的資料可以過濾,分析,格式化日誌格式。

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

4. Kibana:資料的視覺化平臺,通過該web平臺可以實時的檢視 Elasticsearch 中的相關資料,並提供了豐富的圖表統計功能。

二、ELK常見部署架構

2.1 Logstash作為日誌收集器

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

640?wx_fmt=png

2.2 Filebeat作為日誌收集器

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

640?wx_fmt=png

2.3 引入快取佇列的部署架構

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

640?wx_fmt=png

2.4 以上三種架構的總結

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

三、問題及解決方案

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

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

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

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

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

filebeat.prospectors:
    -
       paths:
          - /home/project/elk/logs/test.log
       input_type: log 
       multiline:
            pattern: '^\['
            negate: true
            match: after
output:
   logstash:
      hosts: ["localhost:5044"]

  • pattern:正則表示式

  • negate:預設為false,表示匹配pattern的行合併到上一行;true表示不匹配pattern的行合併到上一行

  • match:after表示合併到上一行的末尾,before表示合併到上一行的行首

如:

pattern: '\['
negate: true
match: after

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

2、multiline在Logstash中的配置方式

input {
  beats {
    port => 5044
  }
}

filter {
  multiline {
    pattern => "%{LOGLEVEL}\s*\]"
    negate => true
    what => "previous"
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
  }
}

(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時間格式化外掛,如:

input {
  beats {
    port => 5044
  }
}

filter {
  multiline {
    pattern => "%{LOGLEVEL}\s*\]\[%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}\]"
    negate => true
    what => "previous"
  }

  grok {
    match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME})" ]
  }

  date {
        match => ["customer_time", "yyyyMMdd HH:mm:ss,SSS"] //格式化時間
        target => "@timestamp" //替換預設的時間欄位
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
  }
}

如要匹配的日誌格式為:“[DEBUG][20170811 10:07:31,359][DefaultBeanDefinitionDocumentReader:106] Loading bean definitions”,解析出該日誌的時間欄位的方式有:

① 通過引入寫好的表示式檔案,如表示式檔案為customer_patterns,內容為:
CUSTOMER_TIME %{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME}

注:內容格式為:[自定義表示式名稱] [正則表示式]

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

filter {
  grok {
      patterns_dir => ["./customer-patterms/mypatterns"] //引用表示式檔案路徑
      match => [ "message" , "%{CUSTOMER_TIME:customer_time}" ] //使用自定義的grok表示式
  }
}

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

filter {
  grok {
    match => [ "message" , "(?<customer_time>%{YEAR}%{MONTHNUM}%{MONTHDAY}\s+%{TIME})" ]
  }
}

問題:如何在Kibana中通過選擇不同的系統日誌模組來檢視資料

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

解決方案:新增標識不同系統模組的欄位或根據不同系統模組建ES索引

1、新增標識不同系統模組的欄位,然後在Kibana中可以根據該欄位來過濾查詢不同模組的資料,這裡以第二種部署架構講解,在Filebeat中的配置內容為:

filebeat.prospectors:
    -
       paths:
          - /home/project/elk/logs/account.log
       input_type: log 
       multiline:
            pattern: '^\['
            negate: true
            match: after
       fields: //新增log_from欄位
         log_from: account

    -
       paths:
          - /home/project/elk/logs/customer.log
       input_type: log 
       multiline:
            pattern: '^\['
            negate: true
            match: after
       fields:
         log_from: customer
output:
   logstash:
      hosts: ["localhost:5044"]

通過新增:log_from欄位來標識不同的系統模組日誌

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

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

① 在Filebeat中的配置內容為:

filebeat.prospectors:
    -
       paths:
          - /home/project/elk/logs/account.log
       input_type: log 
       multiline:
            pattern: '^\['
            negate: true
            match: after
       document_type: account

    -
       paths:
          - /home/project/elk/logs/customer.log
       input_type: log 
       multiline:
            pattern: '^\['
            negate: true
            match: after
       document_type: customer
output:
   logstash:
      hosts: ["localhost:5044"]

通過document_type來標識不同系統模組

② 修改Logstash中output的配置內容為:

output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "%{type}"
  }
}

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

四、總結

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

640?wx_fmt=png

看完本文有收穫?請轉發分享給更多人

歡迎關注“暢聊架構”,我們分享最有價值的網際網路技術乾貨文章,助力您成為有思想的全棧架構師,我們只聊網際網路、只聊架構!打造最有價值的架構師圈子和社群。

長按下方的二維碼可以快速關注我們

640?wx_fmt=jpeg

相關推薦

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

日誌是分析線上問題的重要手段,通常我們會把日誌輸出到控制檯或者本地檔案中,排查問題時通過根據關鍵字搜尋本地日誌,但越來越多的公司,專案開發中採用分散式的架構,日誌會記錄到多個伺服器或者檔案中,分析問題時可能需要檢視多個日誌檔案才能定位問題,如果相關專案不是一個團隊維護時溝通成本更是直線上升。把各個系統的

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

hub redis lrn 選擇 spec 配置文件 模塊 date 應用 一、概述 ELK 已經成為目前最流行的集中式日誌解決方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等組件組成,來共同完成實時日誌的收集,存儲,展示等一

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

大數 tput 創建 localhost 註意 read 統計 支持 gate 一、前言 ELK 已經成為目前最流行的集中式日誌解決方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等組件組成,來共同完成實時日誌的收集,存儲,展示等一站式

ELK日誌分析解決方案

    概要 ELK(Elasticsearch , Logstash, Kibana的簡稱)是目前比較流行的日誌分析解決方案,核心包括了三個部分 Elasticsearch:日誌查詢分析引擎 Logstash日誌蒐集過濾 Kibana:視覺化操作介面, 當然不限於上面3個還

構建日誌分析解決方案

日誌分析是一種常見的大資料使用案例,讓您可以分析來自網站、移動裝置、伺服器、感測器和其他來源的日誌資料,並用於數字營銷、應用程式監控、欺詐檢測、廣告技術、遊戲及 IoT 等多種應用場景。在本專案中,您將使用 Amazon Web Services 來構建一個端到端日誌分析

利用ELK+Kafka解決方案,搭建企業級實時日誌分析平臺

    ELK是三款軟體的組合。是一整套完整的解決方案。分別是由Logstash(收集+分析)、ElasticSearch(搜尋+儲存)、Kibana(視覺化展示)三款軟體。ELK主要是為了在海量的日誌系統裡面實現分散式日誌資料集中式管理和查詢,便於監控以及排查故障。

ELK服務搭建(開源實時日誌分析ELK平臺部署)(低版本—簡單部署

搜索引擎 應用程序 官方網站 服務器 安全性 elk 開源實時日誌分析ELK平臺部署日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌了解服務器軟硬件信息、檢查配置過程中的錯誤及錯誤發生的原因。經常分析日誌可以了解服務器的負荷,性能安全性,從而及時采取措施糾正

開源實時日誌分析ELK平臺部署

jruby 最新版 tput home 賬號 stdin $2 sum 頁面 ELK架構圖: 1. JDK環境-------------------1.1 下載最新JDK,解壓到/usr/local/java目錄。1.2 設置環境變量打開/etc/profile,添加下面

ELK實時日誌分析平臺環境部署--完整記錄(ElasticSearch+Logstash+Kibana )

在日常運維工作中,對於系統和業務日誌的處理尤為重要。今天,在這裡分享一下自己部署的ELK(+Redis)-開源實時日誌分析平臺的記錄過程(僅依據本人的實際操作為例說明,如有誤述,敬請指出)~================概念介紹================日誌主要包括系統日誌、應用程式日誌和安全日誌。系

ELK實時日誌分析平臺部署搭建詳細實現過程

原文地址:http://www.linuxidc.com/Linux/2016-09/135137.htm 1、ELK平臺介紹 在搜尋ELK資料的時候,發現這篇文章比較好,於是摘抄一小段: 日誌主要包括系統日誌、應用程式日誌和安全日誌。系統運維和開發人員可以通過日

ELK實時日誌分析平臺環境部署

原本打算構建和實踐基於ELK的實時日誌分析平臺的,偶然發現此文,甚是詳細和實用,便轉載作以記錄。 另,近期在使用公司RDS日誌監控架構時瞭解到,使用的日誌收集工具為filebeat,百度發現filebeat和logstach同出一源,較後者更輕量,詳見https://ww

elk實時日誌分析平臺部署搭建詳細實現過程:加上個人實踐意見,及如何避坑

/* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you m

ELK搭建實時日誌分析平臺(elk+kafka+metricbeat)-搭建說明

elk搭建實時日誌分析平臺數據流向:metricbeat->kafka->logstash->elasticsearch->kibana.應用分布:主機應用備註192.168.30.121java version "1.8.0_144"zookeeper-3.4.10.tar.gzka

ELK搭建實時日誌分析平臺(elk+kafka+metricbeat)-KAFKA搭建

kafka搭建(elk+kafka+metricbeat)一、kafka搭建建立elk目錄:mkdir /usr/loca/elk安裝zookeeper:192.168.30.121:192.168.30.122:192.168.30.123:3. kafka安裝: a. 192.168.30.121

ELK實時日誌分析平臺(elk+kafka+metricbeat)-logstash(四)

elk-logstash搭建1. 安裝並測試: 2. 添加配置: 3. 啟動檢查:本文出自 “linux” 博客,請務必保留此出處http://1054054.blog.51cto.com/1044054/1968431ELK實時日誌分析平臺(elk+kafka+metricbeat)-logs

開源實時日誌分析ELK

設備 依然 itblog syslog 求和 serve product kibana 官方網站 開源實時日誌分析ELK 2018-01-04 轉自:開源實時日誌分析ELK平臺部署 日誌主要包括系統日誌、應用程序日誌和安全日誌。系統運維和開發人員可以通過日誌了解服務器軟

ELK 實現 Java 分散式系統日誌分析架構

ELK 實現 Java 分散式系統日誌分析架構 日誌是分析線上問題的重要手段,通常我們會把日誌輸出到控制檯或者本地檔案中,排查問題時通過根據關鍵字搜尋本地日誌,但越來越多的公司,專案開發中採用分散式的架構,日誌會記錄到多個伺服器或者檔案中,分析問題時可能需要檢視多個日誌檔案才能定位問題,如果相關

ELK(實時日誌分析平臺)搭建必備基礎知識-------logstash

預熱:基礎知識        Logstash 是一個開源的資料收集引擎,它具有備實時資料傳輸能力。它可以統一過濾來自不同源的資料,並按照開發者的制定的規範輸出到目的地。 顧名思義,Logstash 收集資料物件就是日誌檔案。由於日誌檔案來源多(如:系統日

ELK(實時日誌分析平臺)搭建必備基礎知識-------filebeat

預熱:基礎知識        Beats是elastic公司的一款輕量級資料採集產品,它包含了幾個子產品: packetbeat(用於監控網路流量)、 filebeat(用於監聽日誌資料,可以替代logstash-input-file)、

ELK(ElasticSearch, Logstash, Kibana)搭建實時日誌分析平臺筆記

1.ELK注意事項 1.1要求jdk1.8+ 1.2Elsearch不允許使用root啟動 1.3ELK三個包版本要一致 2.ELK下載地址 https://www.elastic.co/cn/downloads elasticsearch-6.1.1.tar.gz