Filebeat工作原理分析

1,267 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情

大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈


前言

Filebeat是一款使用GO语言开发的轻量级日志采集工具,能够对指定的目录或者文件进行监视,并读取日志内容。

例如将Filebeat作为Agent安装到k8s集群的每一个Node节点,那么由于Node节点上的每一个Docker容器标准输出的日志都会以Json文件的方式存储到宿主机的本地磁盘上,所以可以通过配置Filebeat的监视目录,采集该节点上的程序的标准输出日志,采集的日志后续可以对接RedisKafka等从而进行进一步处理。

本篇文章将对Filebeat的背景,结构和工作原理进行简析。

Filebeat版本:7.2.1

Filebeat文档版本:7.2

正文

一. Filebeat背景

早期ELK架构体系中,日志的的采集由Logstash完成,但是因为Logstash运行于JVM上,对处理器,内存等资源需求大,所以Logstash日志采集的这部分功能被拆出来并用GO语言进行了实现,也就出现了Filebeat

Filebeat属于Beats系列,Beats系列包含的采集器如下所示。

Beats系列概览图

Filebeat就是Beats系列中用于日志采集的轻量采集器。

二. Filebeat结构

Filebeat的工作示意图如下所示。

Filebeat官方结构图

由上图可知,Filebeat中最重要的两个组件是:InputHarvester

1. Harvester

关于Harvester,说明如下。

  1. 一个Harvester负责逐行读取单个文件内容,并将内容发送到Output
  2. 每个文件对应一个Harvester
  3. Harvester负责打开和关闭文件,Harvester运行时文件描述符会保持打开状态;
  4. Harvester运行时如果文件被删除或者重命名,该文件还是会继续被读取;
  5. Harvester运行时,文件如果被删除,磁盘上文件占用的空间还是会被保留,直到Harvester关闭;
  6. 通常情况下,Harvester会保持运行(即保持一个文件的打开状态),除非文件被Harvester读取最后一行的时间距离当前达到close_inactive,此时Harvester会结束运行(并关闭文件描述符)。

A进程打开某个文件时,A进程就持有了该文件的文件描述符,此时即使文件被删除,该文件还是存在于磁盘上,只不过该文件只对A进程可见,A进程可以继续对文件进行读取和写入。

总结Harvester的作用就是:逐行读取文件并输出内容到Output

2. Input

关于Input,说明如下。

  1. Input负责管理Harvester
  2. Input负责发现可以读取的文件;
  3. 可以有多个Input
  4. 每个Input都会根据配置的文件路径来发现文件,并为每个文件运行一个Harvester
  5. 每个Input都在一个Goroutine协程中运行。

如下的配置是一个简单的Input配置。

filebeat.inputs:
- type: log
  paths:
    - /var/log/*.log
- type: log
  paths:
    - /var/path/*.log
    - /tmp/log/*.log

三. Filebeat如何记录文件状态

Filebeat文件状态记录策略如下。

  1. Filebeat将每个文件状态记录在磁盘上的registry注册表文件中;
  2. 文件状态用于记录Harvester最近读取到的文件的offset
  3. 如果Output不可用,那么Filebeat会跟踪文件发送的最后一行,并在Output再次可用时继续读取文件;
  4. registry注册表文件用于Filebeat重启时重建文件状态;
  5. Filebeat会通过每个文件的唯一标识符来关联文件状态,而不是文件名或文件路径,因为文件名和文件路径会被改变。

总结Filebeat如何保存文件状态就是:将文件状态记录在磁盘的registry注册表文件中并通过文件的唯一标识符进行关联。

registry文件过大时,可以通过如下两项配置来减少registry文件大小。

  • clean_removed
  • clean_inactive

四. Filebeat关闭可能会导致重复内容发送

借助于registry注册表文件记录的文件状态,Filebeat对于读取到的文件内容,能够确保至少一次发送到Output。如果Output不可用,Filebeat会持续重试,直到Output可用为止。

当关闭Filebeat时,默认情况下Filebeat会直接关闭,而不会等待所有正在发送给Output的内容事件被成功发送,这将导致这部分内容事件就算发送成功也不会被Filebeat确认(registry文件不会被更新), 此时如果Filebeat又重新启动,那么之前未确认的内容事件会被重新发送给Output,造成重复发送的现象。

可以通过配置shutdown_timeoutFilebeat在关闭前等待特定的时间。

总结

Filebeat是一款使用GO语言开发的轻量级日志采集工具,通常作为Agent安装到主机上,能够对指定的目录或者文件进行监视,并读取日志内容。

Filebeat中最重要的两个组件是:InputHarvesterInput负责管理Harvester,而Harvester负责读取日志文件。

Filebeat会记录每个日志文件最近读取到的位置,并且通过文件唯一表示符进行关联。

Filebeat能够确保日志文件内容至少一次被发送,但Filebeat被关闭可能会导致日志内容被重复发送。


大家好,我是半夏之沫 😁😁 一名金融科技领域的JAVA系统研发😊😊
我希望将自己工作和学习中的经验以最朴实最严谨的方式分享给大家,共同进步👉💓👈
👉👉👉👉👉👉👉👉💓写作不易,期待大家的关注和点赞💓👈👈👈👈👈👈👈👈
👉👉👉👉👉👉👉👉💓关注微信公众号【技术探界】 💓👈👈👈👈👈👈👈👈

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 9 天,点击查看活动详情