日志系统之定时任务执行引擎

概述

最近这段时间在强化日志系统自身的稳定性和可靠性,一个稳定可靠的系统离不开监控,我们这里谈及的监控除了服务是否存活还有这些组件的核心metrics采集与抓取,为此我们将这些任务做成了定时任务来执行。由于大致的思路以及设计已经成型,所以今天来分享一下日志系统在定时任务这块的选型与设计。

组件运行时监控

从我之前分享的文章中不难看出我们日志系统的各个组件的选型:

  • 采集agent : Flume-NG
  • 消息系统 : Kafka
  • 实时流处理 : Storm
  • 分布式搜索/日志存储(暂时) : Elasticsearch

这也是很多互联网日志解决方案的通用选型。但是,我们在调研这些组件自身提供的监控方案以及他们支持的第三方监控工具时,却得到了不一致的结果:

  • Flume-NG : 支持http/JMX metrics,支持的监控工具:Ganglia
  • Kafka : 支持jmx metrics,支持的监控工具:Yahoo!
  • Storm : 支持jmx metrics,自带Storm UI
  • Elasticsearch : 支持http形式的status请求

从上面的结果来看,自身具备的监控能力以及跟第三方的监控系统的集成能力参差不齐。这显然不符合我们的期望,我们的几个关注点:

  • 监控统一化,或者说去异构化
  • 随着系统稳定后,能够自由配置我们认为非常重要、必须care的metrics
  • 统一的可视化,我们期望能在我们自身的管控台上一目了然地看到我们希望看到的metrics

总结一下,如上的这些组件在被监控能力上虽然各有差异,不过还是有一些共同点,那就是对于:

  • JMX
  • http

这两种协议的metrics请求,各个组件都至少支持其中的一个。

其实,监控统一化这一点不难做到,我们可以选择当前主流的开源监控工具Zabbix(对于JMX的metrics获取,Zabbix自身已经提供了原生支持:Java Gateway)。但是对于个性化的监控,比如特定metrics的提取与展示,需要对Zabbix进行定制。出于各种原因,我们暂时没有采用基于Zabbix的定制方案。

JMX metrics收集

因为Zabbix 提供了JMX收集的原生支持,而且它自身又是开源软件,所以我们的JMX metrics收集是基于Zabbix Java Gateway进行定制的。

简单了解一下Zabbix Java Gateway,Zabbix是在2.0之后对JMX提供了原生支持。它的架构非常简单,如下图所示:

工作原理: 
Zabbix server想知道一台主机上的特定的JMX值时,它向Zabbix Java gateway询问,而Zabbix Java gateway使用“JMXmanagementAPI”去查询特定的应用程序,而前提是应用程序这端在开启时需要-Dcom.sun.management.jmxremote参数来开启JMX查询就行了。

Zabbix server有一个特殊的进程用来连接Javagateway叫StartJavaPollers.Java gateway是一个独立运行的java daemon程序,类似于一个proxy来解耦Zabbix和那些提供JMX metrics的component。

我们主要利用了java gateway获取JMX的代码(JMXItemChecker.java类),然后将获取到的metrics转存到我们的数据库里,以供在日志系统的管控台进行展示。因为我们没有采用整套机制,所以无关的细节就不再多谈。

http metrics收集

http metrics主要用来对ElasticSearch进行监控(因为它不支持JMX),我们使用HttpClient来发送请求,然后同样将获取到的信息存储到我们的数据库里。

定时任务框架的选型——quartz

quartz是一个开源的、功能强大的主流定时任务执行框架。我们简单提一下它的几个核心概念:

  • Job : 定义一个任务的具体处理逻辑
  • JobDetail : 封装了Quartz框架在执行一个job时需要的必要信息
  • Trigger : job执行的触发器
  • JobDataMap : 封装了Job执行过程中需要的数据

当然quartz框架还有很多其他概念,但就这篇文章而言,这里我们只谈上面这些就够了。

定时任务执行引擎的整体设计

上面谈到了我们选择的开源定时任务框架quatrz,单有一个框架还不够,我们还需要对任务进行规划、分类以及如何去管理、分发这些任务进行设计。

定时任务种类

