调度(Scheduling)在计算机领域是一个庞大的概念。CPU调度、内存调度、进程调度等都可以称为调度。图片来自Pexels,指的是在特定的时间分配合理的资源来处理预定的任务,用于在合适的时间触发包含业务逻辑的应用程序。调度在单机和分布式环境中都是一个重要的话题。在单机环境下,调度离不开底层操作系统;而在分布式环境中,调度直接决定了正在运行的集群的输入输出。调度的两个核心要素是资源治理和触发时机。ElasticJob诞生于2015年,当时业界虽然有QuartZ等优秀的定时任务框架,但缺乏在分布式方面的探索。分布式调度云平台产品的缺位,使得ElasticJob自面世以来备受关注。有效弥补了分布式领域运维的不足,提供一站式的自动化运维管控终端。在选择技术时,ElasticJob选择站在巨人的肩膀上,而不是重复制造轮子的概念。它完美结合了定时任务的事实标准QuartZ和分布式协调的强大工具ZooKeeper,快速稳定地构建分布式新概念。调度框架。什么是ElasticJob?ElasticJob是一个分布式调度解决方案,由两个独立的子项目ElasticJobLite和ElasticJobCloud组成。ElasticJobLite定位为轻量级去中心化解决方案,以jar的形式为分布式任务提供协调服务。ElasticJobCloud采用自主研发的MesosFramework方案,提供资源管理、应用分发、进程隔离等附加功能。通过灵活调度、资源管控、作业治理等功能打造适合互联网场景的分布式调度解决方案,通过开放的架构设计提供多元化的作业生态。使用ElasticJob可以让开发工程师不再担心任务的线性吞吐量提升等非功能需求,让开发工程师可以更专注于面向业务的编码设计。同时可以解放运维工程师,让他们不用再担心任务的可用性和相关的管理需求,只需轻松添加服务节点就可以达到自动化运维的目的。ElasticJob调度模型与大多数作业平台不同。ElasticJob调度模型分为支持线程级调度的进程内调度ElasticJobLite和支持进程级调度的ElasticJobCloud。进程内调度ElasticJobLite是一个线程级的进程内调度框架。通过ElasticJob,作业可以与业务应用系统透明结合。可以方便地与Spring、Dubbo等Java框架结合使用。Spring注入的Bean可以在操作中自由使用,比如数据源连接池、Dubbo远程服务等,更方便业务开发。ElasticJobLite与业务应用一起部署,其生命周期与业务应用保持一致。是典型的嵌入式轻量级架构。ElasticJobLite非常适合资源使用稳定、部署架构简单的普通Java应用。可以理解为Java开发框架。ElasticJobLite本身具有去中心化架构,不需要独立的中心化调度节点。分布式环境中的每个任务节点以自调度的方式及时调度作业。任务之间只需要一个注册中心来协调分布式场景下的任务状态。目前支持ZooKeeper和ETCD作为注册中心。架构图如下:ElasticJob的产品定位及新版本设计理念从图中可以看出,ElasticJobLite的分布式作业节点通过选举获得主节点,并通过主节点进行分片。分片完成后,主节点和从节点没有区别,都是以自调度的方式执行任务。进程级调度ElasticJobCloud有进程内调度和进程级调度两种方式。由于ElasticJobCloud可以控制作业服务器的资源,因此其作业类型可以分为常驻任务和瞬态任务。常驻任务类似于ElasticJobLite,是进程内调度;临时任务完全不同。它们充分利用了资源分配的削峰填谷能力,是进程级的调度。每个任务都会启动一个新的进程进行处理。ElasticJobCloud需要通过Mesos来控制资源,通过部署在MesosMaster上的调度器来分配任务和资源。Cloud采用集中式架构,调度中心的高可用由Mesos管理。其架构图如下:ElasticJob产品定位及新版本设计理念从图中可以看出,ElasticJobCloud不仅具备Lite的所有能力,还具备分配资源和分发任务的能力。全面管理作业开发、打包、分发、调度、治理、分片等生命周期,是真正的作业云调度系统。与ElasticJobLite的易用性相比,ElasticJobCloud对Mesos的强烈依赖增加了系统部署的复杂性,因此更适合大型作业系统。ElasticJob功能列表ElasticJob功能主要包括弹性调度、资源分配、作业管理、可视化控制。ElasticSc??hedulingElasticSc??heduling是ElasticJob最重要的功能,也是产品名称的由来。它是一个任务处理系统,允许任务通过分片进行水平扩展。ElasticJob中任务分片项的概念使得任务可以在分布式环境中运行,每个任务服务器只运行分配给该服务器的分片。当服务器增加或减少时,ElasticJob会近乎实时地感知服务器数量的变化,从而为分布式任务服务器重新分配更合理的任务分片项,使任务随着资源的增加而提高效率。比如job被分成4块,由两台server执行,那么每台server会被分成2块,如下图:会通过注册中心临时节点的变化感知到新服务器的存在,并在调度下一个任务时重新分片,新服务器将托管部分作业分片。分片如下图所示:ElasticJob产品定位及新版本设计理念当作业服务器在运行过程中宕机时,注册中心也会通过临时节点感知到,并将分片转移到存活服务器上接下来运行,以达到作业高可用的效果。本次因服务器宕机而未执行的作业可以通过failover继续执行。作业的高可用如下图:ElasticJob的产品定位和新版本设计理念。介绍中提到了资源分配。调度是指在合适的时间为任务分配合适的资源,并使之生效。ElasticJob具有分配资源的能力,它可以像分布式操作系统一样调度任务。资源分配由Mesos实现,Mesos负责分配任务声明的所需资源(CPU和内存),并对分配的资源进行隔离。ElasticJob会在获取到资源后执行任务。考虑到Mesos系统的部署比较复杂,ElasticJob将这部分拆分为ElasticJobCloud部分供高级用户使用。随着Kubernetes的强势发展,ElasticJob未来也将完成Cloud部分与其的对接。作业管理管理和协调分布式场景中丢失的作业的高可用性、故障转移和重新执行。可视化管控终端主要包括作业增删改查、执行历史记录查询、配置中心管理等管控终端。ElasticJob典型应用场景ElasticJob主要解决复杂任务、面向资源的任务和业务应用任务。复杂任务数据迁移:如果将数百亿数据从一组数据库集群迁移到另一组数据库集群,单线程作业可能需要几天到几周的时间。ElasticJob的弹性分片能力可以大大减少海量数据迁移所需的时间。面向资源的任务报告占用大量计算资源的作业。如果每天早上计算T+1业务报表需要几个小时,没有资源控制,那么无论是否启动报表作业,都必须分配足够的资源。ElasticJob将作业分为常驻作业和瞬态作业。对于报告作业,瞬态作业非常适合。能否在作业开始时获取资源,作业结束后归还资源,真正做到削峰填谷,更合理地使用资源。业务应用拉单操作:大部分订单系统使用消息中间件或作业拉单,用于将订单生成系统与后端执行系统解耦,方便前后端流量分离.Jobs实现的订单系统可以通过ElasticJob实现订单相关的业务逻辑,并且可以方便的使用外围系统提供的依赖注入服务无缝集成到业务端的研发中。新版ElasticJob的设计理念已经开发了一个多月,ElasticJob社区计划在不久的将来发布3.0.0-alpha作为其进入ApacheSoftwareFoundation的第一个版本。其主要功能包括:作业生态系统中灵活和可定制的作业是3.x版本中最重要的设计变化。新版本基于ApacheShardingSphere可插拔架构的设计理念,打造了全新的作业API。旨在让开发者能够更方便、更隔离地扩展作业类型,打造ElasticJob作业生态。ElasticJob提供灵活的作业API,将作业分离为作业接口和执行程序接口。用户可以自定义新的作业类型,如脚本执行、HTTP服务执行、大数据作业、文件作业等。目前ElasticJob已经内置了脚本执行作业,并全面开放了扩展接口。开发者可以通过SPI引入新的工作类型,也可以方便的回馈社区。多样化的调度器在保留原有的基于Cron的时间触发调度器的基础上,增加了一次性调度API,为ElasticJob增加了时间维度以外的新的调度维度。微内核&生态分离抽象的作业内核模块将作业执行轨迹跟踪等辅助功能和作业生态等可扩展模块从内核模块中完全分离出来。作业执行轨迹跟踪模块作为二级生态,修改了以往仅支持MySQL作为存储介质的限制,全面开放持久化适配。未来规划版本3.0.0是一个快速回馈社区的版本。它不进行颠覆性创新,而是试图一点一点地解耦项目的核心。在未来的规划中,ElasticJob将大步向前。主要规划如下:作业依赖支持基于有向无环图(DirectedAcyclicGraph,DAG)的作业依赖。依赖包括基于作业整体维度的依赖和基于作业切片项的依赖,以创建更灵活的作业治理方案。调度执行分离,将调度器和执行器完全分离。scheduler可以和executor一起部署,是ElasticJobLite的去中心化轻量级版本;scheduler可以和executor分开部署,是ElasticJobCloud资源管控的一站式分布式调度系统。更简单易用的云管理产品,将目前只支持Mesos的ElasticJob云,变成了支持Mesos和Kubernetes的作业云管理平台,提供了一个可以脱离Mesos和Kubernetes独立使用的纯作业管控平台,不包括资源管理和控制。可插拔生态与ApacheShardingSphere接轨,ElasticJob也会提供更可插拔和模块化的架构,为开发者提供基础设施。开发者可以轻松添加基于ElasticJob二次开发的各种自定义功能,包括但不限于作业类型(如:大数据作业、HTTP作业等)、注册中心类型(如:Eureka等)、执行轨迹存储媒体(例如其他数据库类型)等ElasticJob的定位如下图所示:ElasticJob产品定位及新版本设计理念关于ElasticJob社区ElasticJob社区的目标是像ApacheShardingSphere一样成为Apache软件基金会的顶级项目,实现更广泛的应用。在项目重启期间,ElasticJob在GitHub的周榜和月榜上持续名扬四海:上个月,ElasticJob社区合并了152个PullRequests,关闭了105个Issues;25位提交者一共提交了158次,完成了4w+行代码修改。基石已经建成,欢迎开源爱好者加入ElasticJob社区建设。GitHub地址:https://github.com/apache/shardingsphere-elasticjob-lite官网:http://shardingsphere.apache.org/elasticjob/作者:张亮简介:京东数科数据研发负责人,创始人ApacheShardingSphere人员和项目副总裁,ElasticJob创始人。热爱开源,主导开源项目ShardingSphere(原名Sharding-JDBC)和Elastic-Job。擅长基于Java的分布式架构,推崇优雅的代码,对如何编写富有表现力的代码有大量研究。目前主要精力投入将ApacheShardingSphere打造成业界一流的金融级数据解决方案。ApacheShardingSphere是Apache软件基金会的顶级项目,也是Apache软件基金会的第一个分布式数据库中间件。编辑:陶家龙
