ELK Stack-Filebeat

Filebeat主要由两部分组成:inputs和harvester。这两个组件组合在一起,就可以追踪数据文件并且将发送至你指定的目的地。

什么是harvester?

harvester负责读取数据文件的内容。harvester会逐行读取文件并把读取到的数据发送到输出。每个被采集文件都会开启一个harvester。文件打开或关闭都由harvester来管理,这意味着在harvester运行期间,其对应的文件句柄都会保持激活状态,如果正在被采集的文件被移动或者重命名,Filebeat会继续读取文件。这将造成被采集的文件会一直占用磁盘空间直到harvester停止工作。

什么是inputs?

inputs管理所有的harvester并查找所有的数据源。如果输入的类型是log,inputs会在指定的路径查找到与路径通配符匹配的文件,并对每个文件都启动一个harvester。每个inputs运行在自己的Go routine中。当harvester再次启动时文件大小发生变化,只会收集上次关闭后新增的数据行。

Filebeat如何保持文件状态?

Filebeat会持续保留每个文件的状态并且定期将状态信息刷新到磁盘上的注册表文件中。这个文件状态用于记录harvester读取文件数据的最新偏移量并保证所有数据都被读取发送出去。如果输出端(Logstash或Elasticsearch)不可达,Filebeat会不断发送最后发送的数据行,一旦输出正常会继续从最后停留的数据行开始读取文件。当Filebeat重启时,会根据磁盘中的注册表文件中的状态重建状态信息,harvester会根据重建的状态从最后收集的位置重新开始读取数据。

对于inputs,Filebeat会记录它探测的每个文件的状态,因为这些文件有可能会被移动或者重命名,仅靠文件名或路径不足以标识一个文件,对此,Filebeat对每个探测的文件保存一个唯一的标识符(在linux上,这个标识符为inode)。

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

Filebeat之所以能够确保不丢失是因为它在注册表文件中存储了每个日志事件的传递状态。

在输出中端、无法确认所有事件都被收到的情况下,Filebeat将会持续发送事件直到输出确认收到事件。

如果Filebeat在发送事件时被关闭,它不会再关闭前等待输出确认所有时间到达,即它会马上关闭。在Filebeat重启时,在关闭退出前已经发送但未收到确定的时间将会被再次发送,这样确保了每个时间至少会被交付一次,但是这会造成一部分事件重复发送。(可以通过配置'shutdown_timeout'来设置Filebeat在关闭退出前等待一段时间)

 

Filebeat也可能出现丢失数据或者收集到的数据不合法的情况

如果日志写入磁盘的速度超过了Filebeat读取日志的速度,当日志删除或者日志被覆盖时,则可能会丢失数据。

在Linux文件系统上,Filebeat使用inode和设备来识别文件。从磁盘中删除文件时,可将inode分配给新文件。在涉及文件旋转的使用情况下,如果旧文件被删除并且之后立即创建新文件,则新文件可能与删除的文件具有完全相同的inode。在这种情况下,Filebeat假定新文件与旧文件相同,并尝试在旧位置继续读取,这是不正确的。
默认状态不会从注册表文件中删除。要解决inode重用问题,我们建议您使用clean_ *选项(特别是clean_inactive)来删除非活动文件的状态。例如,如果您的文件每24小时轮换一次,并且轮换的文件不再更新,则可以将ignore_older设置为48小时,将clean_inactive设置为72小时。
您可以使用clean_removed从磁盘中删除的文件。请注意,clean_removed会在扫描期间无法找到文件时清除注册表中的文件状态。如果该文件稍后再次显示,则将从头开始重新发送。

posted @ 2020-09-25 17:57  下山打老虎i  阅读(122)  评论(0)    收藏  举报