elk

filebeat的工作原理

es学习记录

Posted by CHuiL on July 22, 2019

filebeat的工作原理涉及两个重要的概念,input和harvesters

harvesters

一个harvesters对应负责收集一个文件的数据。它一行一行读取数据并将数据发送给配置好的output。harvester负责打开和关闭文件,所以harvesters运行期间文件描述符将保持打开状态。 即便在harvesters运行期间移动或者更改了文件名,harvesters仍然能够继续读取文件。这也意味着你删除一个文件之后只有等到harvester关闭才会释放磁盘空间。默认情况下,filebeat会保持文件打开直到close_inactive设置的时间到期(默认为5分钟)。

关闭harvester的影响

  • 文件处理程序已关闭,如果在收集器仍在读取文件时删除了文件,则释放底层资源
  • harvester被关闭之后,只有在scan_frequency设定的扫描频率(默认10s)过后才会被重新启动。比如默认10s,那么在这期间文件内容更新,也只有在重新扫描时才会重新打开harvester。
  • 如果在harvester关闭期间删除或移动了文件,harvester将不会继续收集该文件数据。

input

input主要管理harvester和查询所有可以读取的文件。

如果input type设置为log,input会在指定的目录下搜索所有匹配的文件,并为每个文件开启一个harvester。每个输入会跑在一个goroutine上

现在已经支持多种type输入,每种type可以被定义多次。log类型会检查每一个文件查看他们是否需要被收集,当文件更新时会开启harvester去收集自从上次关闭以来新产生的行数据。

filebeat会保存文件状态

filebeat会保存文件的状态并经常刷到磁盘上的注册表文件。状态主要保存上次harvester所收集到的数据的位置,并且保证所有数据都已经被发送。

如果output无法到达,filebeat会跟踪发送的最后一行,并在output再次可用时继续读取文件。

在filebeat运行期间状态也会保存在内存中,当filebeat重启时会读取注册表文件中的状态,并根据状态表中的最后一个已知的位置继续运行收集数据

对于每一个输入,filebeat会为每一个文件保存状态,并且保存一个唯一标识符来确认是否是已经读取过的文件,因为文件可能会改名或者移动,所以单纯依靠路径和文件名是无法辨别是否为同一个文件的。

如果会一直产生新的文件,那么注册表也会越来越大。这将可能导致占用越来越多的磁盘和内存。

filebeat会保证至少发送一次事件到output并且不会丢失数据

关键在于filebeat会为保存每一次事件的交付状态。

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

在filebeat被关闭之前发送的事件,filebeat不会等待确认,而是直接关闭并记录到事件状态。在下次启动时重新发送那些尚未收到确认的事件,这就确保了至少交付一次事件。但也可能会导致数据重复。

你可以通过设置shutdown_timeout选项将Filebeat配置为在关闭之前等待特定的时间。

filebeat的至少一次交付有一个限制,那就是如果日志写入磁盘的数据快过filebeat处理的速度,或者在输出不可用的情况下删除文件,都可能导致数据丢失。

官方原文

How Filebeat worksedit