APP下载

基于Flink+QLExpress处理海量数据的实时监控告警系统

2022-03-23杨大龙高中纤

信息通信技术 2022年1期
关键词:脚本海量日志

陈 丽 杨大龙 高中纤 张 伟

中国联合网络通信有限公司济南软件研究院 济南 250100

引言

随着物联网、移动互联网的发展及信息技术向各行业的深入渗透,随之而来的是海量数据的存储、计算和分析等问题,而海量数据的处理给运维监控系统的核心告警系统带来了极大的挑战。目前的海量数据监控告警系统通常采用Kafka+Flink模式,此模式不够灵活。前人对海量数据流处理的研究多集中在Flink技术上,在实际生产过程中应用Flink来处理海量日志,提升数据处理效率及能力,提高告警的及时性。但是如上传统模式的监控告警系统无法动态更新告警口径、阈值、格式及信息推送方式等,往往需要通过更新版本代码的方式实现告警口径等的增加或修改。

现有的大数据监控告警系统的实现方式可以概括为如下四类[1-3]。一是直接基于Flink实现监控告警,对于数据的获取方式采用传统方式,Flink作为实时流计算引擎对数据进行处理分析得到中间结果数据,然后与阈值进行比较,符合阈值条件的发送告警信息;二是Kafka作为消息中间件,其不同Topic的数据作为Flink的数据源,Flink负责依据预设的指标进行数据处理及过滤,并将结果写入Redis[4],Promethues从Redis拉取数据,Grafana根据数据进行图表展示;三是利用基于QLExpress规则引擎的监控告警系统,可以实现灵活预警、配置动态发布与更新,但是无法承载海量数据的实时分析及处理;四是基于Flink的实时计算平台的设计与实现,使用Flink提供的SQL语法功能实现配置的动态更新,搭建了一个可视化的实时计算平台,但未将其合理地运用到监控告警系统中。因此,前人对告警系统的研究多集中在Flink或者QLExpress上,而对Flink+QLExpress技术模式处理海量数据的研究较少,还有待深入。

本文中通过引入Flink SQL和QLExpress技术优化现有大数据监控告警系统架构,实现告警口径等的灵活配置及动态更新,解决告警无法动态配置、海量数据处理效率慢、告警实时性不足等问题。基本思路是利用Canal采集原始业务数据,通过自定义聚合程序聚合离散的业务数据推送至Kafka,Kafka的数据作为Flink的数据源,然后Flink获取数据后利用Flink SQL技术实现数据清洗及过滤得到初级告警数据,然后通过QLExpress技术实现告警数据的二次过滤及告警信息的格式化、推送等,最终完成海量数据的监控告警。同时,该告警系统提供管理控制台,方便对各类脚本的管理及历史告警信息的查询与统计分析。

1 核心技术

本文涉及的核心技术共四项,其中核心设计思路中的关键核心技术包括Canal数据采集工具、Flink技术、Flink SQL技术及QLExpress技术。为实现告警口径、阈值、信息的格式、推送方式的动态更新,海量数据的处理与分析,业务逻辑与告警处理程序的解耦,Flink技术、Flink SQL技术及QLExpress技术起到至关重要的作用,下面将分别进行详细介绍。

1.1 Canal技术

Canal是阿里开源的基于MySQL数据库增量日志解析,提供增量数据订阅和消费,类似MySQL的一个Slave,实现数据的同步与备份,进而达到数据采集的目的。其工作原理图如图1所示。

图1 Canal工作原理图

1)Canal模拟MySQL Slave的交互协议,将自己装扮为一个MySQL Slave,并将dump协议转发至MySQL Master。

2)MySQL Master接收到Slave的转出请求后,开始将二进制日志推送给Slave,即Canal。

3)Canal解析二进制日志为自己支持的数据类型,后续可通过加工处理后作为不同的对象的源数据,如MySQL、Kafka、Elasticsearch、Hbase等。

Canal适用的场景如下:1)数据同步,如实现在线、离线数据库之间的数据同步。2)数据消费,如对所关注的数据库表产生的变化,实现数据增量搜索。3)数据脱敏,如将线上动态数据导入到其他存储结构,实现数据的脱敏。

Canal具有HA机制,是Canal实现高可用的关键技术,本文使用了Canal的这一优良特性,实现Canal与数据源之间1对多的配置关系。

1.2 Kafka技术

Apache Kafka最初是由LinkedIn研发的一个分布式的发布—订阅消息系统[5-6],为处理实时数据提供一个统一、高通量、低等待的平台。Kafka是一个分布式系统,由通过高性能TCP网络协议进行通信的服务器和客户端组成,可部署在内部以及云环境中的裸机硬件、虚拟机和容器上。Kafka集群可以在一个指定的时间内保存所有发布上来的消息,当超过指定的时间后消息就会被系统丢弃以释放空间。Kafka的性能不会受数据量大小的影响,因此可以保存大量的数据。

