1. 引言

本系列上一篇文章《 ELK-002-Beats-Filebeat的HelloWorld》中我们降到了Filebeat的应用场景,同时搭建Filebeat完成了HelloWorld示例,今天我们来探讨下Filebeat的工作原理。

Filebeat主要是靠两个组件共同工作完成日志采集的:harvester(收割者)prospector(勘探者),这两个组件共同工作去获取最新的日志事件然后推送到输出组件中。

2. harvester(收割者)

收割者一词本源自收割庄稼的人,在这儿的词义可理解为采集日志的组件,harvester的主要工作就是读取文件的每一行然后输出到输出组件中,harvester负责打开和关闭文件,只要harvester在运行,文件描述符就一直处于开启状态,如果正好文件被删除或者被重命名,harvester仍然会继续读取该文件,副作用是会造成磁盘空间的额外增加。

3. prospector(勘探者)

勘探者主要用于查找出所有的数据源,同时管理所有的harvester,比如,上一篇文章中我们在Filebeat的配置文件中作了如下配置:

filebeat.prospectors:
- input_type: log
  paths:
    - /var/log/*.log

我们看到该配置文件中,input_type是log,这表示勘探者的类型为log,该勘探者会从我们定义为路径中查找所有的日志文件,这儿是/var/log下所有.log后缀的文件,这儿只是简单的定义了我们要采集的路径和文件类型。

在Filebeat中,目前支持两种勘探者:log和stdin,每个勘探者在配置文件中都可以被定义多次,log勘探者管理着哪些harvester应该启动,哪些正在运行,哪些文件在采集时候要排除在外等。文件大小改变时候,勘探者就会开启harvester去收割新的行。目前仅支持对本地文件的采集,不支持对远程文件的读取。

4. Filebeat 如何保持文件的状态

我们在对路径下多个文件进行日志采集时候,必须要做的一个事情就是状态记录,哪些文件被采集了,哪些文件没有,被采集的文件的偏移(多少行)都是非常重要的信息,如果不记录这些信息,我们重启Filebeat或者Filebeat宕机后,Filebeat之前采集的数据状态就不在了,那么采集工作又得重头再来,这就使得两次采集的数据发生了重复,对于信息采集系统,特别重要的准则就是:不重复、不遗漏,Filebeat通过./data/下的registry文件来记录文件状态,来保证采集的数据不重复不遗漏,如果感兴趣,可以直接使用

cat ./data/registry

查看当前采集的每个文件的状态。当然,官方也提到了很多极端情况:输出组件发生阻塞了,Filebeat宕机了,但是数据还没发送完怎么处理的。在Filebeat的配置中都有比较完善的解决策略,能够最大努力保证数据的不重复不遗漏。