导读: 调度(Scheduling)在计算机领域是个庞大概念,CPU 调度、内存调度、进程调度等均可称之为调度。它是指在特定的时机分配合理的资源去处理预先肯定的任务,用于在适当的时机触发一个包含业务逻辑的应用。调度不管在单机仍是分布式环境中都是很重要的课题。在单机环境,调度与底层操做系统脱离不了干系;而在分布式环境中,调度直接决定运行集群的投入和产出。调度的两个核心要素是资源治理和触发时机。git
背景
ElasticJob 诞生于 2015 年,当时业界虽然有 QuartZ 等出类拔萃的定时任务框架,但缺少分布式方面的探索。分布式调度云平台产品的缺失,使得 ElasticJob 从出现伊始便备受关注。它有效的弥补了做业在分布式领域的短板,而且提供了一站式的自动化运维管控端。github
ElasticJob 在技术选型时,选择站在了巨人的肩膀上而不是重复制造轮子的理念,将定时任务事实标准的 QuartZ 与 分布式协调的利器 ZooKeeper 完美结合,快速而稳定的搭建了全新概念的分布式调度框架。web
ElasticJob 是什么?
ElasticJob 是一个分布式调度解决方案,由两个相互独立的子项目 ElasticJob Lite 和 ElasticJob Cloud 组成。ElasticJob Lite 定位为轻量级无中心化解决方案,使用 jar 的形式提供分布式任务的协调服务;ElasticJob Cloud 采用自研 Mesos Framework 的解决方案,额外提供资源治理、应用分发以及进程隔离等功能。它经过弹性调度、资源管控、以及做业治理的功能,打造一个适用于互联网场景的分布式调度解决方案,并经过开放的架构设计,提供多元化的做业生态。数据库
使用 ElasticJob 可以让开发工程师再也不担忧任务的线性吞吐量提高等非功能需求,使开发工程师可以更加专一于面向业务编码设计;同时,它可以解放运维工程师,使他们没必要再担忧任务的可用性和相关管理需求,只经过轻松的增长服务节点便可达到自动化运维的目的。apache
ElasticJob 调度模型
与大部分的做业平台不一样,ElasticJob 的调度模型划分为支持线程级别调度的进程内调度 ElasticJob Lite,和进程级别调度的 ElasticJob Cloud。后端
进程内调度
ElasticJob Lite 是面向进程内的线程级调度框架。经过 ElasticJob ,做业可以透明化的与业务应用系统相结合。它可以方便的与 Spring 、Dubbo 等 Java 框架配合使用,在做业中可自由使用 Spring 注入的 Bean,如数据源链接池、Dubbo 远程服务等,更加方便的贴合业务开发。服务器
ElasticJob Lite 与业务应用部署在一块儿,其生命周期与业务应用保持一致,是典型的嵌入式轻量级架构。ElasticJob Lite 很是适合于资源使用稳定、部署架构简单的普通 Java 应用,能够理解为 Java 开发框架。微信
ElasticJob Lite 自己是无中心化架构,无需独立的中心化调度节点,分布式下的每一个任务节点均是以自调度的方式适时的调度做业。任务之间只须要一个注册中心来对分布式场景下的任务状态进行协调便可,目前支持 ZooKeeper 和 ETCD 做为注册中心。架构
架构图以下:app

经过图中可看出,ElasticJob Lite 的分布式做业节点经过选举获取主节点,并经过主节点进行分片。分片完毕后,主节点与从节点并没有二致,均以自我调度的方式执行任务。
进程级调度
ElasticJob Cloud 拥有进程内调度和进程级别调度两种方式。因为 ElasticJob Cloud 可以对做业服务器的资源进行控制,所以其做业类型可划分为常驻任务和瞬时任务。常驻任务相似于 ElasticJob Lite,是进程内调度;瞬时任务则彻底不一样,它充分的利用了资源分配的削峰填谷能力,是进程级的调度,每次任务的会启动全新的进程处理。
ElasticJob Cloud 须要经过 Mesos 对资源进行控制,而且经过部署在 Mesos Master 的调度器进行任务和资源的分配。Cloud 采用中心化架构,将调度中心的高可用交由 Mesos 管理。
它的架构图以下:

经过图中可看出,ElasticJob Cloud 除了拥有 Lite 的所有能力以外,还拥有资源分配和任务分发的能力。它将做业的开发、打包、分发、调度、治理、分片等一些列的生命周期彻底托管,是真正的做业云调度系统。
相比于 ElasticJob Lite 的简单易用,ElasticJob Cloud 对 Mesos 的强依赖增长了系统部署的复杂度,所以更加适合大规模的做业系统。
ElasticJob 功能列表
ElasticJob 功能主要有弹性调度、资源分配、做业治理和可视化管控。
弹性调度
弹性调度是 ElasticJob 最重要的功能,也是这款产品名称的由来。它是一款可以让任务经过分片进行水平扩展的任务处理系统。
ElasticJob 中任务分片项的概念,使得任务能够在分布式的环境下运行,每台任务服务器只运行分配给该服务器的分片。随着服务器的增长或宕机,ElasticJob 会近乎实时的感知服务器数量的变动,从而从新为分布式的任务服务器分配更加合理的任务分片项,使得任务能够随着资源的增长而提高效率。
举例说明,若是做业分为 4 片,用两台服务器执行,则每一个服务器分到 2 片,以下图所示。

当新增长做业服务器时,ElasticJob 会经过注册中心的临时节点的变化感知到新服务器的存在,并在下次任务调度的时候从新分片,新的服务器会承载一部分做业分片,分片以下图所示。

看成业服务器在运行中宕机时,注册中心一样会经过临时节点感知,并将在下次运行时将分片转移至仍存活的服务器,以达到做业高可用的效果。本次因为服务器宕机而未执行完的做业,则能够经过失效转移的方式继续执行。做业高可用以下图所示:

