10

替代crontab,统一定时任务管理系统cronsun简介

 3 years ago
source link: https://zhang.ge/5129.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
替代crontab,统一定时任务管理系统cronsun简介 | 张戈博客
Jager · 11月19日 · 2017年crontab · 定时任务 1096次已读

crontab是Linux系统里面最简单易用的定时任务管理工具,相信绝大多数开发和运维都用到过。在咱们公司,很多业务系统的定时任务都是通过crontab来定义的,时间长了后会发现存在很多问题:

  • 大量的crontab任务散布在各台服务器,带来了很高的维护成本
  • 任务没有按时执行,甚至失败了很久才发现,需要重试或排查
  • crontab分散在很多集群上,需要一台一台去看日志分析,头都大了
  • crontab存在单点问题,对于不能重复执行的定时任务很伤脑筋
  • 我X,crontab 被误删了,没备份?尼玛!
  • 我Q,服务器要迁移,crontab上的历史任务都是什么鬼?问了一圈居然都不知道

因此,我们非常需要一个集中管理定时任务系统,相信这也是的饱受crontab煎熬的运维或开发的心声。

我们部门的开发人力一直都非常紧张,所以靠自己开发一套完善的定时任务管理系统不太现实。因此,希望找一个开源的系统来快速满足需求。

期间,我在网上看了不少相关文章,比如 http://ju.outofmemory.cn/entry/221885

发现这些系统对于我们的实际场景来说都过于臃肿,不太合适。偶然在github找了一个基于Go语言开源的定时任务集中管理系统—gocron,发现非常轻量,于是试用了一段时间。

不过最终我还是放弃了,因为gocron存在单点问题,项目地址:https://github.com/ouqiang/gocron

期间和作者有过一段时间的交流,提了不少改善建议,在和gocron作者交流期间,他针对我提到的单点问题,推荐了另一个开源项目:cronsun,也就是本文介绍的主角,通过试用,发现非常契合我们当前的使用场景,介绍如下:

cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 近似。是为了解决多台 Linux  机器上 crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行)。支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用方便,是替换 crontab 一个不错的选择。

Github地址:https://github.com/shunfei/cronsun

cronsun的部署架构如下:

本文主要介绍功能,这里就简单写下关键步骤:

1、安装MongoDB,强烈建议使用集群模式

2、安装Etcd3,强烈建议使用集群模式

3、部署cronsun

①、下载cronsun:https://github.com/shunfei/cronsun/releases  (选择最新版本即可)

②、解压后修改conf目录下的配置文件:db.json 和 etcd.json,分别修改MongoDB和etcd的实际地址。

③、启动web:./cronweb -conf conf/base.json (若要后台运行则使用nohup)

④、启动node:./cronnode -conf conf/base.json (若要后台运行则使用nohup)

⑤、访问前台:http://x.x.x.x:7079/ui/

4、部署鉴权组件aProxy,cronsun在鉴权方面做的非常粗糙,所以这里用到了cronsun团队开发的aProxy鉴权组件,实现的原理为基于Go语言,反向代理了后端WEB,从而实现域名和页面地址的访问控制,介绍地址:https://www.cnblogs.com/QLeelulu/p/aproxy.html

我们这边是要用到生产环境,所以在部署上会着重考虑到可用性和可靠性,这里贴一下我们这边的部署架构图,供参考:

Ps:目前新版本已支持历史日志定期清理。

这里,Etcd和MongoDB复用了5台服务器(后续会继续复用其他公共组件),其中MongoDB采用分片+副本集的模式。

部署完成后,访问前台就能看到UI比较简陋cronsun管理WEB了:

Ps:右上方选择熟悉的语言之后,基本就可以按照页面标签进行任务添加操作了。

1、添加节点

cronsun基于etcd实现了自动发现和注册的功能,所以添加节点非常简单,直接将cronnode和conf拷贝到客户端服务器启动之后,就能在前台->节点页面看到该服务器了,当然节点和Etcd以及MongoDB之间的网络必须畅通。

2、节点分组

添加了所需的节点服务器之后,我们可以将节点进行分组,从而方便定时任务的添加:

3、添加任务

节点和分组都搞定之后,我们就可以开始添加定时任务了。定时任务填写的信息略微复杂,不过按照提示还是可以轻松搞定的:

上图我简单的标注了一些需要特别说明的地方,其他的选项大家看中文描述都能自行搞定。当然,还有一点要说明的是,任务脚本必须要有执行权限,否则任务会执行失败。

4、任务列表

添加完成任务之后,在任务标签页就能看到所有添加的定时任务以及执行情况了,这里可以使用分组过滤或节点过滤来筛选关心的任务。

每一个任务的右侧有3个小按钮:

①、成功/失败:显示最近一个任务的执行是成功还是失败,点击后可以查看到任务详情,包括任务输出数据:

②、latest按钮:点击后查看改任务的近期执行情况

③、刷新符号按钮:点击后可以弹出立即执行功能,方便调试任务

通过一段时间的灰度试用,可以确定cronsun在中小型规模场景下,是crontab的一个比较好的替代品,它能够帮助运维人员脱离crontab难管理、难运维的苦海。

当然,作为一款开源产品,cronsun很多功能细节还有很大的提升空间,目前我也和cronsun团队长期保持联系,将生产环境使用过程中遇到的一些问题和建议一一反馈,相信这款产品能够继续打磨优化,更加完善、完美。

六、问题及更新【持续】

问题记录:

1、告警配置

首先要清楚cronsun的告警是由cronweb发出的,而不是cronnode(但是cronnode的mail.json也必须Enable:true,否则还是无法发出告警)。

其次,编辑cronweb和cronnode的配置文件:mail.json,如下内容

"Enable": true,
"To": ["这里填写缺省默认的告警邮件接收地址"],
"#HttpAPI": "如有此字段,则按 http api 方式发送",
"#Keepalive": "如果此时间段内没有邮件发送,则关闭 SMTP 连接,单位/秒",
"Keepalive": 30,
"#doc": "https://godoc.org/github.com/go-gomail/gomail#Dialer",
"Host": "填写SMTP服务器地址,比如:stmp.qq.com",
"Port": 25,
"Username": "这里填写发送人邮箱地址(用于登陆SMTP+from地址)",
"Password": "登陆密码",
"SSL": false,
"LocalName": ""

Ps:LocalName建议留空,HttpAPI模式未使用到,这里省略之,请自行测试。

最后启动cronweb即可实现邮件告警。

当然, 还需要在web上的单向任务界面开启告警才行,如下图所示:

Ps:cronweb的mail.json配置中必须将Enable填为true才可以看到上图的告警开关按钮,否则不显示。

2、更新记录

详见github版本发布页面:https://github.com/shunfei/cronsun/releases

重要功能更新:

①、已支持脚本参数;

②、已支持历史日志定期清理;

③、3.1版本开始使用UUID作为节点唯一标识。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK