5、Filebeat工作原理
Filebeat工作原理
Filebeat由两个主要组件组成:inputsharvesters。 这些组件协同工作来查看最新文件内容并将事件数据发送到指定的输出。(注意与之前版本的不同,之前版本是prospectors和havesters)

 

harvester
Harvester(收割机)负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到指定输出。Harvester负责打开和关闭文件,这意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在被harvested(收集)中被删除或者被重命名,Harvester会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。默认情况filebeat会保持文件打开的状态,直到达到close_inactive(如果此选项开启,filebeat会在指定时间内将不再更新的文件句柄关闭,时间从harvester读取最后一行的时间开始计时。若文件句柄被关闭后,文件发生变化,则会启动一个新的harvester。若此参数配置不当,则可能发生日志不实时的情况Harvester使用内部时间戳来记录文件最后被收集的时间。例如:设置5m,则在Harvester读取文件的最后一行之后,开始倒计时5分钟,若5分钟内文件无变化,则关闭文件句柄。默认5m)。
关闭Harvester会产生以下后果:
  • 文件处理已关闭,在harvester仍在读取文件时如果文件被删除,则释放底层资源。
  • 文件的采集只会在 scan_frequency 过后重新开始。
  • 如果在harvester关闭的情况下移动或移除文件,则不会继续采集文件数据。
要控制harvester何时关闭,请使用close_* 配置选项。

 

Inputs
input负责管理harvesters找到所有要读取的资源。
如果input类型为log,则input将查磁盘上与定义的全局路径匹配的所有文件,并为每个文件启动一个harvester。 每个input都在自己的Go程序中运行。
以下Filebeat配置示例从与指定的全局模式匹配的所有日志文件中收集日志数据行:
filebeat.inputs: - type: log paths: - /var/log/*.log - /var/path2/*.log
Filebeat目前支持 several input types.。 每种输入类型都可以定义多次。 log input检查每个文件以查看是否需要启动harvester,是否已经运行harvester,或者是否可以忽略该文件(see ignore_older)。 只有在harvester被关闭后文件的大小发生变化,才会继续采集新增行。

 

Filebeat如何记录文件状态:
将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此文件可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。在Filebeat运行时,状态信息也会保存在内存中以用于每个输入。重新启动Filebeat时,使用registry文件的数据用于重建状态,Filebeat会在最后一个已知位置继续运行每个havester。对于每个输入,filebeat会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。
如果使用配置涉及每天创建大量新文件,会发现注册表文件增长过大。请参阅Registry file is too large?有关可以设置以解决此问题的配置选项的详细信息。

     registry文件内容示例:

[root@localhost ~]# cat /var/lib/filebeat/registry 
[{"source":"/var/log/secure","offset":2201,"timestamp":"2018-09-04T10:35:03.281727468+08:00","ttl":-1,"type":"log","FileStateOS":{"inode":2099070,"device":64515}}, {"source":"/var/log/messages","offset":527,"timestamp":"2018-09-04T01:05:19.015351312+08:00","ttl":-1,"type":"log","FileStateOS":{"inode":2099069,"device":64515}}]

 

 

Filebeat如何保证事件至少被输出一次:
Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在注册文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会关闭之前确认所有发送事件(此时registry文件未记录该文件发送的偏移量)。任何在filebeat关闭之前未确认的事件,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。
注意:Filebeat的至少一次输出受到日志轮换和删除旧文件的限制。 如果将日志文件写入磁盘并且日志轮换的速度超过Filebeat处理的速度,或者如果文件在输出不可用时被删除,数据可能会丢失。 在Linux上,Filebeat也可能因inode重用而跳过行。 有关inode重用问题的更多详细信息,请参阅Frequently asked questions 
参考链接:
posted on 2018-09-04 10:20  jmucai  阅读(813)  评论(0编辑  收藏  举报