资源分配
在导读中提到过,调度是指在适合的时间将适合的资源分配给任务,并使其生效。ElasticJob 具有资源分配的能力,它可以像分布式的操做系统同样调度任务。资源分配是借由 Mesos 实现的,由 Mesos 负责分配任务声明的所需资源(CPU 和内存),并将分配出去的资源进行隔离。ElasticJob 在获取到资源以后才会执行任务。
考虑到 Mesos 系统部署相对复杂,所以 ElasticJob 将这部分拆分至 ElasticJob cloud 部分,供高级用户使用。随着 Kubernetes 的强劲发展,ElasticJob 将来也会完成 cloud 部分与它的对接。
做业治理
做业在分布式场景下的高可用、失效转移、错过做业从新执行等行为的治理和协调。
可视化管控端
主要包括做业的增删改查管控端、执行历史记录查询、配置中心的管理等。
ElasticJob 典型应用场景
ElasticJob 着重解决与复杂任务、资源导向任务和业务应用任务这几个方面的问题。
复杂任务
数据迁移。若是将百亿的数据从一组数据库集群迁移至另外一组数据库集群,单线程的做业可能须要几天到几周不等。经过 ElasticJob 的弹性分片能力,能够大幅减小海量数据迁移所须要的时间。
资源导向任务
占用大量计算资源的报表做业。若是天天凌晨须要花费数小时计算 T+1 的业务报表,没有资源的管控,则不管报表做业是否启动,都要为其分配足够的资源。ElasticJob 将做业分为常驻做业和瞬时做业,对于报表类做业,瞬时做业是很是适合的。它可否在做业启动时获取资源,在做业结束后归还资源,作到真正的削峰填谷,更加合理的利用资源。
业务应用
订单拉取做业。订单系统大多采用消息中间件或做业的方式实现订单拉取,用于将订单生成系统和后端履约系统解耦,以便于先后端流量分离。采用做业实现的订单系统,能够经过 ElasticJob 实现订单相关业务逻辑,能够方便的利用外围系统所提供的依赖注入服务,无缝的融入业务端研发。
ElasticJob 新版本设计理念
通过了一个多月的开发,ElasticJob 社区近期计划发布 3.0.0-alpha,以做为它进入 Apache 软件基金会的第一个发布版本。它的主要功能包括:
做业生态圈
灵活定制化做业是 3.x 版本的最重要设计变革。新版本基于 Apache ShardingSphere 可插拔架构的设计理念,打造了全新做业 API。意在使开发者可以更加便捷且相互隔离的方式拓展做业类型,打造 ElasticJob 做业的生态圈。
ElasticJob 提供灵活的做业 API,它将做业解耦为做业接口和执行器接口。用户能够定制化全新的做业类型,诸如脚本执行、HTTP 服务执行、大数据类做业、文件类做业等。目前 ElasticJob 内置了脚本执行做业,而且彻底开放了扩展接口,开发者能够经过 SPI 的方式引入新的做业类型,而且能够便捷的回馈至社区。
多元化调度器
在保留原有的基于 cron 的时间触发调度器的基础上,增长了一次性的调度 API,为 ElasticJob 增长了时间维度以外的全新调度维度。
微内核 & 生态分离
抽象做业内核模块,将做业执行轨迹追踪等辅助功能以及做业生态等可扩展模块从内核模块彻底抽离。做业执行轨迹追踪模块做为二级生态,修改了以前只支持 MySQL 做为存储介质的限制,彻底开放持久化的适配。
将来规划
3.0.0 的版本做为一个快速给社区回馈的版本,并未进行颠覆性的革新,而是尝试将项目内核一点一滴的解耦。在将来的规划中,ElasticJob 将大刀阔斧的向前迈进,主要的规划以下。
做业依赖
支持基于有向无环图(DAG)的做业依赖。依赖包含基于做业总体维度的依赖,以及基于做业分片项的依赖,打造更加灵活的做业治理解决方案。
调度执行分离
将调度器和执行器彻底分离。调度器能够与执行器一块儿部署,即为 ElasticJob lite 的无中心化轻量级版本;调度器能够与执行器分离部署,即为 ElasticJob cloud 的资源管控的一站式分布式调度系统。
更加易用的云管产品
将目前仅支持 Mesos 的 ElasticJob cloud 打造为支持 Mesos 和 Kubernetes 的做业云管平台,并提供无 Mesos 和 Kubernetes 也可以独立使用的不包含资源管控的纯做业管控平台。
可插拔生态
与 Apache ShardingSphere 一脉相承,ElasticJob 也将提供更加可插拔和模块化架构,为开发者提供基础设施。开发者能够方便的基于 ElasticJob 二次开发,添加各类定制化功能,包括但不限于做业类型(如:大数据做业、HTTP 做业等)、注册中心类型(如:Eureka 等)、执行轨迹存储介质(如其余数据库类型)等。ElasticJob 的定位以下图所示。

关于 ElasticJob 社区
ElasticJob 社区的目标是成为和 Apache ShardingSphere 同样的 Apache 软件基金会的顶级项目,达成更普遍的应用。项目重启的这段时间,ElasticJob 持续在 GitHub 的周和月度排行榜上有名:


最近一个月,ElasticJob 社区合并了 152 个 Pull Requests,关闭了 105 个 Issues;25个提交者总共 158 次提交,完成了4w+ 行代码的改动。

基石已经搭建完成,欢迎开源爱好者加入 ElasticJob 社区的建设:
GitHub 地址:https://github.com/apache/shardingsphere-elasticjob-lite
官方网站:http://shardingsphere.apache.org/elasticjob/
来源:blog.csdn.net/KimmKing/article/details/107226571
本文分享自微信公众号 - 架构师智库(beijing-tmt)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。