Filebeat 工作原理

编辑

Filebeat 工作原理编辑

在本主题中,您将了解 Filebeat 的关键构建块以及它们如何协同工作。了解这些概念将帮助您针对特定用例做出有关配置 Filebeat 的明智决策。

Filebeat 由两个主要组件组成:输入采集器。这些组件协同工作以跟踪文件并将事件数据发送到您指定的输出。

什么是采集器?编辑

采集器负责读取单个文件的内容。采集器逐行读取每个文件,并将内容发送到输出。每个文件都会启动一个采集器。采集器负责打开和关闭文件,这意味着文件描述符在采集器运行时保持打开状态。如果在采集文件时删除或重命名了文件,Filebeat 会继续读取该文件。这会产生副作用,即磁盘空间会被保留,直到采集器关闭。默认情况下,Filebeat 会保持文件打开状态,直到达到close_inactive

关闭采集器会产生以下后果

  • 文件句柄已关闭,如果在采集器仍在读取文件时删除了文件,则释放底层资源。
  • 只有在scan_frequency 过去后,才会再次开始采集文件。
  • 如果在采集器关闭时移动或删除了文件,则不会继续采集该文件。

要控制采集器何时关闭,请使用close_* 配置选项。

什么是输入?编辑

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

如果输入类型为log,则输入会在驱动器上查找与定义的 glob 路径匹配的所有文件,并为每个文件启动一个采集器。每个输入都在其自己的 Go 例程中运行。

以下示例将 Filebeat 配置为从与指定 glob 模式匹配的所有日志文件中采集行

filebeat.inputs:
- type: log
  paths:
    - /var/log/*.log
    - /var/path2/*.log

Filebeat 当前支持多种input 类型。每种输入类型都可以定义多次。log 输入会检查每个文件,以查看是否需要启动采集器、是否已有一个采集器在运行,或者是否可以忽略该文件(请参阅ignore_older)。只有在采集器关闭后文件大小发生变化时,才会提取新行。

Filebeat 如何保持文件状态?编辑

Filebeat 会保留每个文件的状态,并频繁地将状态刷新到注册表文件中的磁盘上。该状态用于记住采集器上次读取的偏移量,并确保发送所有日志行。如果输出(如 Elasticsearch 或 Logstash)不可达,Filebeat 会跟踪最后发送的行,并在输出再次可用时继续读取文件。Filebeat 运行时,每个输入的状态信息也会保存在内存中。Filebeat 重新启动时,将使用注册表文件中的数据重建状态,Filebeat 会在最后一个已知位置继续每个采集器。

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

如果您的用例涉及每天创建大量新文件,您可能会发现注册表文件变得过大。有关可以设置以解决此问题的配置选项的详细信息,请参阅注册表文件过大

Filebeat 如何确保至少一次交付?编辑

Filebeat 保证事件至少会被传递到配置的输出一次,并且不会丢失数据。Filebeat 能够实现此行为,因为它将每个事件的传递状态存储在注册表文件中。

在定义的输出被阻塞且尚未确认所有事件的情况下,Filebeat 将继续尝试发送事件,直到输出确认已收到事件为止。

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

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