【Cronsun】分布式任务调度服务
⭐️⭐️⭐️ Cronsun是分布式任务系统,不是任务队列
GitHub项目地址:https://github.com/shunfei/cronsun
环境说明
|
|
项目背景
crontab 是 Linux 系统里面最简单易用的定时任务管理工具,服务一体化架构下基本使用的都是单一服务器走天下,这种情况下一般都是用 **crontab **管理。随着服务化的推广,服务器的增多,定时任务都是通过 crontab 来定义的,时间长了后会发现存在很多问题:
- 大量的 crontab 任务散布在各台服务器,带来了很高的维护成本
- 任务没有时序性执行,甚至失败了很久才发现,需要重试或排查
- crontab 分散在很多集群上,日志也是散落在不同服务,即便 ELK 收集也不太方便
- crontab 存在单点问题,对于不能重复执行的定时任务很伤脑筋
- crontab 任务的误删,恢复存在巨大难度,淘汰的弃用任务复杂度过高
- crontab 任务随着服务迁移而迁移时,有着繁琐的配置
- crontab 不支持动态配置定时任务。。。
- 等等。。。
项目的选择
一个开源项目:cronsun,也就是本文介绍的主角,通过试用,发现非常契合我们当前的使用场景,介绍如下: cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 近似。是为了解决多台 Linux 机器上 crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行)。支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用方便,是替换 crontab 一个不错的选择。
Github 地址:
GitHub - shunfei/cronsun: A Distributed, Fault-Tolerant Cron-Style Job System.
Cronsub特性:
- 方便对多台服务器上面的定时任务进行集中式管理
- 任务调度时间粒度支持到秒级别
- 任务失败自动重试
- 任务可靠性保障(从N个节点里面挑一个可用节点来执行任务)
- 简洁易用的管理后台,支持多语言
- 任务日志查看
- 任务失败邮件告警(也支持自定义http告警接口)
- 用户验证与授权 (默认账号密码: admin@admin.com / admin)
可靠性
Cron-Node节点
**Cron-node **节点是负责调度和执行任务的,对于 **Cron-node **节点提供以下可靠性保障:
- **Cron-node **被设计成一个常驻进程,追求稳定和高可用
- Cron-node和etcd服务的连接中断了:
- 断开连接之前已经下发的任务会正常执行;
- 在断开连接期间新建、修改、删除的任务无法更新到节点;
- 会自动和etcd进行重连;
- 和etcd重新连接上后,会重新加载和该节点相关的全部任务,保证正确性;
- Cron-node和MongoDB数据库的连接中断了:
Cron-Web 节点
Cron-web节点是负责管理任务、查看任务执行日志的,对于Cron-web节点提供以下可靠性保障:
- Cron-web进程崩溃了:
- 不影响Cron-node节点和任务正常执行;
- 报警邮件无法发送;
- Cron-web和etcd服务的连接中断了:
- Cron-web无法访问;
- 报警邮件无法发送;
- Cron-web和MongoDB服务的连接中断了:
- Cron-web无法访问;
- 报警邮件无法发送;
- 可以部署多个Cron-web节点,可以访问任一节点正常管理任务和查看日志;
Cronsun 的部署架构如下:
整体架构图
worker工作流
部署
下面简单记录下安装包步骤
- 安装 MongoDB, 可以按照具体情况决定是否使用集群模式(最好肯定是配置上集群)
- 安装 Etcd3, 可以按照具体情况决定是否使用集群模式(最好肯定是配置上集群)
- 部署 **Cronsun **
①、下载 cronsun:https://github.com/shunfei/cronsun/releases (选择最新版本即可) ②、解压后修改 conf 目录下的配置文件:db.json 和 etcd.json,分别修改 MongoDB 和 etcd 的实际地址。 ③、启动 web:./cronweb -conf conf/base.json (若要后台运行则使用 nohup) ④、启动 node:./cronnode -conf conf/base.json (若要后台运行则使用 nohup) ⑤、访问前台:http://x.x.x.x:7079/ui/
- 部署鉴权组件 aProxy,cronsun 在鉴权方面做的非常粗糙,所以这里用到了 cronsun 团队开发的 aProxy 鉴权组件,实现的原理为基于 Go 语言,反向代理了后端 WEB,从而实现域名和页面地址的访问控制,介绍地址:https://www.cnblogs.com/QLeelulu/p/aproxy.html
**注意: 目前新版本已经支持日志定期清理。 **
功能
部署完成后,访问前台就能看到 UI 比较简陋 cronsun 管理 WEB 了
注意:右上方选择熟悉的语言之后,基本就可以按照页面标签进行任务添加操作了。
添加客户端节点
cronsun 基于 etcd 实现了自动发现和注册的功能,所以添加节点非常简单,直接将 cronnode 和 conf 拷贝到客户端服务器启动之后,就能在前台->节点页面看到该服务器了,当然节点和 Etcd 以及 MongoDB 之间的网络必须畅通。(至少启动的时候要保持通畅)
添加客户端节点分组
添加执行任务
官方文档:
任务配置
注意:任务脚本必须要有执行权限,否则任务会执行失败
任务列表
添加完成任务后可以在任务列表中查看已经添加的任务:
每个任务的右侧都有3个小按钮
**①、**成功/失败:显示最近一个任务的执行是成功还是失败,点击后可以查看到任务详情,包括任务输出数据:
**②、**latest 按钮:点击后查看任务的近期执行情况
**③、**刷新符号按钮:点击后可以弹出立即执行功能,方便调试任务
报警 && 更新
报警配置
注意:cronsun 的告警是由 cronweb 发出的,而不是 cronnode(但是 cronnode 的 mail.json 也必须 Enable:true,否则还是无法发出告警)。 其次,编辑 cronweb 和 cronnode 的配置文件:mail.json,如下内容:
|
|
Tis:LocalName 建议留空,HttpAPI 模式未使用到,这里省略之,请自行测试。
Tis:cronweb 的 mail.json 配置中必须将 Enable 填为 true 才可以看到上图的告警开关按钮,否则不显示。
总结
cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 类似,目的是解决多台 Linux 机器上 crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行),此外,有页面配置及告警邮件支持等。汇总如下3点:
- 替换 crontab
- 执行不能单点失败的任务,具备一定可靠性运行
- 简单的任务调度能力(但cronsun 不是任务队列)⭐️⭐️⭐️