Bootstrap

分布式调度引擎elastic-job3源码分析(一) 概述

vip

vip

1.   背景

调度引擎是关键的基础设施,不但是定时执行任务,更是大规模分布式任务引擎,分布式并行处理平台,管理计算节点集群,提供高吞吐的可伸缩的数据处理能力。

公司日益增长的业务,对调度引擎高吞吐,高并发的要求也快速增长,需构建一个无中心,管理大集群,健壮分片容错的任务调度任务平台,支撑业务发展。

同时,分布式调度引擎也是datax,可观测-性能指标组件(sentinel dashboard)分布式改造的核心技术

2.   参考

https://blog.csdn.net/X5fnncxzq4/article/details/86770194

https://www.jianshu.com/nb/18843035

3.   术语

无中心/有中心分布式 有中心分布式设置中心节点负责集群协调和元数据保存等工作,例如xxl-job的admin/executor, dolphin-scheduler master-worker都是有中心分布式设计;真正无中心设计很少,大部分是节点平等,都可以通过选举成为主节点,也就是,任何一个节点都可以成为中心

脑裂 无中心分布式设计,当网络出现问题,节点分割成多个集群,集群间因不能通讯而不能达到状态一致,通常解决方案是集群节点数奇数,节点数少于总数的集群中一半停止工作

分片/容错 分片是调度平台很重要的特性,调度处理大规模数据,需要分片执行,分片执行带来新的问题,分片失败,平台回收分片,转移到其他节点执行

4.   整体架构

lite-job

-         bootstrap 作业api启动

-         spring 启动

-         作业管理 console/api管理作业

-         核心服务

生态(eco)  用户可扩展或很可能需自定义的组件,包括作业事件跟踪,目前实现数据库存储;异常处理,目前支持,钉钉,微信,邮件;执行器

基础组件(infra)  服务注册中心,基于zookeeper

5. 核心服务

核心服务比较多,大致分为以下几类

Ø  作业类服务

调度服务/trigger服务/配置服务/设置服务/分片服务

Ø  分布式类服务

选主服务/失效转移/运行实例服务/server节点服务/诊断服务/ znode存储服务/监听服务

Ø  监控类服务

快照服务

代码特色:

Ø  门面类façade  以Facade结尾,聚合服务类,为使用者提供统一的调用入口

Ø  服务类 service,核心服务的逻辑

Ø  znode类 node/path,Node/Path结尾,封装zk节点管理

Ø  监听管理器类/监听器类 核心服务大多使用监听服务监听zk变化实现分布式协调

6.   分析概览

列出分析要点

6.1 作业和执行器

分析作业和执行器设计

6.2 作业注册和调度

spring boot starter,即时(一次)作业, 定时作业

6.3 作业分片执行

作业调起和分片执行

6.4 核心服务

设置服务(setup),znode存储(storage) ,监听服务(listener),调度服务(schedule),

选主服务(election),分片服务(sharding),配置服务(config),失效转移(failover),

快照服务(snapshot),服务实例(server),运行实例(instance),诊断服务(reconcile),保障服务(guarantee)

其中,调度服务不单独分析,放到作业注册,作业执行一起分析

6.5 基础

执行器(executor)

6.6 生态

注册中心(regcenter)

作业配置注册,作业注册,服务节点注册,作业实例注册,分片注册,分片分配注册

*生态还包括事件追踪(tracing), 错误处理(微信,钉钉,邮件,短信。。。),这两块本文不分析

7 问题和规划

elastic-job3问题及规划

7.1 网格分片

elastic-job实现的是纵向分片,相当于数据hash分片,这样的粒度是不够的,需要增加横向的切分,即分页,这样每个分片规模可预期,同时增加并行度

7.2 逻辑分片

分片藏在分片算法,不需预先配置分片,按需生成,减少分片配置项长度,支持动态分片

7.3 动态分片

elastic-job是静态分片,存在2个问题

1.       数据倾斜,即,部分作业数据少,早完成;另一些任务还有大量数据未完成

2.       分片很多,配置相当长

动态分片实例节点按需领取,配合逻辑分片,最大化利用计算资源

7.4 动态作业

动态增删作业,新增作业有两种情况,新增新类型的作业,新增已有类型作业的实例

elastic-job无中心分布式架构,没有提供动态增加作业(实例)的api,新增新类型的作业需新的作业实例,新增已有类型实例可以通过修改分片和参数间接实现

7.5 监控快照

快照服务改造,接入Prometheus exporter,增加作业状态,数据处理量等