1. 背景
调度引擎是关键的基础设施,不但是定时执行任务,更是大规模分布式任务引擎,分布式并行处理平台,管理计算节点集群,提供高吞吐的可伸缩的数据处理能力。
公司日益增长的业务,对调度引擎高吞吐,高并发的要求也快速增长,需构建一个无中心,管理大集群,健壮分片容错的任务调度任务平台,支撑业务发展。
同时,分布式调度引擎也是datax,可观测-性能指标组件(sentinel dashboard)分布式改造的核心技术
2. 参考
芋道源码 https://blog.youkuaiyun.com/X5fnncxzq4/article/details/86770194
https://www.jianshu.com/nb/18843035
3. 术语
无中心/有中心分布式 有中心分布式设置中心节点负责集群协调和元数据保存等工作,例如xxl-job的admin/executor, dolphin-scheduler master-worker都是有中心分布式设计;真正无中心设计很少,大部分是节点平等,都可以通过选举成为主节点,也就是,任何一个节点都可以成为中心
脑裂 无中心分布式设计,当网络出现问题,节点分割成多个集群,集群间因不能通讯而不能达到状态一致,通常解决方案是集群节点数奇数,节点数少于总数的集群中一半停止工作
分片/容错 分片是调度平台很重要的特性,调度处理大规模数据,需要分片执行,分片执行带来新的问题,分片失败,平台回收分片,转移到其他节点执行
4. 详细分析
服务可分为功能服务和核心服务,其中核心服务支撑功能服务的服务,功能任务有任务注册,任务执行,失效转移等,是调度平台的”业务”
4.1 核心服务
4.1.1 选主服务(election)
每个作业选主节点,主节点是作业的主节点,执行需要主节点执行的服务,如,失效转移,分片
LeaderLatch JobNodeStorage的”应用”选主服务,使用curator的leaderLatch完成
两个节点用于选主,/election/latch, /failover/latch
LeaderElectionExecutionCallback 选主后的回调
选举完了,备选leader写入自身instanceId到/instance
LeaderElectionJobListener 选主触发监听器
LeaderAbdicationJobListener 自身disabled,退位
- 谁使用:
- 分片服务 设置分片标记
- 失效转移 抓取分片
- 依赖服务:
- znode存储服务/注册中心 znode节点存取,监听器注册
- 监听服务
4.1.2 配置服务(config)
ConfigurationService设置/载入作业配置
监听作业配置的cron表达式变化,修改作业调度时间
config 作业的配置以json格式存入
- 谁使用:
- 设置服务 写入作业配置
- 依赖服务:
- 调度服务 修改作业触发时间
4.1.3 设置服务(setup)
设置服务初始化其他核心服务
- 谁使用:
- 调度服务 初始化作业
- 监听服务 开启监听器
- 选主服务 作业初始发动选主
- 服务实例服务 写入所在服务Ip到zk
- 运行实例服务 写入instanceId到zk
- 诊断服务 开启诊断服务
- 依赖服务:
- 配置服务 写入作业配置到zk
4.1.4 服务节点服务(server)
注册/查询作业的服务节点和实例
server znode是持久节点写入的,值是”Enabled”或者”Disabled”
4.1.5 实例服务(instance)
注册查询作业运行实例,触发实例执行
InstanceShutdownStatusJobListener 运行实例下线, 判断是否自身,若是关闭作业
关联的监听器:
ListenServersChangedJobListener 主节点感知server或instance变化,设置重分片标记
RegistryCenterConnectionStateListener实例下线后重新上线,该监听器重新注册server,instance;resume作业
PersistOneline运行实例启动写入JobInstanceId,如192.168.1.101@-@313516,313516 是jvm 名称
4.1.6 诊断服务(reconcile)
符合以下3个条件设置分片标记, 下次作业启动触发重新分片
- 分片标志没有设定
- 有不在线的服务分配了分片
- 不是静态分片&&没有分片信息
- 谁使用:
- 设置服务 设置服务启动诊断服务
- 依赖服务:
- 配置服务 获取定时执行时间间隔
- 分片服务 设置重新分配标记
4.1.7 触发服务(trigger)
触发服务支持手动(控制台/api)触发作业执行
InstanceService 读取”instances”节点,获取在线的instanceId集合,写入”triggers”
JobTriggerStatusJobListener 监听trigger节点变更,检查变更是否自身instanceId,触发作业
*设计上有违面向对象原则,Instance服务打破trigger服务封装
*触发所有在线实例,只需在线实例监控”triggers”节点便可,无需写入每个实例节点
- 谁使用:
- 控制台/api
- 依赖服务:
- 运行实例服务 获取在线运行实例
- 调度服务 触发作业执行
快照服务(snapshot)
快照服务放在核心服务,但可以看作功能服务,独立启动和运行