当前位置: 首页 > 工具软件 > cronsun > 使用案例 >

linux crontab 做高可用,使用 cronsun 管理多台机器上的 crontab 任务

陈兴朝
2023-12-01

原标题:使用 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

责任编辑:

 类似资料: