定时任务稳定性解决方案:Healthchecks监控系统的应用

笔记哥 / 04-22 / 43点赞 / 0评论 / 791阅读
## 背景 目前crontab出现问题后无感知,发现问题不及时,几乎是靠业务部门或用户反馈的方式,研发部门再排查的方式,处理问题、发现问题相对滞后,由此可见需要进一步优化crontab的稳定性,降故障通知前置,在用户反馈之前接受故障处理故障. 历史问题总结: - 人为误操作导致所有的crontab全部清空 - 定时任务服务器误操作后灾难恢复困难 - 未加锁机制检测启动多个进程导致数据错乱 - 定时任务被系统oom 导致任务失败 - 定时任务服务器重启后cron未开机自启导致任务未执行 - 定时任务失败后无监控、出问题无感知(发现问题&处理问题滞后) - ................... ## 一、定时任务管理规范 问题描述:目前上线是通过运维在salt服务器分发的方式,发布方式不透明,还存在手动修改的方式,不规范,曾出现过误操作导致全清空事件,定时任务服务器误操作后灾难恢复困难的问题 解决方案: 统一规范成jenkins发布的模式,同发布代码走相同的逻辑 ## 二、定时任务发布选择机器问题 问题描述: 目前发布代码需要选择服务器,存在错误选择的情况,从而引发问题. 解决方案:优化发布方式,发布无需选择服务器,自动判断发布服务器。 ## 三、定时任务无法及时查看 问题描述:目前是通过定时同步任务列表到/tmp/work\_cron的方式,存在延迟 解决方案: 研发直接查看gitlab的仓库即可 ## 四、定时任务执行OOM中断 问题描述: 较大的程序执行会耗费很大的内存,从而出现被系统oom的风险,然而系统oom后目前并不能发现 解决方案:针对系统oom的问题,可以收集/var/log/message的方式进行报警处理,可第一时间发现问题. ## 五、定时任务进程数据安全保障(锁机制) 定时任务出现hang住进程,导致很多进程启动的问题 ; 多个进程同时运行导致数据错乱问题. 例如每次写的临时表名称一致,两个进程同时写则可能产生错误的数据结果. 解决方案: 对于不可同时启动两个进程的任务,程序需要加锁判断状态保证数据的可靠性 ## 六、大型定时任务升级队列实现 问题描述: 定时任务应当尽量的轻量化,最优方案是只做定时任务的触发,而后程序通过队列方式进行数据处理. 例如定时任务程序单次运行需要几十分钟以上,或者处理的数据量达千万级别. 解决方案: ### 方案一 1. 将重量级别的任务改造优化成队列的方式实现. 代码实现数据处理逻辑,数据放入队列依次处理的方式. 2. 使用cronsun触发的方式进行定时任务的管理 ### 方案二 - 迁移至大数据任务平台,利用大数据集群运算能力完成相关功能 ## 七、定时任务状态感知 问题描述:目前每个定时任务的执行状态(成功/失败/hang/warn)无法感知,只能通过日志来排查(如果有日志) 1. 如何知道任务是否开始执行?(目前靠人)【cron服务未开启】 2. 如何知道任务执行成功/失败?(目前靠人)【脚本执行80%后失败】 3. 任务执行失败如何第一时间发现?(目前基本靠业务&用户侧反馈) 解决方案: - 增加判断crontab是否按照预期执行监控机制 - 增加状态汇报逻辑,使任务执行可视化&数据化,并且增加报警机制.(核心任务) - 增加定时任务日志,提供关键字进行报警(核心任务) ## 八、healthchecks 监控系统 详情移步官网: https://healthchecks.io/ (开源软件) Healthchecks 是一个用来 监控定时任务(cron job)是否按时运行 的系统。它通过一种非常简单有效的方式帮助你发现定时任务是否异常或失败。 ### 主要作用 - 监控 cron、systemd timer、脚本等是否按时执行; - 当任务没有按时“打卡”时,发送通知(邮件、Webhook、Slack、钉钉等); - 提供简单的 Web UI 记录任务运行历史和状态。 ### Healthchecks 的工作原理如下: 1. 系统为每个任务分配一个唯一的“ping URL”(如 [https://xx.xxxxx.com/your-uuid);](https://xx.xxxxx.com/your-uuid) 2. 每次任务执行成功后,向这个 URL 发一个 HTTP 请求(称为“ping”); 3. Healthchecks 会为每个任务设置一个超时时间(比如 1 小时); 4. 如果超时未收到“ping”,则认为该任务未执行或执行失败,触发告警 ### 应用场景 - 生产环境中的定时脚本/任务监控 - 如 MySQL 备份脚本、日志归档、数据同步等。 - Kubernetes CronJob 监控 - CronJob 成功后加一个 ping 请求,Healthchecks 提供独立的状态记录和报警。 - 没有集成监控系统的小团队 - Healthchecks.io 提供简单、即开即用的 Web UI 和通知集成,非常适合中小项目快速接入。 - 与 Prometheus/Grafana 互补 - 可在任务层面提供更直观的“是否执行”状态,结合已有监控形成闭环。 如果你有多个定时任务,还可以用标签、项目分组等方式管理。如果你有兴趣搭建私有版本,它也支持 Docker 一键部署。