知识卡片

任务分片与弹性扩容缩容的重分片机制

结构图卡

内容

分布式任务调度要让一个定时任务能被多台服务器并行执行,核心机制是”任务分片”:把一个任务预先拆分成固定数量(如10个)的独立任务项,每台服务器负责执行其中的若干分片项,而不是简单地整体复制任务到每台机器上重复跑。分片数量本身是相对稳定的,真正动态变化的是”哪台服务器负责哪些分片项”这层映射关系——当集群中的服务器数量发生变化(新增或下线)时,Elastic-Job不会立刻打断当前正在执行的任务,而是保留本次执行不变,在下一次任务触发之前重新计算分片项到服务器的映射关系,让新的服务器数量尽量均分所有分片项。这个设计还兼顾了稳定性:只要服务器集合没有发生变化,即使触发重分片的检查,结果也不会有任何变动;即使真的发生了服务器波动,下一次分片结果也是根据服务器IP和作业名称的哈希值计算出来的确定性顺序,而不是随机打散,这样能尽量减少不必要的分片项迁移。这套”固定分片数+动态映射+滞后生效”的组合,本质上是把”任务如何被切分”和”切分后的任务项交给谁执行”两个问题彻底解耦——前者一旦确定基本不变,后者可以随集群规模弹性调整,从而在不重新设计任务本身的前提下,实现集群规模变化时的自动弹性伸缩。

结构图

flowchart TB
    subgraph 初始["初始状态:3台服务器,10个分片项"]
        S1["Server1: 0,1,2"]
        S2["Server2: 3,4,5"]
        S3["Server3: 6,7,8,9"]
    end
    subgraph 缩容["一台服务器崩溃后(下次任务触发前重分片)"]
        T1["Server1: 0,1,2,3,4"]
        T2["Server2: 5,6,7,8,9"]
    end
    subgraph 扩容["新增一台服务器后(下次任务触发前重分片)"]
        U1["Server1: 0,1"]
        U2["Server2: 2,3"]
        U3["Server3: 4,5,6"]
        U4["Server4: 7,8,9"]
    end
    初始 -->|"服务器下线\n本次执行不受影响\n下次触发前重分片"| 缩容
    初始 -->|"服务器上线\n本次执行不受影响\n下次触发前重分片"| 扩容

参考来源

- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.6 新一代分布式任务调度框架:当当Elastic-Job开源项目的10项特性"节,"2.6.4 Elastic-Job包含的功能"(源文件:_epub-src/OEBPS/Text/Chapter2_6_5.xhtml) - 结论依据:原文说明"任务的分布式执行,需要将一个任务拆分为n个独立的任务项……一旦有新的服务器加入集群,或现有服务器下线,Elastic-Job 将在保留本次任务执行不变的情况下,在下次任务开始前触发任务重分片",并给出3台服务器缩容为2台、扩容为4台的具体分片项分配示例,直接支撑本卡片结论与结构图。 - 原始内容:一旦有新的服务器加入集群,或现有服务器下线,Elastic-Job 将在保留本次任务执行不变的情况下,在下次任务开始前触发任务重分片。举例说明,有3台服务器,分为10个片……如果一台服务器崩溃,则分片项分配如下:{Server1:[0,1,2,3,4],Server2:[5,6,7,8,9]}。