Flink 替换 Logstash 解决日志收集丢失问题

在某客户日志数据迁移到火山引擎使用 ELK 生态的案例中,由于客户反馈之前 Logstash 经常发生数据丢失和收集性能较差的使用痛点,我们尝试使用 Flink 替代了传统的 Logstash 来作为日志数据解析、转换以及写入 ElasticSearch 的组件,得到了该客户的认可,并且已经成功协助用户迁移到火山。目前,Flink 已经支持该业务高峰期 1000+k/s 的数据写入。

本文主要介绍 Logstash 的使用痛点以及迁移到 Flink 的优势,探索在 ELK 生态中,Flink 替换 Logstash 的更多可能,推动用户从 EL(Logstash)K 迁移到 EF(Flink)K。

Logstash 简介

ELK 是一套开源的日志及数据监控和分析系统,主要是三个组件的简称:Elasticsearch, Logstash and Kibana,功能涵盖了从日志收集、解析、查询、分析、可视化等完整的解决方案。

上图描述了 ELK 里各组件的关系,基于 libbeat 框架的各种 beats 工具将日志及各种数据进行收集,可以直接写入 ES,也可以先写入到 Logstash 进行解析和处理再写入到 ES。如下图所示,Logstash 主要包括三个部分:

  • 输入插件:负责从各种不同的 source 读取数据,如文件、beats、Kafka等;

  • 过滤插件:负责按照指定的配置修改和处理数据,如 grok 插件可以从固定日志格式中提取对应信息,drop 插件可以丢失诸如 debug 日志等能力;

  • 输出插件:负责将结果数据输出,如将处理后的日志数据写入 ES 中。

Logstash 使用痛点

数据易丢失

Logstash 默认使用内存作为写入数据的缓存,一旦发生重启或者异常退出的时候,这部分数据就会发生丢失。虽然 Logstash 也提供了持久化队列来解决这个问题,但是由于数据仍然是写入机器磁盘中,当发生单机故障的时候,数据同样也会丢失。同时,数据周期性的落盘也会对数据的处理性能带来巨大的影响。

排查成本高

当日志数据格式不符合规范(如非标准 Json)造成丢失数据较多的情况时,需要在数据收集、数据解析、写 ES 等全链路排查数据丢失的原因,一般需要查看机器日志,收集、处理节点较多的时候,排查成本也比较高。

除了日志数据本身不规范外,当由于其他原因导致数据不能正确处理的其他情况,比如写 ES 各种异常,这部分数据也极易发生丢失,也需要查看日志进行跟踪和定位。虽然 Logstash 单独提供了死信队列来处理这些情况,但是在这个链路丢失的数据仍然有排查的成本。

收集、解析性能差

Logstash 提供的各种插件基本都是用 Ruby 实现的,虽然 Logstash 本身也运行在 Java 的 JVM 上,并通过 JRuby 将各种插件也跑在 JVM 上,但是相比 Flink 100% Java 语言运行和执行效率会更低一些。

当开启持久化队列(为了保证数据尽可能少丢失),由于数据需要频繁写磁盘,Logstash 处理性能会进一步降低。同时,Logstash 处理性能较差也是业界的一大共识。

不支持资源动态扩缩容

由于 Logstash 本身的资源部署不支持动态扩缩容,会造成低峰期较大的资源浪费。在该客户的案例中,业务高峰期的日志数据和活动期间的日志数据是在低峰期数据的 24 倍左右(高峰期 100w+ QPS,低峰期 50k QPS),且呈周期性变化。因此实际在业务低峰期,使用很少的资源就能够保证日志数据的收集和解析,所以支持资源动态扩缩容是必须且必要的。

Flink 使用优势

数据处理支持“at-least-once”语义

Flink 基于状态引入分布式 checkpoint 机制,用于保证数据消费的“at-least-once”语义。其中状态保存通过定期持久化到远端可靠存储(HDFS)来保证状态不丢失。

需要说明的是,Flink 本身基于状态是能够做到严格意义上的“exactly-once”语义的,即消费和处理的不丢不重。如果 ES 支持了主键的配置,也就是相同主键写入是幂等的情况下,则能在全链路做到“exactly-once”语义。

