Beats:介绍 Filestream fingerprint 模式

news2024/11/17 14:27:30

作者:Denis Rechkunov

在 Filebeat 8.10.0 和 7.17.12 中,我们引入了一种新的指纹(fingerprint)模式,使用户可以选择使用文件内容的哈希来识别它们,而不是依赖文件系统元数据。 此更改在文件流输入中可用。

什么是文件流?

Filestream 是 Filebeat 中的一种输入类型,用于从给定路径摄取文件。

文件流架构

为了解释什么是指纹模式以及我们在 Filestream 中引入它的具体位置,我们首先解释一下 Filestream 输入的基本架构:

剥掉顶部组件的洋葱皮:

  • 文件扫描程序(File Scanner)收集有关与输入路径匹配的所有文件的信息。
  • 文件观察器(File Watcher)每隔几秒扫描一次文件系统,如在 prospector.scanner.check_interval 设置中指定的那样,然后比较检查之间的文件系统状态。 如果发生变化,它会发出一个描述变化的事件。
  • Prospector 决定如何利用这些文件系统事件:开始/停止收集文件、添加/更新/删除文件的状态等。
    • 为了开始处理文件并管理其在注册表中的状态,Prospector 需要该文件的唯一 ID,该 ID 从输入的 file_identity 参数配置的文件身份提供程序获取。
    • 所有文件状态(如偏移量)都存储在注册表中 - 内存中的存储,每个在 Filebeat 中配置的 registry.flush 间隔都会刷新到磁盘。 它作为操作日志存储在磁盘上。
    • 收集器(havestor)执行实际的文件摄取,并将它们读取的行发送到事件处理管道,该管道执行一些丰富、转换、排队、批处理,并最终将事件传递到输出。

当默认方法不够时

默认情况下,文件扫描程序在搜索重命名/移动时使用文件系统元数据来比较文件,例如:Unix 系统上的 <inode>-<device_id> 字符串(有关 inode 的更多信息可在此处找到)和 Windows 上的 <idxhi>-<idxlo> - <vol> 字符串(分别为 nFileIndexHigh、nFileIndexLow 和 dwVolumeSerialNumber — 请参阅 Microsoft 的官方文档了解更多信息)。 相同的字符串用作文件身份提供程序返回的唯一文件标识符,并且该值用作注册表中每个文件的键以查找文件的当前状态。

文件身份提供程序返回的唯一文件标识符的全部要点是它必须稳定,这意味着在 Filestream 摄取文件期间它不会更改。 它必须是稳定的,因为 Filestream 使用此标识符来跟踪文件元数据,包括文件的当前偏移量,因此它知道在哪里继续摄取。

如果标识符不稳定怎么办? 它会导致数据丢失或数据重复。

数据丢失示例:

  • 文件 ID 现在与不同的文件(之前未摄取)相匹配。
  • Filestream 没有从偏移量 0 读取此文件,而是将错误的偏移量信息应用于此文件。
  • Filestream 继续读取文件中太向前的日志行,跳过日志行。 这些行永远不会到达输出。

数据重复的示例:

  • 现有文件的文件 ID 已更改。
  • 它现在显示为 Filestream 的新文件。
  • 文件流从偏移量 0 开始读取(重新摄取)。

不幸的是,并非所有文件系统都能产生稳定的 device_id 和 inode 值。

文件系统缓存 inode 并重用它们

如果你尝试在不同的文件系统上运行此脚本,你可能会看到不同的结果:

#!/bin/bash

FILENAME=inode-test

touch $FILENAME
INODE=$(ls -i "$FILENAME")
echo "$FILENAME created with inode '$INODE'"

COPY_FILENAME="$FILENAME-copy"
cp -a $FILENAME $COPY_FILENAME
COPY_INODE=$(ls -i "$COPY_FILENAME")
echo "Copied $FILENAME->$COPY_FILENAME, the new inode for the copy '$COPY_INODE'"

rm $FILENAME
echo "$FILENAME has been deleted"

ls $FILENAME

cp -a $COPY_FILENAME $FILENAME
NEW_INODE=$(ls -i "$FILENAME")

echo "After copying $COPY_FILENAME back to $FILENAME the inode is '$NEW_INODE'"

rm $FILENAME $COPY_FILENAME

例如,在 Mac (APFS) 上你将看到:

inode-test created with inode '112076744 inode-test'
Copied inode-test->inode-test-copy, the new inode for the copy '112076745 inode-test-copy'
inode-test has been deleted
After copying inode-test-copy back to inode-test the inode is '112076746 inode-test'

