玩日志的你不了解 Filebeat ,就像搞结拜不认识关二爷!深度解析 Filebeat 工作原理,轻松玩转大数据!


在这里插入图片描述

深度解析 Filebeat 工作原理,轻松玩转大数据!

什么是 Filebeat

玩日志的同学可能比较了解 Filebeat。Filebeat 是一个轻量级的日志收集模块。由 Goland 实现,用于转发和汇总日志与文件。它是 ES [elastic] 旗下 beats 项目其中的一员,通常与 ELK 配套使用,编排在 Logstash 之前。

这里放上 Filebeat 的官方介绍:https://www.elastic.co/cn/beats/filebeat

Filebeat 工作原理

官网中有 Filebeat 的文档,是英文版,这里附上译文:

Filebeat 的工作原理
在本主题中,您将了解 Filebeat 的关键构建块以及它们如何协同工作。了解这些概念将帮助您就为特定用例配置 Filebeat 做出明智的决定。

Filebeat 由两个主要组件组成:Input和Harvester。这些组件协同工作以拖尾文件并将事件数据发送到您指定的输出。

什么是Harvester?
Harvester负责读取单个文件的内容。Harvester逐行读取每个文件,并将内容发送到输出。为每个文件启动一个Harvester。Harvester负责打开和关闭文件,这意味着Harvester运行时文件描述符保持打开状态。如果文件在收集过程中被删除或重命名,Filebeat 会继续读取该文件。这会产生副作用,即磁盘上的空间会被保留,直到Harvester关闭。默认情况下,Filebeat 保持文件打开直到 close_inactive 达到。

关闭Harvester会产生以下后果:

  • 如果在Harvester仍在读取文件时删除了文件,则文件处理程序将关闭,从而释放底层资源。
  • 只有在 scan_frequency 结束后才会重新开始收集文件。
  • 如果在Harvester关闭时移动或移除文件,则不会继续收割文件。
  • 要控制Harvester何时关闭,请使用 close_* 配置选项。

什么是Input?
Input负责管理Harvester并找到所有要读取的源。

如果Input类型是日志,则Input会查找驱动器上与定义的 glob 路径匹配的所有文件,并为每个文件启动Harvester。每个Input都在自己的 Go 例程中运行。

以下示例将 Filebeat 配置为从与指定的 glob 模式匹配的所有日志文件中收集行:

filebeat.inputs:

  • 类型:日志
    路径:
    - /var/log/.log
    - /var/path2/
    .log

Filebeat 目前支持多种Input类型。每个Input类型可以定义多次。日志Input检查每个文件以查看是否需要启动Harvester,是否已经在运行,或者是否可以忽略该文件(请参阅 ignore_older)。仅当Harvester关闭后文件的大小发生变化时才会拾取新行。

Filebeat 如何保持文件的状态?
Filebeat 保持每个文件的状态,并经常将状态刷新到注册表文件中的磁盘。该状态用于记住Harvester读取的最后一个偏移量,并确保发送所有日志行。如果无法访问输出(例如 Elasticsearch 或 Logstash),Filebeat 会跟踪发送的最后一行,并在输出再次可用时继续读取文件。当 Filebeat 运行时,每个Input的状态信息也保存在内存中。当 Filebeat 重新启动时,来自注册表文件的数据用于重建状态,Filebeat 在最后一个已知位置继续每个Harvester。

对于每个Input,Filebeat 会保留它找到的每个文件的状态。由于文件可以重命名或移动,文件名和路径不足以识别文件。对于每个文件,Filebeat 存储唯一标识符以检测之前是否收集了文件。

如果您的用例涉及每天创建大量新文件,您可能会发现注册表文件变得太大。有关可以设置以解决此问题的配置选项的详细信息,请参阅注册表文件太大。

Filebeat 如何确保至少一次交付?
Filebeat 保证事件将至少传送到配置的输出一次并且不会丢失数据。 Filebeat 能够实现这种行为,因为它将每个事件的传递状态存储在注册表文件中。

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

如果 Filebeat 在发送事件的过程中关闭,它不会在关闭之前等待输出确认所有事件。任何发送到输出但在 Filebeat 关闭之前未确认的事件,将在 Filebeat 重新启动时再次发送。这可确保每个事件至少发送一次,但最终可能会将重复的事件发送到输出。您可以通过设置 shutdown_timeout 选项将 Filebeat 配置为在关闭之前等待特定时间。

Filebeat 的至少一次交付保证存在限制,涉及日志轮换和删除旧文件。如果将日志文件写入磁盘并以比 Filebeat 处理它们的速度更快的速度旋转,或者如果在输出不可用时删除文件,则数据可能会丢失。在 Linux 上,由于 inode 重用,Filebeat 也有可能跳过行。

