效率篇-定时任务管理系统,替代crontab

本文介绍了一种针对大规模机器群的定时任务管理系统的设计与实现,旨在解决crontab在复杂场景下存在的诸多问题,如任务配置混乱、管理不便等。系统具备任务自助配置、远程执行、异常告警等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux的运维者,逃脱不了定时任务的命题,最常用和快捷简单的是crontab,在少量机器的情况下,crontab效率还是比较高和比较便捷。但当机器越多、应用越多的情况下,继续使用crontab进行定时任务的管理配置,那严重影响工作效率。

机器多、服务多的情况下,就会遇到以下问题:
1.不知道哪个定时任务没配置好,瞎跑;
2.运维人员需要登录服务进行配置和管理;
3.运维人员需要全场参与到定时任务的生命周期;
4.定时任务运行异常告警难以统一对接;
5. 任务A和任务B如果存在互斥关系,crontab就很难进行互斥处理;
6.难于信息管理;运维管理者可能都不知道线上跑了多个定时任务,每个定时任务什么时候运行,属于哪个应用和哪个开发负责。

基于这些问题,我们就决定做一个定时任务管理系统。

当我们做完这个系统的时候,在某次运维大会上,发现暴风也存在这样的系统,有兴趣大家可以猛戳 http://chuansong.me/n/1940814

实现目标:
1. 信息化管理;
2.开发同事自助管理,无需运维同事进行介入;
3.系统需要有分布式功能和冗余功能,提供高并发和冗灾能力;
4.具有定时任务的执行数据图表;
5.支持运行失败告警,同时支持多种类告警(微信、邮件、公司IM通信工具);
6.与crontab的时间格式需一致,满足现用户使用习惯。
7.引入审核流程,开发pm需要审核非pm开发创建的定时任务。
8.远程应用本地程序运行,需要支持用户自上传定时任务代码包。
9.进行安全性检测,执行权限、代码包风险性检查、危险行为检查等。

定时任务对象:
1.web接口模式,该模式只需要进行web调用就能进行定时任务的调动;
2.本地运行模式,有些定时任务需要运行到应用本地,以脚本(shell python java等等)形式存在。

效果:

定时任务列表


自助配置页


定时任务类型:调用接口(web api调用);调用脚本(远程脚本的运行)
依赖任务:本任务运行是否依赖其它任务,如果选择,本任务则需要在依赖任务运行完后才能运行,如果超出本次运行开始时间则本次不执行。
告警:可以设置检测到关键字才进行告警。
调用脚本:用户选择该相则同时需要上传代码包。

执行结果列表:


单次执行结果:


整个任务执行数据统计



整体架构

1.用户web把定时任务信息写入数据库中;
2.主控端读取db中定时任务信息,并进行相应封装;
3.主控把对应的任务发送到不同的消息队列中(接口:web api调用;远程本地:应用服务器中的常驻内存进程每分钟进行队列查询 );
4.web:http调用;远程:常驻内存程序每分钟进行队列查询,如果存在本应用定时任务则执行。(队列进行了相关分布式封装)
6.结果写入结果队列(5忘记写了);
7.主控端读取结果队列数据;
8.主控端进行结果写入。

主控端逻辑

队列后端的数据流

队列:选用httpsqs;
nginx:进行分布式任务分派,使得httpsqs冗余和协同工作。


总结:
1. 系统上存在1k+个定时任务配置。
2.运行了两年,不怎么需要人力维护,也和之前提到代码更新系统一样处于放养状态。
3.运维同事已经基本不用介入定时任务的生命周期中,开发同事自助。
4.能快速统计定时任务相关信息,例如:某某12调整,只需一点就能查询到12点运行的定时任务有哪些。
5.定时任务信息化、实时告警化,相关任务能实时掌握到定时任务的异常情况。


更多内容请关注:微信订阅号,轻量运维






为什么使用PHP管理crontab 一般在定时任务较少的情况下,使用原生的crontab服务一般不会有什么问题,但当定时任务较多时就会产生如下问题: 文本形式的定时任务可读性很差,在没有任何注释的情况下,新人很难在不读源码的情况下了解定时任务的业务逻辑 在分布式的场景中,定时任务会散落到多台机器上,无法统一管理 定时任务的日志不能集中化管理,对定时任务的运行分析及故障排除比较麻烦 基于以上几点原因,我们迫切的需要一个可以集中化管理的、可配置的定时任务管理器 但自己开发一套分布式的定时任务系统何其复杂,所以作者采用crontab服务做辅助,使用php实现对定时任务的配置管理 使用php管理定时任务有哪些优势 定时任务可以不再是以文本方式的形式存在,可以存储在缓冲、数据库中,甚至你可以开发管理功能,在后台对定时任务进行编辑 定时任务的日志是可配置的,你可以按照业务需求,对日志进行差异化配置 使用方式如下: 编写一个任务管理器,可参考test/simple.php 将上述脚本添加到crontab中,一分钟执行一次 示例: <?php $crontab_config = [  'test_1' => [  'name' => '服务监控1',  'cmd' => 'php -v',  'output' => '/tmp/test.log',  'time' => '* * * * *'  ],  'single_test' => [  'name' => 'php -i',  'cmd' => 'php -i',  'output' => '/tmp/single_script.log',  'time' => [  '* * * * *',  '* * * * *',  ],  ], ];  $crontab_server = new \Jenner\Zebra\Crontab\Crontab($crontab_config); $crontab_server->start(); 工具短小,但很精悍 在分布式场景中,你可以把定时任务写入数据库中进行统一管理,你可以设定哪些定时任务是由哪些机器执行, 然后通过生成文本文件的方式发送到所有机器上,再由这些机器上的phpCrontab读取处理;从而实现分布式场景下的定时任务统一管理。 标签:Zebra
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值