如你所见,在 APFS 上,所有三个文件都有不同的 inode 值:112076744、112076745 和 112076746。因此,这按预期工作。

但是,如果您在 Ubuntu Docker 容器中运行相同的脚本:

inode-test created with inode '1715023 inode-test'
Copied inode-test->inode-test-copy, the new inode for the copy '1715026 inode-test-copy'
inode-test has been deleted
ls: cannot access 'inode-test': No such file or directory
After copying inode-test-copy back to inode-test the inode is '1715023 inode-test'

你可以看到文件系统缓存了我们删除的第一个文件中的 inode 值,并将其重新用于具有相同文件名的第二个副本:1715023、1715026 和 1715023。

它甚至不必是相同的文件名; 不同的文件可以重用相同的 inode:

# touch x
# ls -i x
1715023 x # <-
# rm x
# touch y
# ls -i y
1715023 y # <-

我们主要在容器/虚拟化环境中观察到这些问题,但是否缓存和重用 inode 取决于文件系统实现。 理论上,它可以发生在任何地方。

inode 值在非 Ext 文件系统上可能会发生变化

Ext 文件系统(例如 ext4)将 inode 编号存储在 struct inode 内的 i_ino 文件中,并写入磁盘。 在这种情况下,如果文件相同(不是另一个同名文件),则保证 inode 号相同。

如果文件系统不是 Ext,则 inode 号由文件系统驱动程序定义的 inode 操作生成。 由于他们没有 inode 是什么的概念,因此他们必须模仿所有 inode 的内部字段以符合 VFS,因此这个数字在重新启动后可能会有所不同 - 理论上,即使在再次关闭并打开文件后也是如此。

资料来源:

  • linux - Inode number after reboot - Stack Overflow
  • linux kernel - Inode Number is changing - Stack Overflow

某些文件处理工具会更改 inode 值

  • 我们已经看到我们的客户在使用 rsync 和更改 inode 时遇到问题。
  • 另外,并不是每个人都知道 sed -i 创建一个临时文件,然后将其移动到原始文件的位置,更改 inode 值(它基本上是一个新文件)。 例如,某些用户可能使用 sed -i 来屏蔽日志中的凭据。

设备 ID 可以更改

除了 inode 问题之外,根据磁盘驱动器的安装方式,device_id 可能会在重新启动后发生更改。 不过,我们前段时间已经针对这个问题推出了解决方案:file_identity: inodemarker。

什么是指纹模式?

文件扫描器组件中实现了新的指纹模式,以避免上述问题。

对于给定的文件字节范围,新的指纹模式将默认文件扫描程序行为从使用文件系统元数据切换为使用 SHA256 哈希。 默认情况下,该范围为 0 到 1024,但可以通过 offset 和 length config 参数进行配置。

既然我们在文件扫描器中拥有了此指纹信息,它也会随每个文件系统事件一起传播,并且可以使用此指纹哈希作为文件身份提供程序中的唯一文件标识符。 因此,现在还有一个新的 file_identity: fingerprint 选项,它也允许使用指纹值作为注册表中的主文件标识符。

使用指纹模式 + 指纹文件身份时要注意什么

在开始使用这一新功能之前必须考虑以下几点:

  • 所有日志文件在配置的字节范围内必须是唯一的。 由于时间戳和日志的纯粹性质,大多数日志文件都是如此,但必须检查日志并决定指纹的 offset 和 length。
  • 一旦开始使用 file_identity: fingerprint,你就无法再更改指纹的 offset 和 length; 它将导致与输入路径匹配的所有文件的完全重新摄取。
  • 性能受到影响 - 此功能的性能方面值得在本文中单独讨论:

性能

从开发此功能的早期阶段开始,人们就担心它会对文件扫描程序(File Scanner)造成性能影响。 最后,我们需要打开一个文件,读取由 prospector.scanner.fingerprint.length 配置选项设置的字节数,并从中计算 SHA256。 我们需要对与路径中的 glob 匹配的每个文件执行此操作。

这里需要注意一点:为了实现这个新功能,File Scanner 必须进行大量更改。 所以,我在写代码的时候,趁这个机会重构了 File Scanner 的一些部分,同时做了一些优化,主要是减少了 syscalls。 我还添加了很多测试来验证预期的行为。 因此,有人怀疑新的 File Scanner(禁用指纹模式)速度更快,因为它不再进行那么多的系统调用。

在指纹模式最终交付给 main 后,我运行了一些基准测试,至少可以说结果很有趣:

这里可以得出几个结论:

  • 通过在 File Scanner 中进行上述优化,性能提升了 84%。
  • 新的指纹模式比默认的 device_id+inode(在使用新的 scanner 情况下)模式慢 76%,这使得它比旧 File Scanner 中的默认模式快 8%。 因此,即使启用了指纹模式,我们的客户也将体验到更快的文件流。
  • 哈希算法和指纹长度对整体性能的影响都不大 —— 大部分时间都花在打开和关闭文件进行读取上。 所以,指纹模式的默认值似乎没问题。

结论

这种新的指纹模式解决了文件系统上元数据不稳定的许多问题,并且与之前版本的 Filebeat 相比,它甚至比默认模式更快。

此外,默认模式在新的 Filebeat 版本中变得更快,因此时不时地重构一些旧代码并运行基准测试/分析以查看性能如何变化似乎非常有益。

我们将继续关注 Filebeat 的性能。 敬请关注。

Elastic 8.10 中还有哪些新增功能? 查看 8.10 公告帖子以了解更多信息。

跟多阅读:Beats:使用 Filebeat 中的 filestream 输入更快速、更轻松地读取活动日志文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047373.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nuxt 菜鸟入门学习笔记七:SEO 和 Meta 设置

文章目录 SEO 和 Meta默认值useHeaduseSeoMeta 和 useServerSeoMetaComponentsMeta 对象数据类型格式特性响应式 Reactivity标题模板 Title TemplateBody Tags 示例 ExamplesdefinePageMeta动态设置标题动态添加外部 CSS Nuxt 官网地址&#xff1a; https://nuxt.com/ SEO 和 …

Docker+K3S集群

本次环境使用的是阿里云资源服务器&#xff0c;Linux版本为Centos&#xff0c;集群需要安装Docker和k3s。 Docker下载&#xff1a;Docker(一) 安装Docker_CV猿码人的博客-CSDN博客 K3S 下载&#xff1a;k3s在线快速安装部署-CSDN博客 一、定制镜像 制作Tomcat镜像&#xff0c…

【GDB】命令脚本

文章目录 命令脚本python 脚本 命令脚本 首先对于命令脚本的命名&#xff0c;其实 gdb 没有什么特殊要求&#xff0c;只要文件名不是 gdb 支持的其它脚本语言的文件名就可以了&#xff08;比如.py&#xff09;。因为这样做会使 gdb 按照相应的脚本语言去解析命令脚本&#xff…

成为吃鸡战斗力顶级达人,尽在一站式吃鸡攻略网站!

众所周知&#xff0c;吃鸡游戏是当下最热门的游戏之一。作为专业的吃鸡行家&#xff0c;我将与大家分享一些独特的干货&#xff0c;帮助提高游戏的战斗力、玩转吃鸡作图、查询游戏榜单和装备皮肤库存&#xff0c;并教你如何安全查询游戏账号黑名单、失信人和封禁等信息。 首先&…

系统架构设计师之分布式数据库的模式级别

系统架构设计师之分布式数据库的模式级别

第十章_祖冲之_圆周率

倒数1又2/3章&#xff0c;keep_writting的一天&#xff1a; 第十章10.1.7 运行程序资源下载网站为何打不开呢&#xff1f;

Mysql高手养成——第一章:索引知识,浅尝性能分析

&#x1f4e3; &#x1f4e3; &#x1f4e3; &#x1f4e2;&#x1f4e2;&#x1f4e2; 我是小冷 侧重后端的全栈工程师&#xff0c;有关技术问题需要讨论交流的直接私信即可 ⏩当前专栏&#xff1a;mysql高手养成系列- 第一章 索引与浅尝性能分析 ✏️高质量技术专栏专栏链接:…

osgPBR(十五)镜面IBL--查看不同级别的HDR环境贴图

首先&#xff0c;设置可以使用Mipmap&#xff0c;启用三线性过滤&#xff0c;设置最大级别和最小级别 osg::ref_ptr<osg::TextureCubeMap> tcm new osg::TextureCubeMap; tcm->setTextureSize(128, 128);tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture:…

吃鸡达人分享顶级作战干货,让你的战斗力爆表!

大家好&#xff01;作为一位专业吃鸡行家&#xff0c;我将为大家分享一些热门话题和实用干货&#xff0c;帮助你提高游戏的战斗力&#xff0c;让你在绝地求生中立于不败之地&#xff01; 首先&#xff0c;让我们来谈谈绝地求生作图工具推荐。我们推荐使用一款专业的作图工具&am…

