Apache Mesos(9)-使用Chronos运行计划任务
作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/ 或 http://andyyoung01.16mb.com/
本篇我们来看看Mesos框架Chronos。如果您将Mesos看成“分布式系统的内核”,则Chronos相当于Linux的Cron系统或Windows的计划任务:它处理Mesos集群上基于时间的计划任务。Chronos支持在cgroups内运行命令以及Docker容器。
安装和配置Chronos
对于安装Marathon(Version 2.4.0),需要满足以下的一些先决条件:
- Java 1.7+
- Mesos 0.22.2+
- ZooKeeper+
安装Chronos的最简单的方法是通过Mesosphere提供的安装源,使用包管理器进行安装。根据Linux的发行版,使用如下命令安装Chronos:
- RHEL/CentOS:
sudo yum install Chronos
- Ubuntu:
sudo apt-get install Chronos
也可以使用Tarball或者编译安装,还可以通过Docker的镜像,将Chronos作为Marathon的一个任务运行。
如果是通过Mesosphere提供的安装源安装的Chronos,可以使用基于文件的配置,配置文件的位置在/etc/chronos/conf/文件夹。
Chronos的详细的安装和配置可以参考官方文档。
使用Chronos创建简单任务
可以通过Chronos创建一个独立的、不依赖于其它任务的任务。它没有任何对其它Chronos任务的父子依赖关系。这可以是类似于每天发送邮件或者每晚进行数据库备份的任务。
创建基于命令行的任务
在Chronos中的计划任务,是通过JSON对象描述的,它包含至少以下几项:
- Schedule计划表
- 名称(也可以称为ID)
- 命令
计划表是由3部分组成,由/分开,如下图所示:
了解了Chronos计划任务的格式后,你可以很容易得理解任务开始的时间,间隔多长时间任务重复执行,以及任务重复执行的次数(包括无限次)。上图的例子表示每10分钟运行一次任务,它开始执行的时间是2015年10月5日10:00pm,它重复执行无限次。
关于ISO8601日期/时间的格式标准,参考https://en.wikipedia.org/wiki/ISO_8601。
使用web界面创建任务
通过web界面来创建计划任务非常直观,通过访问http://your-chronos-ip:4400,打开web界面,点击New job按钮,在右边的面板中填入相关信息,如下图:
使用REST API创建任务
REST API包括web UI没有提供的功能,如Docker容器信息,时区支持,使用Mesos fetcher来下载文件到任务的工作目录中。下面的JSON文件创建了一个计划任务:
使用curl命令提交到Chronos:
$ curl -H 'Content-Type: application/json' -d @simple-sleep.json http://your-chronos-ip:4400/scheduler/iso8601
创建基于Docker的任务
Docker容器允许你将代码和它的依赖一起打包成一个镜像,以一个单一的artifact分发到集群中的任何节点上。这极大地方便了程序的部署。
Mesos集群环境中,一个很有用的功能是:Mesos任务的工作目录自动地映射到容器内部的某一路径,这样就可以继续使用Mesos提供的功能,如通过fetcher下载你计划任务需要使用的文件或脚本。
我们来看一个例子。这个例子根据用户指定的U.S.邮政编码给用户发送这个地区的天气预报:
上述代码第5-8行指定了需要使用的Docker镜像,第11行指定了当任务失败后,Chronos将发送通知邮件到该地址,第12-14行指定了脚本文件的下载地址,第15行指定了需要运行的命令,剩下的几行代码指定了脚本需要用到的环境变量的值。你可以将MAIL_USERNAME和MAIL_PASSWORD换成你gmail的账号和密码。然后通过下面的命令提交到Chronos:
$ curl -H 'Content-Type: application/json' -d @simple-docker.json http://your-chronos-ip:4400/scheduler/iso8601
如果要更新一个已经存在的任务的配置,只需要将同样的JSON文档使用HTTP的PUT方法而不是POST方法。如果使用的是curl,可以通过添加参数
-X PUT
来实现。
本篇我们安装了Chronos框架,并且使用它创建了基于命令行和Docker容器的计划任务。以上创建的任务都是独立的、不依赖于其它任务的任务,下篇我们创建一些有依赖关系的任务。