我们暂且将定时任务分为两种:

  • 简单的离线计算:offlineCalc
  • metrics收集:metricsPoller
  • 日志系统其他的一些日常维护任务:比如日常索引的管理等

这里,对于metrics的收集是我们引入定时任务的主要需求,因此我们将以它为主线来介绍我们的定时任务执行引擎。

元数据存储与设计

基于上面介绍的quartz的几个概念,以及我们需要达到的通用化任务执行的目的,我们需要思考如何来让这个定时任务执行引擎变动更自动化,提高它的扩展性,这就牵扯到定时任务执行需要的元数据管理。

我们设计了一个层次化的组织结构,他们从上到下依次是:

  • job category
  • job type
  • job
  • job metadata
  • job trigger

category对job进行广义上的划分,比如我们上面提到的offlineCalcmetricsPoller等。在Quartz里,Job有分组(group)的概念,我们也以此作为job分组的依据。

type定义了任务的类型,它归属于categorytype不只起到组织job的作用,某种程度上它应对着一个job class,也就是某一组遵循相同处理逻辑的job的归类。比如,我们上面提到的,针对JMX 以及 http metrics的poller。

job对应于quartz中的Job,这里需要权衡好它的粒度。拿JMX metrics poller这种类型的job举例,如果只需要抓取某个component的metrics,那么一个job的粒度就可以是对一个metrics的一次获取。但如果你需要对多个component的很多metrics进行提取,那么你job的粒度就不能这么细,可能你一个job必须要负责一个component中的所有metrics的提取。这取决于你的任务量,以及合理控制一个定时任务框架中的job数。

job metadata存储job在运行时必须的元数据。上面提到job是一类相同业务逻辑的一个抽象执行单元。但他们并非完全一样,不一样的地方就区别在他们的执行时需要的元数据。jobmetadata的对应关系是一对多的关系。比如我们上面提到的JMX metrics poller,它存储了一个job需要提取的metrics的object attribute的集合。

job trigger对应于quartz中的Triggerjobtrigger的对应关系是一对一。

上面的这些数据都提供了在管控台进行配置管理的功能。

生命周期自动化管理

为了提升定时任务执行引擎的可扩展性以及自管理性。我们选择用Zookeeper来存储如上的整个job的拓扑以及元数据信息。

Zookeeper除了是很好的元数据管理工具,还是很主流的分布式协同工具。它的Event机制,使得我们对Job生命周期的自动化管理成为可能。我们通过对各个ZNode的children ZNode进行监听,来动态感知Job的变化,感知到节点的变化之后,我们就可以动态创建或者删除某个job。

总结

本篇内容我们以对日志系统的各个component的metrics的监控为切实需求,谈论了我们在主流的定时任务执行框架quartz上进行的任务设计使得它更具扩展性,同时将其跟Zookeeper结合使得任务的管理具备自动化的能力。

原文发布时间为:2016-04-23

本文作者:vinoYang

时间: 2024-08-31 20:21:53

日志系统之定时任务执行引擎的相关文章

日志系统之基于Zookeeper的分布式协同设计

