基于ELK的运维辅助系统的设计与实现
作者:李书达 刘遵仁 朱琦
来源:《青岛大学学报(工程技术版)》2022年第01期
        文章编号: 10069798(2022)01001806; DOI: 10.13306/j.10069798.2022.01.003
        摘要: 针对分布式集在服务出现异常情况下存在的无法快速定位到异常所在服务器,并获取报错详情的问题,本文采用技术栈(elasticsearch,ELK)捕获异常,并解析日志内容来展示详情,以实现快速定位,最终以邮件形式告知运维人员进行处理。测试结果表明,部署在A公司多台服务器上的集出现异常后,本系统最快可在2 s内监控到异常,5 s内完成对运维人员的邮件通知,邮件内容包括问题发生时详细信息,方便运维人员快速定位问题。本系统大大缩短了运维人员处理故障时间,提升了运维效率,降低了公司损失,可以辅助运维人员实现对多服务器集的监控,做到对异常集的快速定位。该研究对企业分布式集节点的异常定位具有重要意义。
        关键词: ELK; 辅助运维; 大数据; 日志
        中图分类号: TP311.13文献标识码: A
        随着互联网飞速发展,高速网络不但增加了用户体验,也增加了企业服务器负载压力,在此情况下,分布式集成为企业服务器应对大数据高并发场景的主流解决方案[1]。分布式集保证机器宕机时仍有其余机器可对外提供访问,但如果代码层面出现异常,不能被及时发现并修正,也会造成严重损失,因此深入
代码层面的监控对企业意义重大。日志记录了各自服务器运行时的核心信息,这对定位问题具有重要作用,所以利用好服务器日志成为关键点。近年来,为方便管理大型集,一些团队设计了集监控系统,但与日志相关的功能并不丰富。Zabbix是一个常用的集监控系统,其实现了多条报警及自带画图功能,当集出现异常时,可以执行对应的紧急预案脚本自动修复[2];Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库,其通过超文本传输协议(hypertext transfer protocol,HTTP),周期性抓取被监控组件的状态,组件只需提供对应的HTTP接口就可接入监控,不需要任何软件开发工具包或者其他集成过程[3]。上述系统主要针对服务器硬件指标(如磁盘I/O率),对日志的采集和分析功能不完善。因此,本研究通过对传统数据处理技术和当前流行的大数据日志分析技术进行融合[4],设计并实现一个基于ELK的海量日志分析系统,将其应用于服务器集运维方面,解决无法及时发现集异常的问题。该研究对企业分布式集节点的异常定位提供了理论依据,具有一定的创新性。
        1技术基础
        本系统所使用技术基础包括Filebeat、kafka、Logstash、ELK。Filebeat是大数据常用数据采集组件,因其体积轻,占用生产机器极少资源而被广泛用于文本采集输入端[5]。在本辅助运维系统设计中,Filebeat专门针对各个服务器日志进行捕获,输出至kafka;kafka是一个高吞吐量发布订阅模式消息队列,类似组件还
有RabbitMQ和RocketMQ等,由于kafka对Hadoop的大数据生态支持较好[6],因此本辅助运维系统采用kafka作为汇集各个服务器日志数据的队列。kafka内部结构如图1所示。
        Logstash作为数据处理引擎,在本系统中负责实时拉取kafka中原始日志数据[7],将解析完的数据输出到ELK中,以作为最终持久化存储及检索。ELK是目前最受欢迎的企业搜索引擎之一,同级别搜索引擎还有Solr,由于在持续性动态插入数据时,Slor的查询效率较ELK会明显降低,因此本系统采用的检索引擎为ELK,作为最终的数据存储和检索[8]。ELK数据存储形式如图2所示。
        2系统设计
        2.1节点规划与组件版本
        本辅助运维系统的安装部署以及最终测试效果基于如下环境,FileBeat作为日志采集输入层,kafka、Zookeeper、Logstash作为中间队列及数据处理层,ELK作为数仓层。表1中所列服务是必须的,但节点数量可以大于此表所列数量,节点规划如表1所示。不同组件的其他版本会有不兼容的情况,本系统所使用的组件版本号参照组件版本表,组件版本如表2所示。
        2.2架构设计
        本系统为集环境设计,基于节点规划表所列的节点,设计系统架构图,系统架构图如图3所示。公司生产系统部署在Producer01,02,03上,3台服务器形成小型集,服务器实时产生的log日志中,包括info、Warn、Error类型日志数据[9]。系统原始数据采集输入端——Filebeat监控指定日志文件,并将捕获到的日志数据发往kafka。Filebeat是轻量级,可以在每台服务器上安装部署,不会影响机器性能,当服务器过多时,可通过脚本或者Xshell工具,实现“一次操作所有部署”,缩短工作量[10]。系统中间数据缓存解析端——kafka,实时接收Filebeat发来的数据,并进行缓存存储。在辅助系统开发中,kafka应当独立于生产系统的集,因为外界组件不应该与生产系统竞争CPU和内存资源,否则影响生产系统的性能,辅助系统就丧失了辅助的意义[11]。
        本系统选择将Zookeeper和kafka安装在同一集,Zookeeper只起到kafka注册中心作用,功能单一。而与kafka同一集,方便kafka与Zookeeper之间数据交互[12]。由于kafka消耗服务器的磁盘I/O性能和内存资源,CPU和部分内存还未被充分利用,可以将Logstash与kafka安装在一个集。Logstash解析kafka中每条日志数据,并插入ELK,需要消耗服务器CPU性能,与kafka搭配使用,可将集资源利用率达到最大[13]。另外,此部署方式避免了跨集网络传输,Logstash可以更快速的读取本地kafka数据,大大减少网络延迟,增加处理效率。系统的存储及检索端——ELK,负责存储Logstash解析后的数据,并在用户(运维人员)请求时返回查询到的数据。由于数据量较大,上百万量级数据的检索对Mysql具有挑戰性[14],因此
