【Cronsun】分布式任务调度服务

⭐️⭐️⭐️ Cronsun是分布式任务系统,不是任务队列 image.png GitHub项目地址https://github.com/shunfei/cronsun


环境说明

1
2
3
4
5
6
root@xjr-pc:/etc/init.d# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.1 LTS
Release:	18.04
Codename:	bionic

项目背景

crontabLinux 系统里面最简单易用的定时任务管理工具,服务一体化架构下基本使用的都是单一服务器走天下,这种情况下一般都是用 **crontab **管理。随着服务化的推广,服务器的增多,定时任务都是通过 crontab 来定义的,时间长了后会发现存在很多问题:

  • 大量的 crontab 任务散布在各台服务器,带来了很高的维护成本
  • 任务没有时序性执行,甚至失败了很久才发现,需要重试或排查
  • crontab 分散在很多集群上,日志也是散落在不同服务,即便 ELK 收集也不太方便
  • crontab 存在单点问题,对于不能重复执行的定时任务很伤脑筋
  • crontab 任务的误删,恢复存在巨大难度,淘汰的弃用任务复杂度过高
  • crontab 任务随着服务迁移而迁移时,有着繁琐的配置
  • crontab 不支持动态配置定时任务。。。
  • 等等。。。

项目的选择

一个开源项目:cronsun,也就是本文介绍的主角,通过试用,发现非常契合我们当前的使用场景,介绍如下: cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 近似。是为了解决多台 Linux 机器上 crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行)。支持界面管理机器上的任务,支持任务失败邮件提醒,安装简单,使用方便,是替换 crontab 一个不错的选择。

Github 地址:

GitHub - shunfei/cronsun: A Distributed, Fault-Tolerant Cron-Style Job System.

Cronsub特性:

  • 方便对多台服务器上面的定时任务进行集中式管理
  • 任务调度时间粒度支持到秒级别
  • 任务失败自动重试
  • 任务可靠性保障(从N个节点里面挑一个可用节点来执行任务)
  • 简洁易用的管理后台,支持多语言
  • 任务日志查看
  • 任务失败邮件告警(也支持自定义http告警接口)
  • 用户验证与授权 (默认账号密码: admin@admin.com / admin)

可靠性

Cron-Node节点

**Cron-node **节点是负责调度和执行任务的,对于 **Cron-node **节点提供以下可靠性保障:

  • **Cron-node **被设计成一个常驻进程,追求稳定和高可用
  • Cron-nodeetcd服务的连接中断了:
    • 断开连接之前已经下发的任务会正常执行;
    • 在断开连接期间新建、修改、删除的任务无法更新到节点;
    • 会自动和etcd进行重连;
    • etcd重新连接上后,会重新加载和该节点相关的全部任务,保证正确性;
  • Cron-nodeMongoDB数据库的连接中断了:
    • 所有任务依然会正常执行;
    • 在断开连接期间执行完成的任务,日志会因为无法写入到MongoDB而看不到任务的执行记录和任务日志,不影响任务正常执行;
    • 会自动和MongoDB进行重连,重连后执行记录和任务日志会正常写入MongoDB;

Cron-Web 节点

Cron-web节点是负责管理任务、查看任务执行日志的,对于Cron-web节点提供以下可靠性保障:

  • Cron-web进程崩溃了:
    • 不影响Cron-node节点和任务正常执行;
    • 报警邮件无法发送;
  • Cron-webetcd服务的连接中断了:
    • Cron-web无法访问;
    • 报警邮件无法发送;
  • Cron-webMongoDB服务的连接中断了:
    • Cron-web无法访问;
    • 报警邮件无法发送;
  • 可以部署多个Cron-web节点,可以访问任一节点正常管理任务和查看日志;

Cronsun 的部署架构如下:

整体架构图

image.png

worker工作流

image.png

部署

下面简单记录下安装包步骤

  1. 安装 MongoDB, 可以按照具体情况决定是否使用集群模式(最好肯定是配置上集群)
  2. 安装 Etcd3, 可以按照具体情况决定是否使用集群模式(最好肯定是配置上集群)
  3. 部署 **Cronsun **

①、下载 cronsunhttps://github.com/shunfei/cronsun/releases (选择最新版本即可) ②、解压后修改 conf 目录下的配置文件:db.jsonetcd.json,分别修改 MongoDBetcd 的实际地址。 ③、启动 web./cronweb -conf conf/base.json (若要后台运行则使用 nohup) ④、启动 node./cronnode -conf conf/base.json (若要后台运行则使用 nohup) ⑤、访问前台:http://x.x.x.x:7079/ui/

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

**注意: 目前新版本已经支持日志定期清理。 **

功能

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

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

添加客户端节点

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

添加客户端节点分组

image.png

添加执行任务

官方文档: 任务配置 image.png 注意:任务脚本必须要有执行权限,否则任务会执行失败

任务列表

添加完成任务后可以在任务列表中查看已经添加的任务: image.png 每个任务的右侧都有3个小按钮 **①、**成功/失败:显示最近一个任务的执行是成功还是失败,点击后可以查看到任务详情,包括任务输出数据: image.png **②、**latest 按钮:点击后查看任务的近期执行情况 **③、**刷新符号按钮:点击后可以弹出立即执行功能,方便调试任务 image.png

报警 && 更新

报警配置

注意:cronsun 的告警是由 cronweb 发出的,而不是 cronnode(但是 cronnodemail.json 也必须 Enable:true,否则还是无法发出告警)。 其次,编辑 cronwebcronnode 的配置文件:mail.json,如下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "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": ""
}

Tis:LocalName 建议留空,HttpAPI 模式未使用到,这里省略之,请自行测试。 image.png Tis:cronwebmail.json 配置中必须将 Enable 填为 true 才可以看到上图的告警开关按钮,否则不显示。

总结


cronsun 是一个分布式任务系统,单个节点和 Linux 机器上的 crontab 类似,目的是解决多台 Linux 机器上 crontab 任务管理不方便的问题,同时提供任务高可用的支持(当某个节点死机的时候可以自动调度到正常的节点执行),此外,有页面配置及告警邮件支持等。汇总如下3点:

  1. 替换 crontab
  2. 执行不能单点失败的任务,具备一定可靠性运行
  3. 简单的任务调度能力(但cronsun 不是任务队列)⭐️⭐️⭐️
0%