Filebeat采集数据到ES保证数据不重复

news2024/12/23 15:48:04

一.背景

        业务需求使然,API接口负责收集用户传递上来的json数据,为了保证接口性能和数据的可靠性。我们没有直接拿到数据,然后存储到mysql或者kafka,而是直接使用最稳妥的方式,写文件。之后采用filebeat对数据文件进行采集,最后推送到Elasticsearch进行存储便于检索。

        为什么选择filebeat采集文件的这种方案,而不是自己实现或者采用别的方案呢?

        1.filebeat资源占用小、跨平台、稳定

        2.filebeat推送数据到Elasticsearch等都有对应的重试机制,就算是挂了也能尽量保证数据采集的offset的正确性,防止数据漏采集或者多采集的情况

         但同时也会带来一个问题就是,如果防止filebeat某种情况下降数据重复推送到Elasticsearch导致出现多条重复数据呢?

二.分析与解决

2.1 指定@metadata._id保证唯一性

        查阅官方文档,我们可以在这一章看到有3种方式来实现指定插入到Elasticsearch可以指定_id的值可以用我们的业务字段进行设置,同时自己自定义设置。例如我们有一个业务call_id是能保证唯一的,那么我们指定这个call_id字段作为_id即可解决由于filebeat重试导致推送多条重复数据的情况。在已经设置@metadata._id的情况下并且没做其他操作,那么filebeat调用Elasticsearch的_bulk API接口,使用action: create进行插入数据.  (create的基本原理是, 根据_id判断数据,如果数据已经存在则忽略插入操作,如果不存在才插入)

 文档详情地址: https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-deduplication.html#_how_can_i_avoid_duplicates

2.2 指定@metadata._id,但是希望action是index而不是create

        相对上面的情况,我们有时候希望的是,相同_id存在的情况下是后面推送的数据是覆盖而不是丢弃。这个时候怎么办呢? 找遍全网资料和文档资料,都没找到能解决的办法。

        后来直接看源码分析吧。既然是调用了Elasticsearch的_bulk API, action字段是index还是create到底filebeat源码是怎么处理的? 是直接写死了create, 还是说这个action可以通过配置的方式进行设置呢? 带着疑问开始找源码。 果然找到了:

        调用_bulk API的地方:

        再继续往下看,怎么拼的post请求参数:

        关注opType变量是什么东西?难道是index、create这些么?

        

        搜索OpTypeDelete关键词: 

https://github.com/elastic/beats/blob/237937085a5a7337ba06f1268cfc55cd4b869e31/libbeat/beat/events/util.go

 

翻译一下:

//FieldMetaOpType定义用于Elasticsearch的事件操作类型的元数据键名称

//事件的批量API编码。键的值可以是空字符串、“创建”、“索引”或“删除”。

//如果为空,则如果设置了FieldMetaID,将使用“create”;否则将使用“索引”

由此我们看出来,opType是可变的,那我们可以在配置文件还是数据上改变opType呢?
上面清楚的说明了,如果我们的@metadata._id设置了,则使用create. 否则使用index.

搜索FieldMetaOpType, 看到, 原来如此, event的@metadata对象是一个map,可以通过key获取value. 

那么我们只要在@metadata对象设置@metadata.op_type=”index”即可

 如何设置@medata.op_type="index"呢? 只要在processors加一个script处理即可:

processors:
  - script:
      lang: javascript
      source: >
        function process(event) {
          event.Put("@metadata._id", event.Get("did") + "_" + event.Get("call_id")); # 指定es文档的唯一ID
          event.Put("@metadata.op_type","index"); # 使用index而不是create
        }

 这个实例也告诉了我们两件事, 那就是: 

        1.就算是官方文档也不可能事无巨细的写在上面, 如果官方文档没有的,可以尝试从源码入手,也是一个不错的选择。 

        2.这种开源级别的项目作者是真牛批,已经把这些情况都想得很周到,没有写死在代码中。这就是大牛写的代码样例,我们平时也可以多借鉴一下这种思想。

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

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

相关文章

8_1、Java基本语法之多线程基本概念

一、涉及到多线程的基本概念 1、程序(programm) 概念:是为完成特定任务、用某种语言编写的一组指令的集合。即指一 段静态的代码,静态对象。 2、进程(process) 概念:是程序的一次执行过程,或是正在运行的一个程…

Cy7 Tyramide, Tyramide-Cy7,花青素Cy7 酪酰胺化学试剂供应

一:产品描述 1、名称 英文:Cyanine7 Tyramide,Cy7 Tyramide,Tyramide-Cy7 中文:花青素Cy7 酪酰胺 2、CAS编号:N/A 3、所属分类:Cyanine 4、分子量:802.01 5、分子式&#xff…

Docker学习6-Docker镜像commit操作案例

在上一篇中,我们知道了docker是基于联合文件系统的分层镜像。而且也知道了镜像是只读的,容器才是可以写的。那么,如果我们要修改镜像,修改之后,怎么提交呢?本文,凯哥将介绍,docker的…

svd分解

sklearn中svd分解 class sklearn.decomposition.TruncatedSVD(n_components2, *, algorithmrandomized, n_iter5, random_stateNone, tol0.0) 参数: n_components:整数,默认2 输出数据的所需维度。必须严格小于特征数。默认值对可视化很有用…

Git 操作 Gitea 出现 kex_exchange_identification: Connection closed by remote host

1. 问题背景 我的部分代码储存在使用 Gitea 搭建的服务上: DevWiki - 首页 - DevWiki Gitea 之前都是使用网页在网站上进行 仓库管理, 今天在clone代码的时候出现异常: kex_exchange_identification: Connection closed by remote host, 具体以下提示: $ git clone gitgit.d…

【案例分享】跨机房ES同步实战

背景 众所周知单个机房在出现不可抗拒的问题(如断电、断网等因素)时,会导致无法正常提供服务,会对业务造成潜在的损失。所以在协同办公领域,一种可以基于同城或异地多活机制的高可用设计,在保障数据一致性…

微软CTO谈AI:逃不掉马拉松就准备好跑鞋!30秒自动化妆机;ChatGPT刷爆票圈;剪纸风格的AI绘画 | ShowMeAI资讯日报

👀日报合辑 | 🎡AI应用与工具大全 | 🔔公众号资料下载 | 🍩韩信子 📢 对话微软 CTO 凯文斯科特 (Kevin Scott):人工智能将去向何方? https://blogs.microsoft.com/ai/a-conversation-with-kevi…

【卡塔尔世界杯】空调制冷,全是科技与狠活

半自动化越位技术比赛用球AI Rihla球场智能空调Feelix Palm辅助技术可持续利用的体育场便利的数字设施和App 西班牙队和英格兰队穿外套出场,卡塔尔的空调功率到底有多大? 还是很大的,不管是室外还是室内,到处都安装了空调&#…

Verilog系统函数

Verilog系统函数前言一、$width(一)简介(二)$width 参数(三)例子二、Specify参数三、$display(一)简介(二)格式说明(三)例子1.例12.例…

Bert论文解读及相关代码实践

Bert:Bidirectional Encoder Representations from Transformers Transformer中双向Encoder表达学习。BERT被设计为通过在所有层中对左右上下文进行联合调节,从未标记文本中预训练深度双向表示。预训练的BERT模型可以通过仅一个额外的输出层进行微调&am…

AVS-试听分割-论文阅读

题目: Audio-Visual Segmentation 论文地址:https://arxiv.org/abs/2207.05042 GitHub地址:https://github.com/OpenNLPLab/AVSBench 项目主页:https://opennlplab.github.io/AVSBench/ 相关博客https://arxiv.org/abs/2203.03821 摘要 We propose to explore a new pro…

(附源码)ssm汽车租赁 毕业设计 271621

基于ssm的汽车租赁平台的设计与实现 摘 要 随着社会经济的快速发展,我国机动车保有量大幅增加,城市交通问题日益严重。为缓解用户停车难问题,本文设计并实现了汽车租赁平台.该系统通过错峰停车达到车位利用率最大化.基于现状分析,本文结合实际停车问题,从系统应用流程,系统软硬…

微电网和直流电网中最优潮流(OPF)的凸优化(Matlab代码实现)

📋📋📋本文目录如下:⛳️⛳️⛳️ 目录 1 概述 2 最优潮流 3 电力系统强大的CVX 4 直流电网中最优潮流(OPF)的凸优化 4.1 Matlab代码 4.2 运行结果 5 微电网中最优潮流(OPF)的凸优…

go gin web综合教程,包括 mysql redis log 路由

前言 在学习go许久,没看到网上有比较综合的gin web教程,很多都是最基础的教程,完全就是启动个服务返回参数,没有过多的结合实际开发。下面我结合一下我的经验,来写一篇深入的综合教程,包括数据库Mysql、re…

JMeter启动时常见的错误

很多小伙伴在学工具这一块时,安装也是很吃力的一个问题,之前记得有说过怎么安装jmeter这个工具。那么你要启动jmeter的时候,一些粉丝就会碰到如下几个问题。 1.解压下载好的jmeter安装,Windows 平台,双击 jmeter/bin …

基于python实现的SGM半全局立体匹配算法

文章目录前言一、SGM是什么?1.代价计算2.代价聚合3.视察计算4.视察优化二、基于python实现SGM算法?总结前言 开始正是入门立体匹配算法啦,会不断更新立体匹配的算法和代码。   水平有限,旨在先了解和读懂别人的代码的实现方式&a…

3D立体匹配入门 - 视差计算

经典假设 1、左右视图成功匹配的窗口,具有相同的像素 这个是最经典的假设,几乎所有视差图计算都用上了他,通过匹配左右窗口像素,得到最佳匹配对应的x轴坐标差,就是视差 2、像素P的视差只与其领域有关 这个是基于马尔…

外汇天眼:即使与世界第一的差价合约提供商交易也会被骗!

你能想象,当你与世界第一的差价合约提供商进行交易时,也可能会被骗吗? 在投资理财多元化的今天,外汇投资理财也备受大家的关注,而与此同时,骗子的诈骗渠道也与时俱进,各类外汇投资骗局也层出不穷…

VMware Workstation 17.0 Pro SLIC Unlocker for Linux

VMware_Dell_2.6_BIOS-EFI64_Mod;macOS Unlocker,支持 macOS Ventura 请访问原文链接:VMware Workstation 17.0 Pro SLIC & Unlocker for Windows & Linux,查看最新版。原创作品,转载请保留出处。 作者主页&a…

多模式直方图的视网膜图像增强

论文题目:Retinal Image Enhancement in Multi-Mode Histogram 1 摘要 视网膜图像的评估被广泛用于帮助医生诊断许多疾病,如糖尿病或高血压。从采集过程来看,视网膜图像往往具有较低的灰度对比度和动态范围。本文提出了一种基于直方图分析的…