系统最终选择ELK作为最终存储端。
        2.3功能实现
        1)采集输入端。Filebeat默认一行一行读取文件,在开发过程中,考虑Error报错不止一行,而是由多行信息一起组成一个Error块。当分析日式数据格式后,使用Filebeat的multiline.pattern自动识别日志格式。日志格式样例图如图4所示。
        multiline.pattern是Filebeat自身功能,需要配置正则表达式来匹配捕获到的每一行日志信息[15],如果捕获的日志数据起始为“yyyyMMdd”格式,会立即判断接下来一行日志数据是否为“yyyyMMdd”格式。如下一条也符合,则将本行单独作为一行日志进行输出,如果不是,则认为已经进入到Error块中,直到某一行捕获到“yyyyMMdd”格式为止,将期间所有数据均作为Error一整块进行输出。本系统Filebeat使用multiline.pattern,multiline.pattern: ′^[09][09]′,ate: true,multiline.match: after。
        2)緩存及解析端。因为本系统设计部署3台kafka,所以在创建kafka主题——topic时,应该充分利用集资源需要指定topic分区数为集节点同等数量。当Logstash读取kafka数据时,会从topic设置的各个分区节点同时读取,可以大大增加并行度,提高处理效率,防止kafka数据积压[16]。
        Logstash的数据解析同样依靠grok正则匹配功能[17],在grok中定义正则表达式后,当Logstash读取kafka数据会依次剪切形成各个字段,并存储到ELK中。Logstash的grok正则匹配规则设置如下:
        3)存储及索引端。ELK相当于整个系统的数据库,在本系统中设置了如下几个重要字段,logHost、logLevel、logMessage、logServer和logTime。
        logHost是日志来源节点名称,通过该关键字判断异常发生在生产集的哪一台机器。logLevel是异常等级,一般包括Info、Warn、Error。其中,Warn、Error级别会在辅助运维系统UI界面展示,Error级别日志则会立即以邮件形式通知所有运维人员。logMessage是异常信息,是日志文件的基本内容,通过邮件[18]展示给运维人员。logServer是日志所属服务,微服务的每一个模块都有自己的名称,比如用户登录服务、浏览商品服务、订单服务等,通过该字段,更精确定位异常发生位置,能够第一时间评估对公司造出的影响。logTime是每一条日志产生时间。
        4)推荐方案。当Error日志产生时,需要尽可能降低运维人员工作量,本系统设计了推荐方案功能,运维人员每次解决方案都会记录在系统中,当新的一条Error产生,会通过ELK与历史记录对比,当相似度超过95%时,将该历史解决记录推荐给运维人员[19]。
        2.4前后端页面展示
        本系统前端WEB UI界面采用VUE+Element框架,后端使用SpringBoot框架[20]实现前后端分离。后端主要负责通过RestLowLevel Client API与ELK集做系统查询交互,并将ELK返回的数据处理封装后,返回给前端渲染到页面上展示。前端VUE+Element框架帮助快速搭建一个前端页面,供实时展示。
        3最终结果
        各组件及前后端服务正常启动后,开始监控生产系统集,服务器出现异常,可迅速收到运维监控系统发出的邮件告警,邮件告警如图5所示。
        运维人员在Web端查看异常数据,页面查看日志信息如图6所示。由图6可以看出,通过邮件内的信息或Web端信息,运维人员可快速定位到问题服务器,并进行处理。
        4结束语
        本文主要对基于ELK的运维辅助系统进行设计。基于ELK集,并结合大数据技术,深入到代码层面进行分析,同时依据企业需求定制处理逻辑。测试结果表明,本文设计的ELK运维辅助系统,监控异常最快可达2 s,5 s内完成对运维人员的邮件通知,与其他集监控系统相比,反应迅速,数据处理效率较高,对日志数据解析灵活,减轻了运维工作量。与现有监控系统相比,使用灵活,且分析效率高,具有一定的创新性。
下一步将考虑系统末端增加推荐算法功能,推荐合适的处理方案给运维人员,可减少运维人员独立判断时间,增加排查问题准确度。
正则匹配到第一个关键字就停止
        参考文献:
        [1]李宁, 张轶昀. 一种分布式微服务架构系统缓存解决方案[J]. 电脑知识与技术, 2020, 16(36): 7374.
        [2]王宝云, 卢兴来, 黄晓龙, 等. 基于ZABBIX的新一代天气雷达ROSE系统监控平台[J]. 气象科技, 2021, 49(5): 730737.
        [3]王召选. 基于Prometheus的GPU服务器运维监控系统[J]. 信息与电脑(理论版), 2021, 33(9): 131133.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。