1.3 Flink及Flink SQL技术

Flink是一个针对流数据和批数据的分布式处理引擎[7-10],所要处理的场景主要是流数据,会把所有任务当做流来处理。因此,Flink可以提供数据处理的通用方案,使得由相同或相关的组件和API搭建框架的处理需求得以简化。同时,Flink可以支持本地快速迭代,可以定制化内存管理。所以,Flink的特点是处理大数据速度快,能满足大数据背景下应用实时计算平台的需求。

Flink是一个真正的流式处理,其可以按照元组逐个分发数据,做到对数据的单条处理,而不需要再流处理汇总执行计算。其支持大规模计算能力,能够在数千个节点上并发运行,具有强大的吞吐量和延迟特性,提供了数据分布、数据通信以及容错机制等功能。同时,Flink提供多种灵活的窗口函数及更高抽象层的API,使开发者可以更便捷地编写分布式任务。

Flink SQL是面向用户的API层[11],是降低用户使用实时计算门槛而设计的一套符合标准SQL语义的开发语言,开发者可以直接在代码中书写SQL实现一些查询操作。Flink的SQL支持基本查询语法,常见的算子包括SELECT、WHERE、DISTINCT、GROUP BY、UNION、UNION ALL、JOIN等。同时,Flink SQL提供大量的内置函数,常见的内置函数包括比较函数、逻辑函数、算术函数、字符串处理函数、时间函数,也支持使用者自定义函数实现其他计算。Flink实现了SQL标准的Apache Calcite(Apache开源 SQL解析工具),语法易读易书写,开发者只需关注业务逻辑。而且Flink内置很多优化规则,简化了研发的复杂度,通过SQL能在高层应用上实现真正的批流一体。

1.4 QLExpress技术

QLExpress是一个开源的类Java语法的规则引擎[12-13],作为一个嵌入式规则引擎在应用程序中使用。该规则引擎是一种动态脚本解析引擎,用Java语言来编写脚本,支持自定义运算符、自定义函数、宏定义、拓展操作等,可以简化业务规则,从而使得规则的定义变的灵活。其实现原理主要包括定义规则、解析规则、执行规则三个步骤,编译过程是一个实现了完整的词法分析、语法分析、语义分析、编译指令、指令执行的过程,类似Java语言中Class文件的编译过程。

QLExpress规则引擎被应用在各类场景中,其特性如下。1)线程安全:在引擎运算过程中产生的所有临时变量都是ThreadLocal类型;2)执行效率高:将耗时长的脚本编译过程缓存在本地,运行时临时变量的创建使用缓冲池技术实现,其性能与Groovy性能相当;3)弱类型脚本语言:同JavaScript及Groovy的语法类似,其运行速率慢于强类型脚本语言,但其大大增强了业务实现及配置的灵活度;4)安全控制:通过相关运行参数的配置防止死循环及恶意调用等异常情况的发生。

2 系统设计

目前,大数据监控告警系统采用的方案通常为下述三种方案:方案一是采用Filebeat+Kafka+Flink+告警的架构,无法实现告警口径的动态更新及与业务代码逻辑的解耦;方案二是采用Filebeat+Kafka+Storm[14]+QLExpress+告警的架构,Storm流式处理采用ACK机制,对每个消息进行全链路跟踪,失败或超时进行重发,每次需要一个ACK机制,无法实现真正的流处理,相比Flink存在一定的劣势;方案三是Filebeat+Kafka+Flink+QLExpress+告警的架构,该架构几近完美,其中Filebeat是一种容器日志采集利器,读取的对象是日志文件,对于MySQL的二进制文件无法读取,不适用于对源数据存储于MySQL的系统。

本文提出的基于Canal+Kafka+Flink+Flink SQL+QLExpress+Redis+告警的处理海量数据的监控告警系统由数据采集模块、数据聚合模块、数据处理模块、告警推送模块、数据存储模块、管理控制台模块六部分组成。数据采集模块是通过日志采集工具将日志库中存储的业务告警原始数据采集至聚合程序中;数据聚合模块是获取来自数据采集模块已采集的业务数据,通过业务逻辑代码程序将业务数据依据具体需求进行拼接封装;数据处理模块是该监控告警系统的核心,先进行数据获取,再通过脚本进行数据清洗及数据过滤,依据阈值条件得到初级告警数据;告警推送模块是通过脚本将初级告警数据依据不同阈值进行二次数据过滤,依据告警信息模板生成可读的告警信息,然后通过调用不同应用系统的API将告警信息推送至不同的应用系统(如钉钉、微信、电话等);数据存储模块是将已推送的告警信息进行存储,用于后续告警数据统计与分析;管理控制台模块负责管理此监控告警系统中数据处理模块及告警推送模块中使用的脚本,以此完成整个告警流程。本监控告警系统的技术架构如图2所示。

图2 基于Fink+QLExpress处理海量数据的告警系统技术架构图

2.1 数据采集

数据采集模块包括数据源及采集工具。数据源一般是MySQL数据库,存储的是通过平台产生的实时交易数据,如能力的基本信息(能力名称、版本号、交易接收时间、交易处理结束时间等)、交易响应码(平台返回码、业务返回码等)、主子服务的关联关系字段等。Canal采用高可用模式,即一个Canal实例采集多个日志库数据,实现源数据的采集。

2.2 数据聚合

数据聚合模块包括聚合程序及消息中间件。聚合程序用于将Canal采集得到的数据进行主子服务的聚合、所需字段的获取及整理,然后将聚合结果推送至Kafka的某个Topic。

2.3 数据处理

数据处理模块包括数据获取、数据清洗及过滤。首先进行数据获取,Flink将Kafka作为数据源,读取Topic的数据,将Kafka的Json格式的数据注册为一个实体并存入自定义表中;然后进行数据清洗及过滤,从Redis中读取已存入的Flink SQL脚本,通过该SQL脚本进行一次过滤,得到1分钟粒度的告警数据,即初级告警数据,然后从Redis中读取已存入的QLExpress脚本,通过QLExpress脚本对初级告警数据进行二次过滤。如上两个脚本是程序首次启动后会从数据存储模块获取,同时写入Redis中,后续只需从Redis中获取即可。

2.4 告警推送

告警推送模块包括告警信息格式化及告警推送。采用QLExpress技术进行告警信息格式化及实现告警推送,该技术支持Java语法,简单易学,告警配置人员能够快速配置告警脚本。QLExpress脚本中先对告警数据进行格式转换,转为用户能够清晰可见的文字描述,然后调用微信API、钉钉API进行数据推送,运维人员只需关注对应的钉钉群或者微信群获取告警信息,如图3所示。同时,该告警系统支持告警外呼功能,即通过电话方式将告警信息通知到当日值班人员,同时外呼告警历史可查询。

图3 告警信息截图

2.5 数据存储

数据存储模块中存储了两类信息,一是已推送的告警信息,用于历史告警数据的查询,是管理控制台模块中告警日志管理页面所展示数据的来源;二是FLink SQL脚本及QLExpress脚本。

2.6 管理控制台

管理控制台模块包含大数据告警SQL管理(脚本管理)及告警日志管理,前者管理数据处理模块中使用FLink SQL数据清洗、过滤脚本及QLExpress告警推送脚本,后者用于告警历史数据的查看。

3 应用效果

基于此新架构的监控告警系统已应用在中国联通天擎项目中,实现对海量能力交易数据的实时分析及处理,完成能力异常调用的实时监控告警,极大提升了告警及时性,增强了告警配置的灵活性,目前已取得了显著的成效,主要体现在以下几个方面:1)每分钟处理的数量达到261万+条;2)可实现秒级告警;3)告警准确率达到100%;4)处理的应用系统量达2000+个;5)节省运维成本达到120人/年,由8人年降低至2人年;6)告警配置速率提升24倍,由2天降低至2小时。

4 结语

本文提出的基于Flink+QLExpress的处理海量数据的告警系统,创造性地将Flink SQL及QLExpress、Redis技术同时引入监控告警系统,解决了告警口径的变更与代码实现逻辑是紧耦合、告警无法灵活配置、配置无法动态更新等问题。Flink技术实现亿级数据的实时处理,Flink SQL实现了告警口径的变更与代码实现逻辑的解耦,QLExpress的引入实现了告警信息的样式及告警推送方式的灵活配置,两者结合Redis技术实现配置的动态更新。两类脚本的书写方式简单、易读,节省了研发成本,提升了研发效率。同时,本监控告警系统的多租户模式将不同系统的告警信息进行数据隔离,实现数据的安全性及隔离性,满足不同告警需求。

实践表明,本文提出的基于全新架构的监控告警系统实现了对亿级业务数据的实时采集及分析处理,实现告警口径、告警阈值、告警格式及推送方式的动态发布与更新,并通过可视化脚本实现数据过滤及告警信息推送功能的编写,提升了告警研发速率。此监控告警系统是天擎能力开放平台正在使用的智能监控告警系统,增强了平台的预警能力,提升了告警及时性,保证了天擎能力开放平台的稳定高效运行,应用效果显著。

猜你喜欢

脚本海量日志
一种傅里叶域海量数据高速谱聚类方法
海量GNSS数据产品的一站式快速获取方法
一名老党员的工作日志
读扶贫日志
海量快递垃圾正在“围城”——“绿色快递”势在必行
雅皮的心情日志
雅皮的心情日志
自动推送与网站匹配的脚本
一个图形所蕴含的“海量”巧题
举一反三新编