在企业系统开发过程中难免少不了一些定时任务来进行定时触发执行任务,对于非分布式环境系统中,我们只需要在对应系统中内部集成一些调度库进行配置定时触发即可。比如:使用Spring框架集成quartz,只需要进行一些简单的配置就能定时执行任务了。但是随着企业的系统越来越多、逐步从单一应用慢慢演变为微服务集群。在分布式集群系统中主要面临出如:任务的重复执行、没有统一定时任务配置、任务节点故障转移、任务监控&报警等一些列的功能都是要在分布式系统中进行解决。
此分布式的定时任务调度平台,它非常轻量小巧,使用简单,后端以中心服务器为调度核心,负责集群中各种任务的动态分配和调度执行。在平台前端支持Web界面可视化管理,我们可以创建、暂停/启动任务、删除未执行的任务快照、或者查看任务的调度状态和执行日志。任务抽象调度任务中心不负责业务任务格式,只负责将任务快照分发到指定的客户端即可。
系统架构可以部署N个Node节点,同一时刻只有一台Leader节点,只有选举成功的Leader节点才有派发任务的权限。任务客户端启动时候通过Etcd进行注册客户端元数据信息。
角色JobNodeLeader任务调度集群负责任务的配置管理、监控、任务统计、故障转移以及任务分发工作。整个任务调度集群只有一台JobNode是Leader。
JobNodeFollower任务调度集群负责任务的配置管理以及监控,整个任务调度集群可以有N台JobNode是Follower。没有故障转移、任务分发能力,当JobNodeLeader不可用下线后触发选举,才有机会成为Leader节点。
任务集群(Group)为了发挥集群的处理业务作业的能力,我们不可能只希望作业集群中的某一台只执行作业。任务集群是将同一个任务或者同一组的任务并发分散到不同的作业机器中。发挥更大的作业能力。
任务作业(Client)任务作业(Client)是每一台作业机器重启后会自动注册至Etcd中方便JobNodeLeader能够将指定的任务分配给自己。自己作业完毕会将结果回传给Etcd指定的目录中以方便Leader进行统计收集工作。
选举由于一个任务调度集群有多台提供服务,我们在可以从集群节点中选举出一台领导节点来进行发号师令,比较成熟的选举算法(Paxos、Raft等)这里不做讨论。这里使用etcd中的租约机制来实现选举功能。当一个调度服务节点启动的时候首先尝试发起选举请求(PUT节点/forest/server/elect/leader),如果执行成功则选举成功。如果判断已经有其他调度服务节点已经选举成功过则放弃选举请求并进行监听(/forest/server/elect/leader)选举节点变化。如果有领导下线通知则立即发起选举。
在任务调度服务集群中一条任务配置在同一时刻保证只能触发一次任务,如果所有的任务集群都触发了次任务那就说明此任务被重复的执行了N次。我们需要从调度集群中选举出一个调度Leader节点进行指挥。只有Leader调度节点才能分发任务,其他的Follower节点没有权限分发任务,一旦Leader调度Node挂掉,其他Follower节点则会重新选举,诞生一台新的Leader节点继续指挥服务。
平台特点1. 通过[Web界面管理](https://github.com/busgo/duck),操作简单方便,支持各种任务2. 高可用可以部署N台调度集群节点,保证没有单点故障。3. 部署简单、仅仅需要一个执行文件即可运行。4. 集成方便,统一任务抽象,接入sdksoeasy!5. 任务故障转移,任务客户端下线自动切至在线客户端任务机器。
快速开始sql脚本CREATETABLE`job_execute_snapshot`(`id`VARCHAR(64)NOTNULLCOMMENT'主键',`job_id`VARCHAR(32)NOTNULLCOMMENT'任务定义id',`name`VARCHAR(32)NOTNULLCOMMENT'任务名称',`group`VARCHAR(32)NOTNULLCOMMENT'任务集群',`cron`VARCHAR(32)NOTNULLCOMMENT'cron表达式',`target`VARCHAR(255)NOTNULLCOMMENT'目标任务',`params`VARCHAR(255)DEFAULTNULLCOMMENT'参数',`ip`VARCHAR(32)NOTNULLCOMMENT'ip',`status`TINYINT(4)NOTNULLCOMMENT'状态1-执行中2-完成3-未知4-错误',`mobile`VARCHAR(32)DEFAULTNULLCOMMENT'手机号码',`remark`VARCHAR(255)DEFAULTNULLCOMMENT'备注',`create_time`VARCHAR(32)NOTNULLCOMMENT'创建时间',`start_time`VARCHAR(255)DEFAULTNULLCOMMENT'开始时间',`finish_time`VARCHAR(32)DEFAULTNULLCOMMENT'结束时间',`times`BIGINT(20)DEFAULT'0'COMMENT'耗时',`result`VARCHAR(255)DEFAULTNULLCOMMENT'返回结果',PRIMARYKEY(`id`),KEY`ip`(`ip`),KEY`job_id`(`job_id`),KEY`status`(`status`),KEY`group`(`group`))ENGINE=INNODBDEFAULTCHARSET=utf8COMMENT='任务作业执行快照';先决条件 golang(>=1.11) git
源代码安装gitclonehttps://github.com/busgo/forest.gitcdforest/forestgobuildforest.go等待自动下载依赖库appledeMacBook-Pro:forestapple$gobuildforest.gogo:findinggithub.com/xiang90/probingv0.0.0-20190116061207-43a291ad63a2go:findinggithub.com/dgrijalva/jwt-gov3.2.0+incompatiblego:findinggithub.com/golang/groupcachev0.0.0-20190702054246-869f871628b6go:findinggithub.com/coreos/pkgv0.0.0-20180928190104-399ea9e2e55fgo:findinggithub.com/coreos/go-systemdv0.0.0-20190620071333-e64a0ec8b42ago:findinggithub.com/prometheus/client_golangv1.0.0go:findinggithub.com/coreos/bboltv1.3.3go:findinggithub.com/prometheus/commonv0.4.1go:findinggithub.com/grpc-ecosystem/go-grpc-middlewarev1.0.0go:findinggithub.com/coreos/etcdv3.3.13+incompatiblego:findinggithub.com/tmc/grpc-websocket-proxyv0.0.0-20190109142713-0ad062ec5ee5go:findinggithub.com/grpc-ecosystem/grpc-gatewayv1.9.4go:findinggithub.com/gogo/protobufv1.1.1go:findinggithub.com/alecthomas/templatev0.0.0-20160405071501-a0175ee3bcccgo:findinggithub.com/prometheus/procfsv0.0.0-20181005140218-185b4288413dgo:findinggopkg.in/yaml.v2v2.2.1...如果下载依赖库出现超时问题,请重复执行编译命令直到成功为止。查询命令参数
appledeMacBook-Pro:forestapple$./forest-helpflagneedsanargument:-helpUsageof./forest:-db-urlstringdburlformysql(default"root:123456@tcp(127.0.0.1:3306)/forest?charset=utf8")-etcd-dailtimeoutintetcddailtimeout(default5)-etcd-endpointsstringetcdendpoints(default"127.0.0.1:2379")-helpstringforesthelp-http-addressstringhttpaddress(default":2856")启动服务
nohupetcd>etcd.log2>&1&nohupforest>forest.log2>&1&appledeMacBook-Pro:forestapple$tail-500fforest.log{"time":"2019-07-25T15:05:40.041263+08:00","level":"-","prefix":"-","file":"node.go","line":"71","message":"thejobnode:192.168.10.35,successregisterto:/forest/server/node/192.168.10.35"}______/__/___//___/_//__/_\/_\/___/\__/_//_/\___/v3.3.10-devHighperformance,minimalistGowebframeworkhttps://echo.labstack.com____________________________________O/_______O\{"time":"2019-07-25T15:05:40.046041+08:00","level":"INFO","prefix":"-","file":"group.go","line":"92","message":"addanewgroup:account,forpath:/forest/server/group/account"}{"time":"2019-07-25T15:05:40.046172+08:00","level":"INFO","prefix":"-","file":"group.go","line":"92","message":"addanewgroup:order,forpath:/forest/server/group/order"}{"time":"2019-07-25T15:05:40.049989+08:00","level":"-","prefix":"-","file":"node.go","line":"210","message":"thejobnode:192.168.10.35,electsuccessto:/forest/server/elect/leader"}{"time":"2019-07-25T15:05:40.050021+08:00","level":"INFO","prefix":"-","file":"group.go","line":"92","message":"addanewgroup:trade,forpath:/forest/server/group/trade"}⇨httpserverstartedon[::]:2856交叉编译#macosGOOS=darwinGOARCH=amd64gobuildforest.go#linuxGOOS=linuxGOARCH=amd64gobuildforest.go#windowsGOOS=windowsGOARCH=amd64gobuildforest.go安装web分布式任务调度平台下载源码[duck](https://github.com/busgo/duck)gitclonehttps://github.com/busgo/duck.gitcdduck修改request.js文件中的地址npminstall启动服务#开发环境npmrundev#生产环境npmrun-scriptbuildEtcd元数据目录说明###选举目录>/forest/server/elect/leader是一个临时节点,用于任务调度节点选举,选举成功将节点的ip写入###调度节点注册目录>/forest/server/node/%s调度集群中的节点将自己的节点ip写入###任务集群>/forest/server/group/任务集群信息全放入此目录下###任务快照>/forest/client/snapshot/%s/%s/%s分配任务快照信息放入此目录下suchas/forest/client/snapshot/trade/192.168.1.1/201901011111111323###任务客户端信息>/forest/client/%s/clients/所有任务客户端注册此目录下suchas/forest/client/trade/clients/192.168.1.1###任务作业上报目录>/forest/client/execute/snapshot/%s/%s/suchas/forest/client/execute/snapshot/trade/192.168.1.1/201901011111111323 管理任务任务配置管理新建任务 任务集群任务执行计划 调度集群任务快照 任务客户端节点任务作业快照ClientLibrariesjforest forjava
gforest forgo
待完善1.~~任务故障转移~~
2.~~任务执行日志收集~~
3.任务作业sdk
4.~~手动执行任务~~
5.~~任务统计~~
6.任务报警
7.~~任务调度计划同步~~
评论