阿里云国际站的抢占式实例(Spot Instance)是处理批处理任务的理想选择,因为它可以提供高达90%的成本节省,同时具备与常规按量付费实例相同的计算性能。
但由于抢占式实例存在被回收的风险,您需要精心设计您的批处理架构,使其具有高容错性和弹性。
批处理任务的抢占式实例应用策略
利用抢占式实例处理批处理任务的核心策略是容错设计和弹性调度。
1. 架构设计:确保任务可中断和恢复
批处理任务必须是无状态 (Stateless) 或具有容错能力 (Fault-Tolerant) 的,才能适应实例被回收的情况。
| 核心组件 | 推荐方案 | 目的 |
| 任务调度器 | Batch Compute (批量计算) 或 容器服务 (ACK/Kubernetes) | 自动调度任务,并在实例被回收时自动重试或重新分配未完成的任务。 |
| 任务数据 | 阿里云对象存储 (OSS) 或 文件存储 (NAS) | 绝对不能将任务数据存储在抢占式实例的本地系统盘上。数据必须独立于计算实例,确保实例回收时数据安全。 |
| 进度/状态 | Redis 或 表格存储 (Tablestore) | 记录任务的执行状态、已完成的步骤、检查点(Checkpoint)等,用于在实例重启时从中断处恢复。 |
2. 实例配置
A. 合理出价策略
(1)自动出价(推荐): 价格上限设定为按量付费价格。实例将跟随实时市场价格波动,保证在有库存时以低价运行。
(2)设置上限价: 您可以设置一个高出价。如果实时市场价格高于您的出价,实例会被回收。建议使用抢占式实例 Advisor 工具查询历史价格和释放率,以制定合理的出价。
B. 利用保护期
(1)设定实例使用 1 小时(默认): 实例在创建后 1 小时内有保护期,不会因价格或库存波动被回收。这适用于对短期稳定性有要求的批处理任务。
(2)无确定使用时长: 价格更优惠(约再优惠 10%),但实例随时可能被回收。适用于极短的、可快速完成的小任务。
C. 选择实例规格
多规格混合部署: 在创建实例池时,指定多种实例规格(例如,C7、G7 等)。如果某一规格库存不足或价格过高,系统会自动尝试购买其他规格的抢占式实例,提高扩容成功率。
3. 弹性伸缩和故障处理
处理抢占式实例中断的关键是快速响应和容量补充。
(1)使用伸缩组 (Auto Scaling): 将抢占式实例作为伸缩组的一部分。伸缩组可以监控容量,并在实例被回收导致容量下降时,自动触发新的抢占式实例购买。
(2)混合实例池: 在伸缩组中,设置一个最小比例的按量付费实例(例如占总容量的 10%)。这样可以确保集群中始终有一定数量的稳定资源来处理最关键的任务,防止抢占式实例全部被回收导致任务完全停滞。
(3)感知中断事件: 阿里云会在实例被回收前约 5 分钟发送系统事件通知。您的批处理应用应订阅并监听这些事件。
在收到通知后,立即执行优雅停机:保存当前任务的检查点,将未完成的工作重新排队或交由其他稳定实例接管。
总结:批处理的生命周期
(1)任务提交: 任务被分割成小的、可并行、可恢复的子任务,并提交到调度队列。
(2)抢占式实例启动: 调度器(如 Batch Compute)根据任务负载,通过伸缩组快速拉起大量抢占式 ECS 实例。
(3)运行与中断:
① 正常运行: 实例从 OSS 读取数据,执行计算,将中间结果和检查点写回 OSS/Redis。
② 中断发生: 实例在收到回收通知后,快速保存当前进度,然后被释放。
(4)自动恢复: 伸缩组检测到容量不足,自动拉起新的抢占式实例。新实例启动后,从 OSS/Redis 中读取上次的检查点,从中断处恢复执行,直到所有子任务完成。
通过这种方式,您可以大幅降低批处理任务的计算成本,同时维持业务的高吞吐量和容错性。
