filebeat logstash kafka es 日志收集方案

Filebeat、Logstash、Kafka 和 Elasticsearch(ES) 之间构建数据流管道时,它们的协同工作可以帮助你实现高效的日志收集、处理和存储。

1、详细说明

  • 下面是如何将这四个组件连接在一起的详细说明

1.1 架构概览

  • Filebeat:轻量级日志收集器,主要负责从各个服务器或容器中收集日志数据并将其发送到 Logstash 或 Kafka。
  • Logstash:用于接收、处理和转发数据的日志处理管道,可以接收来自 Filebeat 或 Kafka 的数据,进行各种数据转换、过滤、解析等操作,然后将数据发送到 Elasticsearch。
  • Kafka:用于高吞吐量的消息传递系统,作为日志或事件的缓冲区,确保数据的可靠传输。它解耦了日志收集(Filebeat)和日志处理(Logstash、Elasticsearch),提供了流量调节和容错功能。
  • Elasticsearch:存储和索引日志数据,支持快速搜索和实时分析

1.2 filebeat->kafka->logstash->elasticsearch流程

这个流程展示了如何使用 Filebeat、Kafka、Logstash 和 Elasticsearch 组合来处理日志数据。

1.3 组件交互详解

(1) Filebeat 收集日志并发送到 Kafka
Filebeat 是一个轻量级的日志收集器,安装在各个日志源节点(如 Web 服务器、应用程序、容器等)上。Filebeat 的主要功能是读取日志文件并将其发送到 Logstash 或 Kafka。

配置 Filebeat 发送到 Kafka: 在 Filebeat 配置文件 filebeat.yml 中,你可以设置 Kafka 输出配置,将日志发送到 Kafka 集群中的特定主题。

  • Filebeat 配置示例:
filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /var/log/*.log

output.kafka:
  hosts: ["kafka_host:9092"]
  topic: "logs_topic"
  codec: json

(2) Kafka 作为消息队列
Kafka 在日志收集过程中充当消息队列的角色,将日志数据从 Filebeat 转发到 Logstash。Kafka 作为一个可靠的缓冲层,能够缓解高负载、网络延迟等问题。

Kafka 接收 Filebeat 发送的日志,并将其存储在一个或多个分区(broker)中。它支持高吞吐量、持久化和容错,保证日志数据不会丢失。
(3) logstash 从kafka消费数据并处理
logstash可以配置为kafka消费者,定期从kafka中读取日志数据。logstash可以对数据进行过滤、解析、转换等操作,处理后的数据会被转发到elasticsearch

  • 配置logstash从kafka消费数据:在logstash配置文件中,使用kafka input plugin来从kafka中读取数据,并使用elasticsearh output plugin将数据发送到elasticsearch
    logstash 配置实例
input {
  kafka {
    bootstrap_servers => "kafka_host:9092"
    topics => ["logs_topic"]
    group_id => "logstash-group"
  }
}

filter {
  # 可在这里进行数据过滤、解析和转换
  json {
    source => "message"
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch_host:9200"]
    index => "logs-index-%{+YYYY.MM.dd}"
  }
}
  • kafka 输入插件从kafka中读取数据
  • json过滤将日志数据解析为json格式(假设日志数据是json格式的)
  • elasticsearch输出插件将处理后的数据发送到elasticsearch

(4) elasticsearch 存储和索引日志
elasticsearch将logstash发送的数据存储为索引文档,并提供快速搜索和聚合功能。可以通过kibana或其他工具查询elasticsearch中的数据

  • elasticseach会对日志数据进行倒排索引,使得可以非常高效的进行全文搜索和数据分析
  • 数据会根据指定的索引模版或者动态索引进行映射,并根据需求进行实时分析和可视化

1.4 示意图

+----------+    Kafka    +----------+    Elasticsearch
|  Filebeat|  -------->  | Logstash |  ------------>  | Elasticsearch |
+----------+             +----------+                 +---------------+

1.5 各组件的优点和作用

  • filebeat: 轻量级、资源占用低的日志采集工具,支持各种日志源的监控(文件、容器等)。filebeat的优点是快速启动,低延迟,能够高效的将日志发送到kafka
  • kafkka: 作为中间层的消息队列,kafka提供了数据流的缓冲、持久化、流量调节和高可用性。能够保障日志数据的可靠传输,即使elasticsearch和logstash暂时不可用,数据也不会丢失。
  • logstash: 作为数据处理引擎,logstash能够处理复杂的日志解析、过滤、转换等任务。它还可以处理来自多种输入的数据流,支持多种输出(包括elasticsearch)
  • elasticsearch:最终的存储和搜索引擎,支持日志数据的存储、索引和快速查询,支持复杂的聚合和可视化

1.6 使用场景

优点:

  • 解耦:通过kafka,filebeat和logstash之间的联系被解耦,增加了系统的灵活性。kafka的存在使得各个组件之间的依赖减少,提高了整体系统的可靠性
  • 高可用性和容错性:kafka和elasticsearch都具备高可用特性,可以处理大规模的数据流和高并发请求。kafka提供了数据持久化和复制,确保消息不会丢失
  • 灵活的流量调节:kafka可以在日志数据流量高峰时作为缓冲区,避免logstash和elasticsear被瞬间流量压垮
  • 实时处理:通过logstash和elasticsearch的集成,可以实现实时的日志分析和监控

使用场景:

  • 大规模日志收集:由于适用分布式系统的日志收集中,kafka和filebeat可以高效的收集和转发日志数据,logstash负责日志处理,elasticsearch用于存储和分析日志
  • 实时监控和分析:通过elasticsearch提供的搜索和聚合功能,配合kibana,可以实现实时的日志分析、性能监控、故障排查等
  • 事件驱动架构:kafka作为事件队列,可以用于处理系统中产生的大量实时事件,数据可以流入elasticsearch进行分析

总结
通过将filebeat、kafka、logstash、elasticsearch结合使用,可以构建一个高效、可靠、可扩展的日志收集和分析系统。kafka在此架构中扮演着消息队列的角色,确保了数据传输的高吞吐量、可靠性和灵活性。logstash和elasticsearch提供了强大的数据处理、存储和分析能力

2 调优建议

2.1 logstash调优

2.1.1 consumer_threads(并发线程数)

logstash的kafka input插件中,consumer_threads 是一个用于控制并发消费线程数量的参数。它影响logstash从kafka分区读取数据的效率和吞吐量

  • 基本概念

  • 1.作用

    • 指定logstash从kafka消费数据时,使用的线程数量
    • 每个线程可以消费一个或多个kafka分区
  • 2.默认值

    • 如果未设置,consumer_threads默认值为1,即使用单线程消费
  • 3.调优点

    • 增加consumer_threads数量,可以提高数据消费的并发能力
  • 配置方式
    在losgstash.conf文件中配置kafka input插件时,可以添加consumer_threads参数,例如:

input {
    kafka {
        bootstrap_servers => "broker1:9092,broker2:9092"
        topics => ["your-topic"]
        group_id => "logstash-consumer-group"
        consumer_threads => 4
    }
}
output {
    elasticsearch {
        hosts => ["http://es-host:9200"]
        index => "your-index-%{+YYYY.MM.dd}"
    }
}
  • 注意事项

1.线程数与kafka分区数的关系

  • kafka的分区是消费并发度的上线
    • 每个线程最多只能处理一个分区
    • 如果consumer_threads的值大于分区数,多余的线程会空闲
      实例
      • topic有6个分区
      • 如果consumer_threads设置为8,只有6个线程会实际工作,剩余2个线程闲置

2.消费者组的分区分配

  • 如果有多个logstash实例(属于同一个consumer group),kafka会将分区分配到不同的logstash节点
    • 每个logstash节点使用自己的consumer_threads参数处理分配它的区位

3.线程数的合理设置

  • 避免设置过多的线程
    • 线程过多可能会导致上下文切换频繁,反而降低性能
    • 建议设置的线程数与分区数接近,但不要超过分区总数

2.1.2 配置jvm内存

logstash默认的jvm内存不能处理高吞吐场景
建议:修改jvm.options 文件,增加堆内存

-Xms4g
-Xmx4g

2.1.3 启用多管道

多管道可以进行处理不通类型的数据
建议:在piplines.yml配置多个管道,根据不同数据源或逻辑划分管道,提升吞吐量。

- pipeline.id: pipeline1
  path.config: "/etc/logstash/conf.d/pipeline1.conf"
- pipeline.id: pipeline2
  path.config: "/etc/logstash/conf.d/pipeline2.conf"

2.1.4 调整批处理大小

批处理大小决定了logstash每次从kafka消费的记录数
建议:

  • 在kafka input配置中增加fetch_min_bytes 和 consumer_threads。
  • 在output(如 Elasticsearch)中,增加批处理大小:
    • flush_size:定义每次批量发送的事件数量(默认值为 5000),批量大小太小可能导致性能下降,太大可能导致内存问题
    • workers:定义用于并发处理的工作线程数(默认值为 1),适当增加可以提高吞吐量,但不要超过 Elasticsearch 节点的处理能力
output {
    elasticsearch {
        hosts => ["http://es-host:9200"]
        index => "your-index"
        flush_size => 5000
        workers => 4
    }
}

2.1.5 配置持久队列

当 Logstash 出现高负载时,内存队列可能会丢失数据。
建议:启用持久队列,避免数据丢失

queue.type: persisted
queue.max_bytes: 2gb
  • queue.type: persisted
    • 启用 Logstash 的持久化队列。
    • 默认情况下,Logstash 使用的是内存队列(memory),所有数据缓存在内存中。而 persisted 队列会将数据缓存在磁盘上,避免因 Logstash 重启或崩溃导致数据丢失。
  • queue.max_bytes: 2gb
    • 设置持久化队列的最大容量为 2GB。
    • 当队列已满时,Logstash 会停止接收新的数据,直到队列有足够的空间。可以根据磁盘大小和流量需求调整此值。

2.2 elasticsearch 调优

1. index.number_of_shards

  • 作用:设置索引的分片数量。分片决定了数据如何分布在节点上。
  • 建议值:根据数据量和集群规模合理设置,可以设置为3-5个
  • 后果
    • 分片数过少:单个分片过大,可能会导致查询和写入性能下降
    • 分片数过多:会增加开销,可能浪费资源并影响集群的稳定性

2. index.number_of_replicas

  • 作用:设置每个索引的副本数量,用于数据冗余和提高查询性能
  • 建议值:建议设置为1到2个副本
  • 后果
    • 副本数过少,节点故障时可能丢失数据,影响系统的高可用性
    • 副本数过多,会浪费存储空间并增加数据同步的负担

3. index.refresh_interval

  • 作用:控制索引的刷新频率,决定数据文档从内存刷新到磁盘的间隔时间
  • 建议值:可以适当增加刷新时间,设置为5秒或者10秒
  • 后果
    • 刷新时间过段,频繁的刷新会增加io开销,影响写入性能
    • 刷新时间过长,查询时无法看到最新的数据,影响实时性

4. indices.memory.index_buffer_size

  • 作用:设置索引时内存缓冲区大小,影响写入性能
  • 建议值:通常设置为物理内存的10%到15%
  • 后果
    • 设置过小会导致频繁的磁盘io,影响写入性能
    • 如果过大会导致内存耗尽,影响其他操作的稳定性
posted @ 2024-11-14 20:01  Hello_worlds  阅读(32)  评论(0编辑  收藏  举报