本文主要介绍 Filebeat 的两个关键组件以及它们如何共同协作完成数据采集和转发工作。理解并熟练掌握这些组件的工作原理将对后面深入学习 Filebeat 的各种功能和特性,尤其是为特定使用场景配置 Filebeat 时大有裨益。


Filebeat 由两个关键组件构成:输入(Input)和采集器(Harvester,[ˈhɑːrvɪstər])。这些组件共同协作,跟踪日志文件,并将事件数据发送到指定的输出上。

采集器

采集器逐行读取文件内容并将其转换为事件,然后发送到指定的输出上。一个采集器只会跟踪一个日志文件。需要注意的是,采集器还负责文件的打开与关闭——采集文件之前需要先打开文件,采集结束之后需要关闭文件。在采集的过程中,文件会一直保持打开的状态。也就是说,如果在采集期间移除或重命名文件,采集器仍会继续读取该文件,这会导致磁盘空间不被释放,除非关闭采集器。

默认情况下,Filebeat 保持文件为打开状态的时长取决于配置项 close_inactive 设置的时长。如果一个文件在设定的时间内没有新增数据,即 Filebeat 在设定的时间内没有从该文件中采集到数据,那么 Filebeat 就会关闭该文件。

关闭采集器的后续行为:

  • 如果文件在采集器运行期间就被删除,那么关闭采集器就会关闭该文件从而释放底层资源。
  • 被关闭的采集器只有在 scan_frequency 过后,才会再次开始启动采集。
  • 在关闭采集器后移动或删除文件,就不会再采集该文件。

控制采集器关闭行为的相关配置,可参考 close_* 配置项说明。

输入

输入负责管理采集器和查找所有要采集的源。

如果输入的类型是 log,那么输入会查找驱动上所有与定义的通配符匹配操作符相匹配的文件,并为每个文件启动一个采集器。每个输入都运行在自己的 Go 协程中。

下面的例子配置了 Filebeat 采集 /var/log/var/path2 两个路径下所有文件扩展名为 log 的文件:

1
2
3
4
5
6
filebeat.inputs:
- type: log
paths:
- /var/log/*.log
- /var/path2/*.log

Filebeat 目前支持几种输入类型。每种输入类型都可以定义多次。log 类型输入会检查每个文件,看是否需要启动采集器,是否已经在运行,或者是否可以忽略该文件(见 ignore_older 配置项)。采集器关闭后,只有当文件的大小发生变化时,才会继续采集新行。

保存文件状态

Filebeat 会保存每个文件的状态,并频繁把状态写到磁盘的注册表文件中。状态用于记录采集器最后一次读取的偏移量和确保所有的日志行都成功发送。如果指定的输出(如 Elasticsearch、Logstash)出现不可用,Filebeat 会持续跟踪最后发送的日志行的状态,一旦输出再次可用,就会继续读取文件。Filebeat 在运行时,每个输入的状态信息也会保存在内存中。当 Filebeat 重新启动时,会从磁盘上的注册表文件恢复数据状态,每个采集器也会从上一次发送成功的位置继续采集。

对于每个输入,Filebeat 会保存它所找到的每个文件的状态。因为文件可以被重命名或移动,所以文件名和路径并不能唯一标识一个文件。对于每个文件,Filebeat 都会存储唯一的标识符,以检测文件之前是否被采集过。

至少一次

Filebeat 提供至少一次保障,这意味着所有事件最终都会被处理,虽然有些可能会被处理多次,但不会有数据丢失的情况。Filebeat 能够实现该功能,是因为它将每个事件的发送状态持久化到磁盘的文件中。

如果 Filebeat 的输出(Output)出现阻塞、无法确认事件已经接收完毕,Filebeat 会一直尝试发送这些事件,直接输出确认已接收到事件为止。

如果 Filebeat 在发送事件的过程中关闭,它不会等待输出确认所有事件后再关闭。任何发送到输出的事件,但在 Filebeat 关闭前没有确认,在 Filebeat 重新启动时将再次发送。这样可以确保每个事件至少发送一次,但最终可能会将重复的事件发送到输出。可以通过设置 shutdown_timeout 配置项将Filebeat配置为在关闭前等待特定的时间。

注意:Filebeat的至少一次交付保证有一个限制,涉及日志轮换和删除旧文件。如果日志文件写入磁盘和旋转的速度超过Filebeat处理它们的速度,或者如果在输出不可用时删除文件,则数据可能会丢失。在Linux上,由于inode重用,Filebeat也可能会跳过行。有关inode重用问题的更多详细信息,请参见常见问题。

(END)