文章目录
- 前言
- 一、工作流程:
-
- [1.1 elasticjob 轻量级无中心化介绍:](#1.1 elasticjob 轻量级无中心化介绍:)
- [1.2 elasticjob 工作流程:](#1.2 elasticjob 工作流程:)
-
- [1.2.1 初始化:](#1.2.1 初始化:)
- [1.2.2 注册:](#1.2.2 注册:)
- [1.2.3 运行:](#1.2.3 运行:)
- [1.2.4 zk 运行 时:](#1.2.4 zk 运行 时:)
- [1.2.5 job 执行:](#1.2.5 job 执行:)
- [1.3 elasticjob 高可用:](#1.3 elasticjob 高可用:)
- [二、elasticjob zk 选举:](#二、elasticjob zk 选举:)
-
- [2.1 elasticjob zk 选举过程:](#2.1 elasticjob zk 选举过程:)
- [2.2 elasticjob 主节点的作用:](#2.2 elasticjob 主节点的作用:)
- [三、elasticjob 分片:](#三、elasticjob 分片:)
-
- [3.1 分片理解:](#3.1 分片理解:)
- [3.2 分片项与业务处理解耦:](#3.2 分片项与业务处理解耦:)
- [3.3 分片参数:](#3.3 分片参数:)
- 总结
前言
本文对elasticjob 的工作流程介绍;
一、工作流程:
1.1 elasticjob 轻量级无中心化介绍:
ElasticJob 定位为轻量级无中心化解决方案,使用 jar 的形式提供分布式任务的协调服务。
-
app1,app2 表示不同的服务系统,每个系统都可以 引入elasticjob-lite-core jar 进行定时任务的执行
; -
elasticjob-lite-core 内部包括,
任务执行实例的注册,leader 的选举,任务的调度;在任务调度过程中可以将日志进行保存到 数据库中
; -
ELK 可以对保存到数据库中的日志进行分析
; -
Console 可以连接到数据读取日志,从而获取到任务执行的轨迹
;通过连接zk 可以知晓任务的运行状态,以及对任务的状态进行修改;
1.2 elasticjob 工作流程:
ElasticJob 的工作流程可以分为初始化、注册和运行三个主要步骤。以下是 ElasticJob 的工作流程详细步骤:
1.2.1 初始化:
- 定义任务:首先,需要定义要执行的任务逻辑,可以是数据处理、代码运行、脚本执行等。
- 配置任务:配置任务的执行策略、调度规则、分片等信息,可以使用注解或配置文件进行配置。
- 初始化作业:将任务配置信息注册到作业中心,作业中心会解析这些配置信息,并向 Zookeeper 注册任务信息。
1.2.2 注册:
- 作业注册中心:各作业节点将通过 Zookeeper 注册到作业注册中心,注册中心负责协调和管理各个作业节点。
- 注册作业:作业注册中心将根据配置信息注册任务,包括任务类型、分片信息、触发时间等。
1.2.3 运行:
- 调度触发:根据配置的触发规则和调度策略,作业注册中心会触发任务执行。
- 分片分配:作业节点接收到任务执行指令后,根据分片算法自动分配分片,并启动对应的作业实例。
- 任务执行:作业节点根据分配的分片,执行相应的任务逻辑,处理数据、执行代码等。
- 监控日志:作业节点会记录执行日志,并通过监控中心提供运行状态、执行结果等信息。
- 弹性扩缩容:根据负载情况,作业注册中心会动态调整作业分片的分配,实现弹性扩容和缩容。
1.2.4 zk 运行 时:
当任务启动后,会线连接zk;然后创建对应的zk 命名空间(如果命名空间不存在的话);创建任务节点;当任务需要被触发执行时,leader 节点会分配任务到哪些任务实例,然后任务实例接收任务并运行;
- my-job : elasticjob 注册zk 时的命名空间(永久节点);
- myjob-param: 改zk 命名空间下的 job 任务(永久节点);
- config: 注册任务的参数信息(包括任务名称,任务分片参数,任务触发的cron 等),以 YAML 格式存储;
- leader 节点: 作业服务器主节点信息,分为 election,sharding 和 failover 三个子节点。 分别用于主节点选举,分片和失效转移处理;只有主节点可以可以进行任务的分配;
- servers 节点: 作业服务器信息,子节点是作业服务器的 IP 地址。 可在 IP 地址节点写入 DISABLED 表示该服务器禁用。 在新的云原生架构下,servers 节点大幅弱化,仅包含控制服务器是否可以禁用这一功能。 为了更加纯粹的实现作业核心,servers 功能未来可能删除,控制服务器是否禁用的能力应该下放至自动化部署系统;
- instances 节点 :作业运行实例信息,子节点是当前作业运行实例的主键。 作业运行实例主键由作业运行服务器的 IP 地址和 PID 构成。 作业运行实例主键均为临时节点,当作业实例上线时注册,下线时自动清理。注册中心监控这些节点的变化来协调分布式作业的分片以及高可用。 可在作业运行实例节点写入 TRIGGER 表示该实例立即执行一次;
- sharding 节点 :作业分片信息,子节点是分片项序号,从零开始,至分片总数减一。 分片项序号的子节点存储详细信息。每个分片项下的子节点用于控制和记录分片运行状态;
1.2.5 job 执行:
在 ElasticJob 中,任务的触发执行过程主要包括以下详细流程:
-
触发条件满足:根据任务的触发规则(如定时触发、手动触发等),当触发条件满足时,主节点会向作业节点发送触发任务执行的指令。
-
任务分片分配:作业节点接收到触发指令后,根据分片算法将任务分配给各个作业实例执行。每个作业实例负责执行其中一个或多个分片的任务数据。
-
任务执行:作业实例在接收到分片后,开始执行具体的任务逻辑。任务逻辑可以是数据处理、代码执行、脚本执行等,根据任务的配置和处理逻辑进行具体的执行操作。
-
监控日志记录:作业实例在执行任务过程中会记录执行日志,包括任务的执行情况、运行状态、执行结果等信息。这些日志可以帮助监控中心跟踪任务的执行情况。
-
弹性扩缩容:在任务执行过程中,如果系统负载增加或减少,主节点会根据配置的策略动态调整任务分片的分配情况,实现任务的弹性扩容和缩容。
-
结果处理:任务执行完成后,作业实例会将执行结果上报给主节点,并根据结果进行相应的处理,如通知用户、触发后续操作等。
总体来说,ElasticJob 的任务触发执行流程非常灵活和可靠,能够根据配置的规则和策略准确地触发、分配和执行任务。
1.3 elasticjob 高可用:
当作业服务器在运行中宕机时,注册中心同样会通过临时节点感知,并将在下次运行时将分片转移至仍存活的服务器,以达到作业高可用的效果。 本次由于服务器宕机而未执行完的作业,则可以通过失效转移的方式继续执行。如下图所示
将分片总数设置为 1,并使用多于 1 台的服务器执行作业,作业将会以 1 主 n 从的方式执行。 一旦执行作业的服务器宕机,等待执行的服务器将会在下次作业启动时替补执行。开启失效转移功能效果更好,如果本次作业在执行过程中宕机,备机会立即替补执行。
二、elasticjob zk 选举:
2.1 elasticjob zk 选举过程:
每个Elastic-Job的任务执行实例作为ZooKeeper的客户端来操作ZooKeeper的znode
- 任意一个实例启动时首先创建一个 /server 的PERSISTENT节点;
- 多个实例同时创建 /server/eader EPHEMERAL子节点3)/server/leader子节点
- 只能创建一个,后创建的会失败。创建成功的实例被选为leader节点,用来执行任务
- 所有任务实例监听 /server/leader 的变化,一旦节点被删除,就重新进行选举,抢占式地创建 /server/leader节点,谁创建成功谁就是leader。
2.2 elasticjob 主节点的作用:
在 ElasticJob 中,主节点的作用主要包括以下几个方面:
-
协调任务调度:主节点负责协调任务的调度和执行,通过与 Zookeeper 交互实现任务的分配和调度。
-
分片调度:主节点会根据任务的配置信息和分片策略,将任务分配给不同的作业节点执行,确保任务能够顺利地分片执行。
-
监控和管理:主节点负责监控整个任务系统的运行状态,包括作业节点的健康状态、任务执行情况、运行日志等,并提供管理界面供用户查看和管理任务。
-
弹性扩缩容:主节点会根据任务的负载情况和配置的策略,动态调整任务的分片大小,实现任务的弹性扩容和缩容。
-
故障处理:主节点还负责处理作业节点的故障情况,例如重新分配故障节点上的任务分片,确保任务能够正常运行并保证数据处理的准确性。
三、elasticjob 分片:
3.1 分片理解:
作业分片是指任务的分布式执行,需要将一个任务拆分为多个独立的任务项,然后由分布式的应用实例分别执行某一个或几个分片项。
例如:Elastic-Job快速入门中文件备份的例子,现有2台服务器,每台服务器分别跑一个应用实例。为了快速的执行作业,那么可以将作业分成4片,每个应用实例个执行2片。作业遍历数据的逻辑应为:实例1查找text和image类型文件执行备份;
实例2查找radio和vedio类型文件执行备份。
如果由于服务器扩容应用实例数量增加为4,则作业遍历数据的逻辑应为:4个实例分别处理text、image、radio、video类型的文件。
可以看到,通过对任务合理的分片化,从而达到任务并行处理的效果,最大限度的提高执行作业的吞吐量。
3.2 分片项与业务处理解耦:
分片项与业务处理解耦:
Elastic-job并不直接提供数据处理的功能,框架只会将分片项分配至各个运行中的作业服务器,开发者需要自行处理分片项与真实数据的对应关系。
最大限度利用资源:
将分片项设置为大于服务器的数量,最好是大于服务器倍数的数量,作业将会合理的利用分布式资源,动态的分配分片项。
3.3 分片参数:
分片的数量大于机器的数量,这样多个分片的任务,被分配到某个服务器,在执行任务的时候,可以获取到该分片对应的分片参数,就可以利用多线程进行任务的执行;
可以通过 shardingItemParameters 设置分片参数格式:key=value:
java
shardingItemParameters("0=Beijing,1=Shanghai,2=Guangzhou")
任务执行端 通过 ShardingContext getShardingParameter 获取当前分片参数:
java
String shardingParameter= shardingContext.getShardingParameter();
总结
本文对elasticjob 的工作流程,zk 注册节点,elasticjob 的分片 进行介绍;