信息安全第三周++

公钥加密算法 公钥加密算法&#xff0c;也被称为非对称加密算法&#xff0c;是现代加密技术的核心概念。与传统的对称加密算法不同&#xff0c;非对称加密使用一对密钥&#xff1a;一个公钥和一个私钥。以下是公钥加密算法的基本思想和工作原理&#xff1a; 密钥对&#xff1a…

英语——谐音篇——单词——单词密码

记忆即联结&#xff0c;只要能建立有效的联结&#xff0c;就能很好地记住。在现实生活中&#xff0c;声音的联结模式能很好地帮助我们记忆。几乎每个学生都曾用谐音的方法记忆一些事物&#xff0c;但很多人都没有意识到&#xff0c;我们每个人都可以通过一定的练习&#xff0c;…

rust生命期

一、生命期是什么 生命期&#xff0c;又叫生存期&#xff0c;就是变量的有效期。 实例1 {let r;{let x 5;r &x;}println!("r: {}", r); }编译错误&#xff0c;原因是r所引用的值已经被释放。 上图中的绿色范围’a表示r的生命期&#xff0c;蓝色范围’b表示…

解决方案 | 法大大电子签赋能电力交易全流程电子化

随着电子签名技术的不断发展和完善&#xff0c;其在各个领域都得到了广泛的应用。尤其在电力交易场景中&#xff0c;电子签的应用能为电力交易带来极大的便利&#xff0c;带来多重价值点。与此同时&#xff0c;国家也出台了相应政策&#xff0c;全面推动各行各业的数字化转型建…

好看的货架效果(含3D效果)

搭配thymeleaf layui合成 货架一 1. css #gudinghuojia2F .layui-row { display: flex; justify-content: space-between; height: 100%;} #gudinghuojia2F .layui-col-xs10 {margin-right: 4%;} #gudinghuojia2F .layui-col-xs10:last-child {margin-right: 0;} .inner-ti…

C语言-变量与数据类型

一、基本语法 1、注释 注释&#xff08;Comments&#xff09;可以出现在代码中的任何位置&#xff0c;用来向用户提示或解释代码的含义。程序编译时&#xff0c;会忽略注释&#xff0c;不做任何处理。 C 语言有两种注释方式&#xff1a; &#xff08;1&#xff09;单行注释 …

【Verilog 教程】6.4Verilog竞争与冒险

关键字&#xff1a;竞争&#xff0c;冒险&#xff0c;书写规范 产生原因 数字电路中&#xff0c;信号传输与状态变换时都会有一定的延时。 在组合逻辑电路中&#xff0c;不同路径的输入信号变化传输到同一点门级电路时&#xff0c;在时间上有先有后&#xff0c;这种先后所形成…

面试题:Java8 lambda 表达式 forEach 如何提前终止?

文章目录 1.情景展示2.原因分析3.解决方案方案一&#xff1a;使用原始的foreach循环方式一&#xff1a;break方式二&#xff1a;return(不推荐使用) 方案二&#xff1a;抛出异常 1.情景展示 如上图所示&#xff0c;我们想要终止for循环&#xff0c;使用return。 执行结果如下&…

成为吃鸡战场的王者!分享顶级战术干货,助您提高战斗力!

各位吃鸡战场的玩家们&#xff0c;欢迎来到本视频&#xff01;在这里&#xff0c;我将为您呈现一些与众不同的吃鸡干货&#xff0c;帮助您提高战斗力、轻松吃鸡&#xff01; 首先&#xff0c;让我们谈一谈作图工具推荐。绝地求生作图工具是吃鸡玩家们的必备利器。我将给大家推荐…

python+vue电子资源管理系统

能实现不出家门就可以通过网络进行系统管理&#xff0c;交易等&#xff0c;而且过程简单、快捷。同样的&#xff0c;在人们的工作生活中&#xff0c;也就需要互联网技术来方便人们的日常工作生活&#xff0c;实现工作办公的自动化处理&#xff0c;实现信息化&#xff0c;无纸化…

1.物联网射频识别

1.RFID概念 RFID是Radio Frequency Identification的缩写&#xff0c;又称无线射频识别&#xff0c;是一种通信技术&#xff0c;可通过无线电讯号识别特定目标并读写相关数据&#xff0c;而无需与被识别物体建立机械或光学接触。 RFID&#xff08;Radio Frequency Identificati…