最近这段时间在设计和实现日志系统,在整个日志系统系统中Zookeeper的作用非常重要--它用于协调各个分布式组件并提供必要的配置信息和元数据.这篇文章主要分享一下Zookeeper的使用场景.这里主要涉及到Zookeeper在日志系统中的使用,但其实它在我们的消息总线和搜索模块中也同样非常重要. 日志元数据 日志的类型和日志的字段这里我们统称为日志的元数据.我们构建日志系统的目的最终主要是为了:日志搜索,日志分析.这两大块我们很大程度上依赖于--ElasticSearch(关于什么是Elast

ELK统一日志系统的应用

收集和分析日志是应用开发中至关重要的一环,互联网大规模.分布式的特性决定了日志的源头越来越分散, 产生的速度越来越快,传统的手段和工具显得日益力不从心.在规模化场景下,grep.awk 无法快速发挥作用,我们需要一种高效.灵活的日志分析方式,可以给故障处理,问题定位提供更好的支持.基于全文搜索引擎 Lucene 构建的 ELKstack 平台,是目前比较流行的日志收集方解决方案. ELK系统的部署按照官方文档操作即可,相关资料也很多,这篇文章更多的关注三个组件的设计和实现,帮助大家了解这个流行的

日志系统之Flume采集加morphline解析

概述 这段时间花了部分时间在处理消息总线跟日志的对接上.这里分享一下在日志采集和日志解析中遇到的一些问题和处理方案. 日志采集-flume logstash VS flume 首先谈谈我们在日志采集器上的选型.由于我们选择采用ElasticSearch作为日志的存储与搜索引擎.而基于ELK(ElasticSearch,Logstash,Kibana)的技术栈在日志系统方向又是如此流行,所以把Logstash列入考察对象也是顺理成章,Logstash在几大主流的日志收集器里算是后起之秀,被Elas

创业公司做数据分析(四)ELK日志系统

作为系列文章的第四篇,本文将重点探讨数据采集层中的ELK日志系统.日志,指的是后台服务中产生的log信息,通常会输入到不同的文件中,比如Django服务下,一般会有nginx日志和uWSGI日志.这些日志分散地存储在不同的机器上,取决于服务的部署情况了.如果我们依次登录每台机器去查阅日志,显然非常繁琐,效率也很低,而且也没法进行统计和检索.因此,我们需要对日志进行集中化管理,将所有机器上的日志信息收集.汇总到一起.完整的日志数据具有非常重要的作用: 信息查找.通过检索日志信息,定位相应的bug,

日志系统之Flume日志收集

最近接手维护一个日志系统,它用于对应用服务器上的日志进行收集然后提供实时分析.处理并最后将日志存储到目标存储引擎.针对这三个环节,业界已经有一套组件来应对各自的需求需求,它们是flume+kafka+hdfs/hbase.我们在实时分析.存储这两个环节,选择跟业界的实践相同,但agent是团队自己写的,出于对多种数据源的扩展需求以及原来收集日志的方式存在的一些不足,于是调研了一下flume的agent.结果是flume非常契合我们的实际需求,并且拥有良好的扩展性与稳定性.于是打算采用flume的

Linux 日志系统

在Linux系统中,有三个主要的日志子系统:  连接时间日志--由多个程序执行,把纪录写入到/var/log/wtmp和/var/run/utmp,login等程序更新wtmp和utmp文件,使系统管理员能够跟踪谁在何时登录到系统. 如:查看linux下的用户登录日志,包括用户登录时所用的主机的ip more /var/log/secure who /var/log/wtmp 查看做过什么? root账户下输入su - username 切换到username下输入 history 能看到这个用

java-做一个日志系统涉及到activemq:有两套逻辑大家看看哪个比较好

问题描述 做一个日志系统涉及到activemq:有两套逻辑大家看看哪个比较好 1.有一个时间任务,每个一定时间扫描一次activemq,取得所有任务插入到数据库2.把activemq里的日志放到一个queue中,有一个时间任务,如果间隔内,queue里面的日志个数大于一个数量,然后就插入数据库,重置这个时间任务,如果这个时间内没有达到这个数量,则时间任务执行把queue里的所有日志插入到数据库 哪一个逻辑比较好一些? 解决方案 明显后者要优于前者,尽量避免无意义的循环但还不是最优,如果做到一个日

日志系统之HBase日志存储设计优化

本人博客文章如未特别注明皆为原创!如有转载请注明出处:http://blog.csdn.net/yanghua_kobe/article/details/46482319 继续谈论最近接手的日志系统,上篇关于日志收集相关的内容,这篇我们谈谈日志存储相关的话题. 简介 我们首先来总结一下日志这种数据的业务特点:它几乎没有更新的需求,一个组件或一个系统通常有一个固定的日志格式,但就多个组件或系统而言它会存在各种五花八门的自定义的tag,这些tag建立的目的通常是为了后期查询/排查线上问题的需要,因此

推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler

原文:推荐一个简单.轻量.功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler 在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自带的timer,但这个类只能完成一些简单的定时操作,比如间隔多久执行什么操作.遇到一些复杂的定时任务,如从当前时间开始,多少时间后间隔重复执行,timer类处理起来就相对困难了.经过多