调度器介绍
M³Meta平台产品提供的调度引擎支持通过调度语言定义调度任务,用户可通过界面编辑窗口配置,创建任务以及工作流,或者通过REST接口调用语法检查、启动、添加、删除任务。
调度引擎
在调度引擎中定义了以下概念。
job
作业调度的最小工作单元。
job目录
包含多个job或多个job目录的容器。
exec
执行job时运行的命令、shell脚本块、lua脚本块。
schedule
定义job触发的条件。
host group
执行job运行的host组。
host
执行job运行的host。
session变量
作用域为作业单个运行周期内的变量。
global变量
作用域为跨作业运行周期的变量。
Exec组件配置
Exec组件配置支持三种类型,分别是命令或脚本、shell代码块、lua代码块。下面将分别对其进行说明并举例。
命令或者脚本
指定job运行的命令或者脚本,支持带命令参数,例如:
exec = mit -C /opt/matrix/repo pull origin master
exec = /opt/matrix/cassandra/bin/nodetool drain
exec = /opt/matrix/cassandra/bin/nodetool stopdaemon
exec = /opt/matrix/backup.sh -dest /home/matrix/new.zip
shell代码块
指定job运行的shell脚本内容,支持单行或多行,例如:
exec = "v1='Hello';v2='World';v3='${v1} ${v2}';echo $v3"
exec = """shell
v1="Hello"
v2="World"
v3="${v1} ${v2}"
echo $v3
"""
lua代码块
指定job运行的shell脚本内容,支持单行或多行,例如:
exec = {"lua":"v1='hello';v2='world';v3=v1..' '..v2;print(v3) " }
exec = """lua
v1="Hello"
v2="World"
v3=v1.." "..v2
print(v3)
"""
Schedule组件配置
Schedule组件配置支持三种job触发方式,分别是Crontab方式、前置job执行结果、lua程序块返回true,下面将分别对其进行说明并举例。
Crontab触发方式
通过定义cron设定job周期性运行,例如:
schedule = cron */1 * * * *
以上采用的crontab定义说明如下:
- minute hour day month week。
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
前置job执行结果
通过定义前置job的执行结果,定义触发job的条件,分为跨job目录调度和非跨job目录调度,例如:
schedule = a@system/test[output=='bad'] || b[output=='good']
以上为跨job目录job a和本job目录job b执行结果逻辑运算后的结果作为触发条件。
schedule = a*[output=='bad'] && b[output=='good']
以上为本job目录job中模式匹配a*的job,与b脚本执行结果逻辑运算后的结果作为触发条件。
lua程序块返回true触发方式
lua程序块返回true触发方式,举例如下:
schedule = [
a = 2
b = 3
c = a + b
if c == 5 then
return true
end
]
group组件配置
group组件配置支持设定job在哪些服务器上运行,在设定组内所有服务器上运行或者组内某台服务器上运行,以及在所有机器上并发执行,还是顺序执行。
group配置路径
/etc/group
示例
[group "test"]
host = wecise
[group "mxsvrs"]
host = wecise1
host = wecise2
host = wecise3
在某组服务器中选择一台执行
group = mxsvrs
在某组服务器中所有节点并发执行
group = mxsvrs !
在某组服务器中所有节点顺序执行
group = mxsvrs ~
在指定服务器上执行
host = wecise1
Job定义掉的基本单元,配置框架如下
[job <Jobname>]
description = <job description>
group|host = <groupname | hostname>
begin = """
<lua>
"""
exec = <command | shell | lua>
exec = <command | shell | lua>
……
exec = <command | shell | lua>
end = """
<lua>
"""
schedule = <crontab | prepositive job | lua>
注:以上结构粗体部分为必须配置的内容,非粗体部分为根据需求确定是否配置内容.
Job样例如下:
#step1 ->a
# _________|________
# | |
#step2 success->b fail->c
# ______|_______
# | |
#step3 success=>d fail->e
[job "a"] # step1
group = mxsvr
exec = jobbot 0
schedule = cron */1 * * * *
[job "b"] # step2 a success
group = mxsvr
exec = jobbot
schedule = a[output=='good']
[#job "c"] # step2 a fail
group = mxsvr
exec = jobbot
schedule = a[output=='bad']
[#job "d"] # step3 b success
group = mxsvr
exec = jobbot
schedule = b[output=='good']
[#job "e"] # step3 b fail
group = mxsvr
exec = jobbot
schedule = b[output=='bad']