`
darrenzhu
  • 浏览: 806919 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

分布式实时日志分析解决方案 ELK 部署架构

    博客分类:
  • Java
阅读更多
原文链接:http://www.importnew.com/27705.html
一、概述
ELK 已经成为目前最流行的集中式日志解决方案,它主要是由Beats、Logstash、Elasticsearch、Kibana等组件组成,来共同完成实时日志的收集,存储,展示等一站式的解决方案。本文将会介绍ELK常见的架构以及相关问题解决。

Filebeat:Filebeat是一款轻量级,占用服务资源非常少的数据收集引擎,它是ELK家族的新成员,可以代替Logstash作为在应用服务器端的日志收集引擎,支持将收集到的数据输出到Kafka,Redis等队列。
Logstash:数据收集引擎,相较于Filebeat比较重量级,但它集成了大量的插件,支持丰富的数据源收集,对收集的数据可以过滤,分析,格式化日志格式。
Elasticsearch:分布式数据搜索引擎,基于Apache Lucene实现,可集群,提供数据的集中式存储,分析,以及强大的数据搜索和聚合功能。
Kibana:数据的可视化平台,通过该web平台可以实时的查看 Elasticsearch 中的相关数据,并提供了丰富的图表统计功能。
二、ELK常见部署架构
2.1、Logstash作为日志收集器
这种架构是比较原始的部署架构,在各应用服务器端分别部署一个Logstash组件,作为日志收集器,然后将Logstash收集到的数据过滤、分析、格式化处理后发送至Elasticsearch存储,最后使用Kibana进行可视化展示,这种架构不足的是:Logstash比较耗服务器资源,所以会增加应用服务器端的负载压力。

2.2、Filebeat作为日志收集器
该架构与第一种架构唯一不同的是:应用端日志收集器换成了Filebeat,Filebeat轻量,占用服务器资源少,所以使用Filebeat作为应用服务器端的日志收集器,一般Filebeat会配合Logstash一起使用,这种部署方式也是目前最常用的架构。

2.3、引入缓存队列的部署架构
该架构在第二种架构的基础上引入了Kafka消息队列(还可以是其他消息队列),将Filebeat收集到的数据发送至Kafka,然后在通过Logstasth读取Kafka中的数据,这种架构主要是解决大数据量下的日志收集方案,使用缓存队列主要是解决数据安全与均衡Logstash与Elasticsearch负载压力。

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不仅仅可以用来作为分布式日志数据集中式查询和管理,还可以用来作为项目应用以及服务器资源监控等场景,更多内容请看官网。
分享到:
评论

相关推荐

    分布式实时日志分析解决方案ELK部署架构.docx

    分布式实时日志分析解决方案ELK部署架构 ELK(Elasticsearch、Logstash、Kibana)是一种流行的集中式日志解决方案,主要由 Beats、Logstash、Elasticsearch、Kibana 等组件组成,来共同完成实时日志的收集、存储、...

    linux平台centos7系统 - ELK+logback+kafka+nginx 搭建分布式日志分析平台.doc

    通过整合ELK、logback、kafka和nginx,我们可以构建一个强大的分布式日志分析平台,实现日志的实时收集、处理、存储和可视化,从而在大型企业环境中有效监控和诊断问题。这个平台能够适应不同开发语言的应用,同时...

    ELK实现日志的收集和分析-实现方案 - 2.0.pptx

    ELK(Elasticsearch、Logstash、Kibana)是一种流行的日志收集和分析解决方案,广泛应用于企业日志管理中。以下是ELK实施方案的详细介绍: ELK架构组件 ELK架构由三大组件组成: 1. Logstash:日志收集和过滤组件...

    ELK实时日志分析平台部署.docx

    ELK栈提供了一套完整的解决方案,涵盖了日志收集、传输、存储、分析和警告功能。通过集中式的日志管理系统,可以提高问题定位的效率,尤其是在分布式架构的大型系统中。 在部署ELK平台时,通常会涉及以下步骤: 1. ...

    elk日志系统部署及实践

    ELK日志系统是目前广泛使用的集中式日志解决方案,由三个强大的开源工具组成,分别是Elasticsearch、Logstash和Kibana。在IT运维和系统监控领域,日志数据的集中管理和分析变得尤为重要。传统的单机日志管理方式难以...

    实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案

    《实战Elasticsearch、Logstash、Kibana++分布式大数据搜索与日志挖掘及可视化解决方案》这本书涵盖了在大数据环境中如何高效地实现数据搜索、处理、分析以及可视化的关键技术和工具。以下是该书所涉及的核心知识点...

    ELK日志系统部署方案cycwll.doc

    这种部署架构简洁明了,适用于日志量较小的情况。随着日志数据的增长,可以根据需要添加缓存(如Redis)和集群,以增强系统的可扩展性和容错性。 总结来说,ELK日志系统提供了强大的日志管理和分析能力,通过对各种...

    ELK企业级日志分析系统资源

    ELK企业级日志分析系统是一种广泛应用于现代企业的日志管理和分析解决方案,它由三个主要组件构成:Elasticsearch、Logstash和Kibana。这三个工具的组合为收集、处理、存储、搜索和可视化大量日志数据提供了强大的...

    分布式架构原理与实践(崔皓)

    3. **数据一致性解决方案**:采用CAP理论指导下的数据库选型。 4. **故障恢复机制**:如自动重启、服务降级等策略。 5. **自动化部署工具**:如Kubernetes、Docker Swarm等,实现服务的快速部署与更新。 6. **监控与...

    Kubernetes日志采集与分析的最佳实践

    Kubernetes日志采集与分析是当前容器化部署与运维中非常关键的一个环节,由于Kubernetes自身的分布式特性,使得日志管理变得更加复杂。本文分享了关于Kubernetes日志管理的最佳实践,由阿里云日志服务技术专家元乙...

    大型分布式网站架构设计与实战

    《大型分布式网站架构设计与实战》是一本专为架构师量身打造的指南,它深入探讨了在构建大规模、高并发、高可用的互联网应用时所面临的挑战和解决方案。本书内容丰富,涵盖了从理论到实践的诸多方面,旨在帮助读者...

    java分布式系统架构问题解决与瓶颈突破

    在《Java分布式系统架构问题解决与瓶颈突破》一书中,作者深入探讨了互联网环境中大型网站架构的演变历程,以及在这一过程中所面临的关键技术挑战及其解决方案。这本书是为那些希望成为架构师或已经在该领域工作的...

    ELK+kafaka日志集群项目.zip

    ELK+kafka日志集群是现代企业级日志管理和分析的常见解决方案,它结合了Elasticsearch(存储和搜索)、Logstash(数据收集与处理)、Kibana(数据可视化)以及Kafka(消息中间件)的优势,提供了一套高效、可扩展的...

    ELK日志平台搭建安装包和文档

    ELK(Elasticsearch, Logstash, Kibana)日志平台是一套广泛使用的日志管理和分析解决方案。这个压缩包包含了一个已经搭建成功的ELK环境的相关文件和详细部署文档,帮助用户快速理解和设置自己的日志收集、存储和...

    分布式集群电商平台搭建方案 代码

    10. **监控与日志**:集成Prometheus和Grafana进行性能监控,使用ELK(Elasticsearch、Logstash、Kibana)收集和分析日志。 四、测试与优化 1. **压力测试**:使用Apache JMeter或LoadRunner进行性能测试,找出系统...

    分布式架构说明

    - **组件功能**:为了处理分布式环境下数据一致性的问题,最终一致性组件提供了一系列解决方案,如分布式事务、补偿机制等。 - **应用场景**:在涉及多个微服务交互的业务场景中,确保数据在最终达到一致状态,避免...

    架构探险:从零开始写分布式服务架构

    8. **监控与日志**:Prometheus、Grafana用于度量监控,ELK(Elasticsearch、Logstash、Kibana)堆栈处理日志分析,以便快速定位问题并优化性能。 9. **容器化与编排**:Docker提供轻量级的容器化,而Kubernetes或...

Global site tag (gtag.js) - Google Analytics