ELK Stack 中 Filebeat的工作原理

Filebeat由两个主要组件构成: prospector和 harvesters。这两类组件一起协同完成Filebeat的工作,从指定文件中把数据读取出来,然后发送事件数据到配置的output中。

什么是Harvesters?
Harvesters负责进行单个文件的内容收集,在运行过程中,每一个Harvester会对一个文件逐行进行内容读取,并且把读写到的内容发送到配置的output中。当Harvester开始进行文件的读取后,将会负责这个文件的打开和关闭操作,这就意味着在Harvester运行过程中,文件都处于打开状态。如果在收集过程中,即使删除了这个文件或者是对文件进行重命名,Filebeat依然会继续对这个文件进行读取,这时候将会一直占用着文件所对应的磁盘空间,直到Harvester关闭。默认情况下,Filebeat会一直保持文件的开启状态,直到超过配置的close_inactive参数,Filebeat才会把Harvester关闭。

关闭Harvesters会带来的影响:
file Handler将会被关闭,如果在Harvester关闭之前,读取的文件已经被删除或者重命名,这时候会释放之前被占用的磁盘资源。
当时间到达配置的scan_frequency参数,将会重新启动为文件内容的收集。
如果在Havester关闭以后,移动或者删除了文件,Havester再次启动时,将会无法收集文件数据。

当需要关闭Harvester的时候,可以通过close_*配置项来控制。

什么是Prospector?
Prospector负责管理Harvsters,并且找到所有需要进行读取的数据源。如果input type配置的是log类型,Prospector将会去配置度路径下查找所有能匹配上的文件,然后为每一个文件创建一个Harvster。每个Prospector都运行在自己的Go routine里。
下面是一个Filebeat的配置示例,Harvster会从所有可以与配置路径相匹配的文件里逐行收集内容。
filebeat.prospectors:
    - input_type: log
paths:
    - /var/log/*.log
    - /var/path2/*.log

Filebeat目前支持两种Prospector类型:log和stdin。每个Prospector类型可以在配置文件定义多个。log Prospector将会检查每一个文件是否需要启动Harvster,启动的Harvster是否还在运行,或者是该文件是否被忽略(可以通过配置 ignore_order,进行文件忽略)。如果是在Filebeat运行过程中新创建的文件,只要在Harvster关闭后,文件大小发生了变化,新文件才会被Prospector选择到。


Filebeat是怎么保持文件状态的?
Filebeat可以保持每个文件的状态,并且频繁地把文件状态从注册表里更新到磁盘。这里所说的文件状态是用来记录上一次Harvster读取文件时读取到的位置,以保证能把全部的日志数据都读取出来,然后发送给output。如果在某一时刻,作为output的ElasticSearch或者Logstash变成了不可用,Filebeat将会把最后的文件读取位置保存下来,直到output重新可用的时候,快速地恢复文件数据的读取。在Filebaet运行过程中,每个Prospector的状态信息都会保存在内存里。如果Filebeat出行了重启,完成重启之后,会从注册表文件里恢复重启之前的状态信息,让FIlebeat继续从之前已知的位置开始进行数据读取。
Prospector会为每一个找到的文件保持状态信息。因为文件可以进行重命名或者是更改路径,所以文件名和路径不足以用来识别文件。对于Filebeat来说,都是通过实现存储的唯一标识符来判断文件是否之前已经被采集过。
如果在你的使用场景中,每天会产生大量的新文件,你将会发现Filebeat的注册表文件会变得非常大。这个时候,你可以参考( the section called “Registry file is too large? edit ),来解决这个问题。

Filebeat怎么确保收集到的数据至少发送一次?
Filebeat能保证把通过事件把采集到的数据对配置的output至少发送成功一次,不会有数据丢失的情况发生。Filebeat能够实现这一功能,是因为它把每一个事件的传递状态都存储在了注册表文件中。
在某一情况下,如果定义的output发生了阻塞,没有对事件进行接受确认,Filebeat将会不停地尝试向output发送事件,直到output给定一个明确的回复,确认接收到了事件。
如果Filebeat在向output发送事件的过程中终止了,而且这样的终止是发生在接受到output回复的确认事件之前。有一些事件由Filebeat发送到output,但是Filebeat没有接收到output的确认,当Filebeat重新启动之后,将会重新发送一次事件到output。这样就能确保每一个事件都至少会向output发送一次。用户可以通过设置shutdown_timeout,让FIlebeat关闭之前等待一段时间。

你可能感兴趣的:(ELK)