调度器介绍


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定义说明如下:

  1. minute hour day month week。
  2. minute: 表示分钟,可以是从0到59之间的任何整数。
  3. hour:表示小时,可以是从0到23之间的任何整数。
  4. day:表示日期,可以是从1到31之间的任何整数。
  5. month:表示月份,可以是从1到12之间的任何整数。
  6. week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

特殊字符:

  1. 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  2. 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
  3. 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。
  4. 正斜线(/):可以用正斜线指定时间的间隔频率,例如“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']

results matching ""

    No results matching ""