在该客户的案例中,我们通过工具读 Kafka 来统计写入条数,跟实际 Flink 写入 ES 的条数进行对比,证明了数据消费的“at-least-once”语义,解决了客户在友商上使用 Logstash 经常发生数据丢失的痛点。

灵活的异常数据处理

对于 Kafka 中解析失败的数据(比如格式为非 Json 的数据),在该客户的案例中,我们支持了这部分的异常数据写入独立的 ES 索引,同时标识数据写入原因(非标准 Json);对于写 ES 异常失败的数据,我们同样会将这部分数据写入独立的 ES 索引,并且记录写 ES 失败的原因,比如字段数超 1000,数据类型和模板定义的不一致等。

可以方便用户对异常日志数据做治理,如该客户推所有的上游业务日志标准 Json 化写入 Kafka 等。相对的,在该客户使用原友商的 Lostash 写入 ES 的时候,这部分的数据丢失不仅不易排查(甚至不易知晓),而且也难以治理(丢失了写 ES 失败的原因)。

高吞吐、低延迟的处理性能

Flink 作为当前最热的流式处理引擎,支持高吞吐、低延迟的处理日志数据,对数据处理能够达到秒级的延迟且经过业内在其他 Kafka 数据更复杂处理场景的大量验证,稳定而可靠。

资源自动扩缩容

在字节 Serverless Flink 中,我们也将支持资源随着写入 QPS 的动态调整,能够节省较大的资源。目前,该功能已经在字节内部得到了实际验证,在资源利用上取得了较大的收益。

更复杂的数据分析能力

相较于传统的 ELK 链路,在 Logstash 中对日志数据进行简单的数据格式匹配、内容替换等处理,Flink 还支持更强大的数据分析和处理,支持事件和业务处理时间,支持窗口计算、聚合、去重等。能对日志数据做更强大的数据处理和分析,将处理数据写入 ES 后,能实现 OLAP 数据查询和分析。

这部分数据处理和分析的能力也在字节内部得到了广泛的应用,为业务带来了很多实际的收益。

Flink vs Logstash 总结

对 Logstash 进行简单介绍后,结合该客户的案例,这里对比下 Flink 和 Logstash 的优劣:

Logstash

Flink

实际用户案例

数据一致性

数据消费和写入均可能发生数据丢失,且开启持久化队列后对性能影响较大

基于状态提供严格意义上的“at-least-once”语义

  • 友商 Logstash 写入 ES 发现数据丢失

  • 火山 Flink 经过和原始 Kafka 消息对比验证数据不丢失

异常数据处理

需要单独配置死信队列和对应的处理私信队列的逻辑,且处理失败原因不易追踪

提供数据解析失败和写 ES 失败数据单独往独立索引写入的能力,且同时记录处理失败原因,方便上游对日志进行治理

  • 友商 Logstash Json 解析失败的数据丢失(没有单独配置死信队列)

  • 火山 Flink 异常数据单独写 ES 的 error index,可用于用户日志数据的治理(日志中台推日志数据 Json 化)

处理性能

Ruby 语言本身执行效率低,且开启持久化队列后性能下降明显

纯 Java 执行语言,在大数据处理场景得到了广泛的验证,具有高吞吐、低延迟的特点

  • 友商 Logstash 200 topic 使用资源 320 cu,数据存在丢失现象(未开启持久化队列),也大部分 topic 在高峰期均有延迟

  • 火山 Flink 200 topic 使用资源 390 cu,收集数据无丢失,且高峰期没有延迟

弹性扩缩容

(未来)提供自动弹性扩缩容机制,在业务低峰期节省资源和成本

  • 该客户业务在一天之内有几小时左右日志数据高峰期,其他时间均为低峰期日志特点,弹性扩缩容能节省资源,被客户看重

复杂数据分析

不支持,官方插件仅支持基本日志字段处理

提供基于处理时间和事件时间,窗口计算等强大的处理语义和逻辑

暂未使用

【火山引擎流式计算 Flink版】

火山引擎流式计算 Flink版是脱胎于字节跳动最佳实践的新一代全托管、云原生实时计算平台。一套代码轻松搞定流批一体,助力企业将大数据平台向云原生、实时化、智能化方向升级。

目前,流式计算 Flink版 新人首购专享活动正在进行中。注册用户首次购买 Flink 产品包年包月,即可享受首月4折优惠,欢迎咨询体验。

「了解更多产品信息」


参考资料

  1. ELK Introduction — Log Consolidation with ELK Stack 1.2 documentation

  2. Filebeat overview | Filebeat Reference [8.10] | Elastic

  3. How Logstash Works | Logstash Reference [8.10] | Elastic

  4. Persistent queues (PQ) | Logstash Reference [8.10] | Elastic

  5. http://thomaslau.xyz/2019/08/14/2019-08-14-on_logstash_quiz1/

  6. Mid-uh 对比(图表)

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

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

相关文章

实现一个计算机

图片&#xff1a; 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>body {padding: 20px;font-family: Arial;}.calc-wrap {width: 300px;bor…

VL06O报表添加增强字段

业务描述 用户需要在VL06O事务代码下进行批量交货过账&#xff0c;现有的筛选条件不太适用当前公司的业务&#xff0c;需要在报表中新增三个交货单增强字段&#xff0c;方便其筛选&#xff08;选择屏幕没有加&#xff0c;用户在报表里用标准按钮功能自己筛选&#xff09; 效果…

十一 动手学深度学习v2计算机视觉 ——微调

一、网络架构 一个神经网络一般可以分成两块 特征抽取&#xff0c;将原始像素变成容易线性分割的特征。线性分类器来做分类。 二、训练 是一个目标数据集上的正常训练任务&#xff0c; 但使用更强的正则化 使用更小的学习率使用更少的数据迭代 源数据集远远复杂于目标数据集…

蓝桥杯算法双周赛心得——迷宫逃脱(dp)

大家好&#xff0c;我是晴天学长&#xff0c;dp版的来啦&#xff0c;可以是受益匪浅啊&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .迷宫逃脱 迷官逃脱[算法赛] 问题描述 在数学王国中&#xff0c;存…

便携式心电图机方案_基于MT6735平台的手持心电图机

便携式心电图机具备体积小、易携带、兼容12导模式的特点&#xff0c;通过工频滤波、基线滤波和肌电滤波等处理&#xff0c;能够获得更精准的心电图谱。该设备可以与医院信息系统(HIS)相连接&#xff0c;实现患者信息的共享。采集的心电数据可以通过无线方式发送到心电判读平台&…

企业建数仓的第一步是选择一个好用的ETL工具

当企业决定建立数据仓库&#xff08;Data Warehouse&#xff09;&#xff0c;第一步就是选择一款优秀的ETL&#xff08;Extract, Transform, Load&#xff09;工具。数据仓库是企业数据管理的核心&#xff0c;它存储、整合并管理各种数据&#xff0c;为商业决策和数据分析提供支…

PC8250(CC-CV控制)5V/8A同步降压恒流恒压软启动带EN功能只需极少外围元件

概述 PC8250是一个同步降压转换器输出电流至8A。它的设计允许操作电源电压范围从9V到42V。外部关闭功能可以通过逻辑电平来控制COMP/EN引脚下降&#xff0c;然后进入待机模式。外部补偿使反馈控制具有良好的线路和负载调节&#xff0c;外部设计灵活。PC8250在CC&#xff08;恒定…

【读懂AUTOSAR规范】PduR 缓存分配(Buffer allocation)

1. 前言 PDU路由器模块支持将I-PDU从一个源总线网关到一个或多个目标总线。与从/到本地模块的传输和接收不同,PDU路由器模块必须同时充当接收器和发射器,并且在某些情况下还提供I-PDU的缓冲。网关需求被有意地分离,以便在不需要网关的情况下高效实现PDU路由器模块。如果PDU…

华三无线控制器WX2540H配合准入做Portal认证

数据通信 - 建设篇 - 无线 第四章 华三无线控制器WX2540H配合准入做Portal认证 数据通信 - 建设篇 - 无线系列文章回顾华三无线控制器WX2540H配合准入做Portal认证前言其他配置优化参考来源系列文章回顾 第一章 华三无线控制器配置本地转发 第二章 华三无线控制器配置802.1X认…

Redis-Day1基础篇(初识Redis, Redis常见命令, Redis的Java客户端)

Redis-Day1基础篇 初识Redis认识NoSQL认识Redis安装Redis启动RedisRedis客户端 Redis命令数据结构介绍通用命令操作命令StringHashListSetSortedSet Redis的Java客户端客户端对比Jedis客户端Jedis快速入门Jedis连接池 SpringDataRedis客户端SpringDataRedis概述SpringDataRedis…

boardmix AI思维导图,一键自动生成思维导图!

在日常学习和工作中&#xff0c;我们常常需要记忆和整理大量的知识点和思维结构。 此时&#xff0c;思维导图的存在就大大方便了我们的工作。与传统的文本笔记不同&#xff0c;思维导图可以结合文字、图像、颜色等多种元素&#xff0c;帮助我们更好地整理和分析知识的关系&…

centos7上用docker部署redis

1. 下载redis镜像 docker pull redis docker images # 查看镜像是否下载成功2. 安装redis容器 2.1 先准备好配置文件redis.conf vi /data/redis/redis.conf写入配置信息&#xff0c;appendonly yes&#xff0c;如果需要给redis配置密码&#xff0c;可以写入requirepass root…

如何选择更快更稳定的存储服务器

如何选择更快更稳定的存储服务器 存储介质&#xff1a;存储服务器的主要存储介质包括固态硬盘&#xff08;SSD&#xff09;和机械硬盘&#xff08;HDD&#xff09;。相比于机械硬盘&#xff0c;固态硬盘具有更高的读写速度和更低的延迟&#xff0c;因此能够提供更快的数据传输…

python安装的记录

python setup.py install --user

(附程序)AD采集中的10种经典软件滤波程序优缺点分析

前言 本次我们学习一下AD采集的一些简单的软件滤波算法并分析优缺点 本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 AD采样点的电压多少有点起伏波动&#xff0c;经运放放大后电压的波动如果超过ADC的分辩率&#xff0c;则显示的值会出现波动。波动如…

RTOS的任务触发底层逻辑

&#xff08;定时器用于计时和触发事件&#xff0c;任务则由调度器进行调度和执行&#xff1a;每当时钟节拍到达时&#xff0c;系统会触发一个称为 tick 中断的事件。当 tick 中断发生时&#xff0c;操作系统会在中断服务例程中执行一定的处理&#xff0c;其中包括更新任务的运…

C++算法入门练习——相同的二叉查找树

将第一组n​个互不相同的正整数先后插入到一棵空的二叉查找树中&#xff0c;得到二叉查找树T1​&#xff1b;再将第二组n个互不相同的正整数先后插入到一棵空的二叉查找树中&#xff0c;得到二叉查找树T2​。判断T1​和T2​​是否是同一棵二叉查找树。 二叉查找(搜索)树定义&am…

Halcon学习笔记

目录 一.简介 一.简介 Halcon和OpenCV在工业应用中的区别&#xff1a; OpenCV的精度没Halcon高&#xff1b;OpenCV没有模板匹配&#xff0c;Halcon有&#xff0c;而且Halcon匹配的精度更高。

DALSA.SaperaLT.SapClassBasic无法加载,试图加载格式不正确的程序,c#

情景&#xff1a;用c#wpf写DALSA线扫相机的项目&#xff0c;生成时不报错&#xff0c;运行到DALSA相关的代码就报错找不到dll&#xff08;DALSA的技术支持没给到任何支持 &#xff09; 一.根据框架选择dll 如果是.net framework框架&#xff08;比如说.net480&#xff09;&am…

一份全面「梳理LLM幻觉问题」的综述

文章目录 一文全面梳理「LLM 幻觉问题」1. 幻觉的分类2. 幻觉的来源2.1 幻觉来自数据2.2 幻觉来自训练2.3 幻觉来自生成/推理 3. 幻觉的检测3.1 事实性幻觉的检测3.2 忠实性幻觉的检测 4. 幻觉的评估5. 幻觉的解决 一文全面梳理「LLM 幻觉问题」 相信大家在使用ChatGPT或者其他…