Filebeat 工作流图

相信大家看了文档之后,可以了解到 Filebeat 的基本组件及相关的功能实现。

这里通过一流程图形式化的方式进一步介绍 Filebeat 是如何工作的!

Filebeat 组件图

在这里插入图片描述
如图所示,Filebeat 有两个主要组件,分别为 Input 、 Harvester。

  • Input 主要负责依据配置信息发现数据源,并管理正则命中的 Harvester。
  • Harvester 主要负责日志文件的行数据收集,针对每个日志会构建独立的 Harvester。

Filebeat 部署之后,将由 Input 发现数据源,为每个文件构建 Harvester 实例;通过 Harvester 实例频次收集日志数据,并实时推送给目标输出。

Filebeat Harvester 流程图

看了组件图,还是不够细致,无法看到 Harvester 日志具体的收集策略!

下面是 Harvester 的主要流程图:
在这里插入图片描述
如图所示,Harvester 先会读取上次文件位置的偏移量,顺序读文件更新行直至读到最后一行 EOF;此时 Harvester 会进行 Counter 的初始化,以 配置参数 backoff 为基准,执行退避策略,监测文件是否更新。

  • backoff 时间间隔默认 1 — 10s,默认系数为 2;
    • backoff:1
    • max_backoff:10
    • backoff_factor:2
  • 其监测时间间隔会逐步增大,backoff = backoff * backoff_factor 为间隔频次,且不会超过 max_backoff 。当间隔周期结束或文件存在更新,backoff 会自动回退至 1s 。

在监测过程中,Harvester 受 close_inactive 参数影响。当 Counter 监测时间到达 close_inactive 时间,则此 Harvester 会自动关闭。由 Input 继续按 scan_frequency 频次寻找数据源并构建新的 Harvester …

Filebeat 配置参数

上面流图中介绍了主要阶段,Harvester 还与很多参数紧密相关,下面列部分参数含义供大家参考。

paths:指定要监控的日志。
encoding:指定被监控的文件的编码类型,使用 plain 和 utf-8 都是可以处理中文日志的。
input_type:指定文件的输入类型 log (默认)或者 stdin 。
exclude_lines:在输入中排除符合正则表达式列表的那些行。
include_lines:包含输入中符合正则表达式列表的那些行(默认包含所有行),include_lines 执行完毕之后会执行 exclude_lines。
exclude_files:忽略掉符合正则表达式列表的文件(默认为每一个符合 paths 定义的文件都创建一个harvester)。
fields:向输出的每一条日志添加额外的信息,比如 “level:debug”,方便后续对日志进行分组统计。默认情况下,会在输出信息的 fields 子目录下以指定的新增 fields 建立子目录,例如 fields.level。
scan_frequency:Filebeat 以多快的频率去 input 指定的目录下面检测文件更新(比如是否有新增文件)。
harvester_buffer_size:每个 harvester 监控文件时,使用的 buffer 的大小,默认是 16384 。
max_bytes:日志文件中增加一行算一个日志事件,max_bytes 限制在一次日志事件中最多上传的字节数,多出的字节会被丢弃,默认是10M。
Backoff:Filebea t检测到某个文件到了 EOF 之后,每次等待多久再去检测文件是否有更新,默认为1s。
max_backoff:Filebea t检测到某个文件到了 EOF 之后,等待检测文件更新的最大时间,默认是10秒。
backoff_factor:定义到达 max_backoff 的速度,默认因子是2,到达 max_backoff 后,变成每次等待 max_backoff 那么长的时间才 backoff 一次,直到文件有更新才会重置为 backoff。
…

Q&A

1、Filebeat 部署 和 服务部署 有先后顺序吗?

无顺序。Filebeat 会频次扫描配置文件指定文件路径,若存在,才会进行 Input 的构建进行下一步的日志收集。

2、Filebeat 是实时收集日志吗?

跟具体配置有关,可认为是实时性质。

3、Filebeat 会出现日志漏发的场景吗?是否可靠呢?

存在,但概率跟小。
可认为 Filebeat 99.999% 准确实时,但是并不会 100% 十分精确。
其发送机制为:至少一次发送,存在多发的场景、且日志旋转速度超过时,存在数据丢失、Linux inode 重用也可能导致跳过行发送

4、至少一次发送里面涉及 inode 重用,什么是 Linux Inode 重用?

Linux文件系统,Filebeat 使用 inode 和设备来识别文件。从磁盘中删除文件时,可将 inode 分配给新文件。在涉及文件旋转的使用情况下,如果旧文件被删除并且之后立即创建新文件,则新文件可能与删除的文件具有完全相同的inode。

附录

负重前行,向阳而生!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏小言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值