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 上,Filebeat 还可能由于 inode 重用而跳过行。有关 inode 重用问题的更多详细信息,请参阅常见问题