elk原理简述 - filebeat

特点:

  1. 轻量简便,资源占用少
  2. 断点续传:异常中断停止重启后会继续上次停止的位置。
  3. 使用压力敏感协议,会自动控制文件的传输速度
  4. 内部模块化,可以和很多组件连接

Filebeat 的可靠性很强,可以保证日志 At least once 的上报,同时也考虑了日志搜集中的各类问题,例如日志断点续读、文件名更改、日志 Truncated 等。

工作原理:

fileBeat由采集器和输入组成。采集器主要负责扫描文件,采集文件内容,而输入模块则是管理采集器找到所有的数据采集源。

采集器采用的的是固定频率轮询扫描的方式,读取方式为line by line。值得注意的是,当采集器打开一个文件的时候,如果这个这个文件被删除或者改名。采集器仍然会继续工作。采集器关闭的时机由close_inactive的参数决定(多长时间没有采集就会关闭文件句柄,依赖文件的修改时间,该参数适用于实时日志采集)。

当然,从性能的角度考虑,即时采集器没有关闭,也不会时时轮询文件,而是固定频率检查,只有经过了这个频率,采集器才会工作(由scan_frequency参数决定,默认10s)。并且,当采集器采集完数据后能够保证至少一次的数据交付。因为其会将每个事件的传递状态存储到注册表中,如果输出没有被对方确认,就会继续尝试发送该事件。也就是说其能保证数据不丢失。但是可能导致数据重复发送。如果刚发送完自身就重启了就可能出现这种情况,可以通过shutdown_timeout来设置在关闭前等待一段时间。

filebeat丢失数据的场景:filebeat处理速度跟不上日志写入磁盘造成日志轮换或者旧文件删除的情况下,或者输出不可用情况下,文件被删除了。

input的定时扫描

filebeat中有两个记录文件状态的地方,一个是input中,一个是Registrar。不一样的是后者是持久化存储,而input仅仅表示当前文件的读取偏移量,修改时不会同步到磁盘中。

每次filebeat启动都会载入Registrar中记录的文件状态作为初始状态。input文件状态中有两个重要的参数:

  • offset:表示文件当前读取的偏移量。一旦收集器读取文件后,这个值就会改变。
  • finished:表示文件对应的收集器是否完成。

input对于每个匹配到的文件都会开启一个采集器进行逐行读取。读取到数据后就会更新暂存在input中的偏移量。采集器读取文件并不是实时读取的,而是采用固定频率扫描的方式。即使文件改名或者删除采集器都不会关闭(因为input中存放了文件的一系列特征,并非只有文件名和路径)。采集器的关闭由close_inactive参数决定(一旦达到一定时长没有读取文件就会关闭文件句柄。这个就依赖文件的最后修改时间了)。

同时,需要考虑到,日志是不断增长和变化的,会不断有新的日志产生,可能某个采集器退出后,又有了内容更新。为了解决这个问题,input采取了定时扫描的方式(scan_frequency​:默认是10s)。每次定时扫描都会找对应的文件状态:

  1. input找不到文件状态,说明是新增文件,开启一个采集器,从头开始解析文件

  2. 如果可以找到文件状态,且finished为false,说明已经有采集器在处理了直接忽略

    1. 如果文件被截断过,后来又有了内容更新且offset还小于当前文件大小。那么offset是检查不出来这种情况的,一般情况被采集的文件不能修改。
  3. 如果可以找到文件状态,且finished为TRUE,说明之前有采集器,但是已经处理结束了

    1. 如果offset大于当前文件大小,说明文件被截断过,此时按照新文件处理从头开始解析
    2. 如果offset小于当前文件大小,说明采集器退出之后有了内容更新,从上次的offset处理即可

pipeline

采集器将数据写入缓存,输出组件将数据从缓存读走这个过程是pipeline进行调度的。此外,Filebeat 的缓存目前分为 memqueue 和 spool。memqueue 顾名思义就是内存缓存,spool 则是将数据缓存到磁盘中。

Harvester 通过 pipeline 提供的 pipelineClient 将数据写入到 pipeline 中,Haveseter 会将读到的数据会包装成一个 Event 结构体,再递交给 pipeline。

在 Filebeat 的实现中,pipelineClient 并不直接操作缓存,而是将 event 先写入一个 events channel 中。

同时,有一个 eventloop 组件,会监听 events channel 的事件到来,等 event 到达时,eventloop 会将其放入缓存中。

当缓存满的时候,eventloop 直接移除对该 channel 的监听。

每次 event ACK 或者取消后,缓存不再满了,则 eventloop 会重新监听 events channel。

以上是 Pipeline 的写入过程,此时 event 已被写入到了缓存中。

Ack 机制

之所以filebeat能够保证至少一次上报就是基于ack机制。当output publish成功之后会调用ack,最终Registrar会收到ACK,并修改偏移量

相关推荐
杨DaB2 小时前
【SpringMVC】拦截器,实现小型登录验证
java·开发语言·后端·servlet·mvc
微学AI5 小时前
时序数据库选型指南:工业大数据场景下基于Apache IoTDB技术价值与实践路径
大数据·apache·时序数据库
lingling0098 小时前
颐顿机电携手观远BI数据:以数据驱动决策,领跑先进制造智能化升级
大数据·人工智能·制造
b***25118 小时前
电池自动生产线:科技赋能下的高效制造新范式
大数据·人工智能
努力的小雨8 小时前
还在为调试提示词头疼?一个案例教你轻松上手!
后端
魔都吴所谓9 小时前
【go】语言的匿名变量如何定义与使用
开发语言·后端·golang
陈佬昔没带相机9 小时前
围观前后端对接的 TypeScript 最佳实践,我们缺什么?
前端·后端·api
Livingbody11 小时前
大模型微调数据集加载和分析
后端
Livingbody11 小时前
第一次免费使用A800显卡80GB显存微调Ernie大模型
后端
哈哈很哈哈11 小时前
Hadoop JMX 配置的完整文档
大数据·hadoop·分布式