原标题:使用 cronsun 管理多台机器上的 crontab 任务
cronsun 是一个分布式任务系统,单个结点和 Linux 机器上的 crontab 近似。支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用方便,是替换 crontab 一个不错的选择。 cronsun 是为了解决多台 Linux 机器上crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行)
在 Linux 机器上,我们通常用 crontab 来管理定时任务,比如指定时间重启某个服务,备份数据库,跑某些分析/统计服务等。
目前有很多任务调试系统和工具,比如:
Azkaban
Chronos
Airflow
dkron
swoole-crontab
Saturn
每个系统都有自己的特色和应用场景,如果你只想集中管理多台机器上的定时任务,可以试试cronsun。
cronsun 支持:
Web 界面统一管理任务
任务失败重试
任务失败邮件提醒
多机单任务(防止单机挂掉任务不按时执行)
单机任务并行数限制
执行单次任务
多机器严格的时间间隔任务
支持安全性配置,可以限制任务脚本的后缀和执行用户
...
cronsun 架构:[web]
|
---------------------
(add/del/update/exec jobs)| |(query job exec result)
[etcd] [mongodb]
| ^
-------------------- |
| | | |
[node.1] [node.2] [node.n] |
(job exec fail)| | | |
[send mail]
cronsun 主要概念:任务
在 cronsun 中,有三种类型的的任务:
普通任务,和 crontab 中的任务一样。
单机单进程任务,普通的 crontab 任务是单机的,如果执行任务的机器出现问题,任务可能执行失败。cronsun 提供此任务类型是保证有多台机器可以执行一个任务,但在执行任务被执行时,只有一台机器在执行任务。
一个任务执行间隔内允许执行一次,这个类型的任务和单机单进程任务类似,但限制更严格。因为多台机器间,时间可能会不一致,而某些任务要求执行的时间间隔要严格一致时,可以考虑采取这种类型。
任务分组
任务分组是为了方便管理,在添加任务时可以在任务分组里增加新的分组,查询时按分组查出相应的任务。
任务脚本
相当于 crontab 中的执行命令,复杂的任务(如 pipe)需要写成 shell 脚本。
用户
指定执行任务的用户
超时设置
超过设定的时长,cronsun 会停止执行任务,防止出问题的任务长时间占用资源。
并行数设置
设置在单个节点上面同时可执行多少个相同的任务,针对某些任务执行时间很长,但两次任务执行间隔较短时比较有用。
失败重试
任务执行失败时,重新尝试执行任务,直到任务执行成功或超过设置的次数。
定时器
相当于 crontab 中的时间规则,cronsun 中的时间规则支持到秒级,比 crontab 多支持一位,cronsun 中支持多种时间格式。一个任务可以有多个定时器,主要是方便于多个节点在不同时间点执行同一个任务。
常用时间格式:
0 1 2 3 4 5
| | | | | |
| | | | | +------ day of week (0 - 6) (Sunday=0)
| | | | +------ month (1 - 12)
| | | +-------- day of month (1 - 31)
| | +---------- hour (0 - 23)
| +------------ min (0 - 59)
+-------------- sec (0-59)
字段名
允许的值
允许的特殊字符
Seconds
0-59
* / , -
Minutes
0-59
* / , -
Hours
0-23
* / , -
Day of month
1-31
* / , - ?
Month
1-12 or JAN-DEC
* / , -
Day of week
0-6 or SUN-SAT
* / , - ?
星号 ( * )
星号会匹配字段中的所有值,如在小时字段用了星号,表示每个小时都会匹配。
斜线 ( / )
匹配指定的数字,如 */3 在小时字段中等于 0,3,6,9,12,15,18,21 等被 3 整除的数。
逗号 ( , )
匹配分开的值,如 1,3,4,7,8 在小时字段中表示这里面的小时会匹配。
连词符 ( - )
匹配范围,例如:1-6,意思等同于 1,2,3,4,5,6。
问题 ( ? )
在 day-of-month 或者 day-of-week 字段可代替 *。
预定格式
Entry
Deion
Equivalent To
@yearly (or @annually)
Run once a year, midnight, Jan. 1st
0 0 0 1 1 *
@monthly
Run once a month, midnight, first of month
0 0 0 1
@weekly
Run once a week, midnight on Sunday
0 0 0 0
@daily(or @midnight)
Run once a day, midnight
0 0 0 *
@hourly
Run once an hour, beginning of hour
0 0
节点
执行任务的机器,需要部署 cronnode。
节点分组
方便管理节点,如果在任务的定时器里选择某个节点分组,则表示任务会在这个节点分组的所有结点上运行。
故障节点
cronnode 出现问题的节点,一般情况下是 cronnode 服务挂掉,如果 etcd 的网络不好,也会临时出现故障节点。
离线节点
cronnode 服务正常关闭的结点。
正常结点
正常服务的结点。
日志
用于查询任务的执行结果,日志存储在 MongoDB 中,如果只想保存最新一段时间内的执行结果,可以使用 MongoDB 的Capped Collections,在部署的时候创建一个名为 job_log 的 Capped Collection。
原文来自: https://my.oschina.net/u/270037/blog/1305373
责任编辑: