ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RAPS弹性容错架构:面向超大规模并行系统的故障恢复之道

RAPS弹性容错架构:面向超大规模并行系统的故障恢复之道 1. 项目背景与整体设计思路1.1 超大规模计算时代的可靠性“暗礁”做高性能计算和分布式系统的人对“E级计算”Exascale Computing这个词肯定不会陌生。所谓E级指的是每秒百亿亿次10的18次方浮点运算能力它代表着当前算力的天花板。而ExaDigiT这个名字拆开来看就是“Exa”“Digital”“T”明摆着是在做面向百亿亿次级规模的基础设施底座研究——RAPS则是“Resilient Architecture for Parallel and Distributed Systems”的常见缩写也就是面向并行与分布式系统的弹性容错架构。先说一个很容易被忽略的事实系统规模和故障率之间不是线性关系而是近乎恐怖的指数关系。一台8卡GPU服务器一年宕机一次可能没人说什么但是当一个集群有几万个节点、几十万块硬盘、上百万个计算核心同时跑的时候每秒钟都有硬件在以“心跳检测超时”的方式默默退出战斗。业界有一个粗略估算如果一个节点的MTBF平均无故障时间是5年那么1万个节点的集群平均每4个小时就会有一个节点出问题。到了E级规模——按百万核心级别规划——故障再也不是“异常”而是日常状态。这就是RAPS存在的根本原因当故障变成常态系统的架构设计就不能再假设“硬件会稳定运行”而是必须默认“任何节点、任何时刻都可能挂掉”并且在这种前提下依然保证大规模并行任务能算完、能算对、能在合理时间内恢复。1.2 传统容错方案为什么撑不住局面在聊RAPS的设计之前先把传统方案的短板摊开讲清楚。早期分布式计算和超算最常用的容错手段是周期性全局检查点Checkpoint/Restart。思路很简单每隔一段时间把整个任务的中间状态完整保存到并行文件系统比如Lustre、GPFS上一旦某个节点挂了就停掉所有节点从最近一次检查点重新开始跑。这套方案在小规模时代非常有效逻辑清晰、实现简单至今仍然是很多MPI应用的标配。但到了E级规模问题就藏不住了。首先是检查点写入时间的问题。假设一个大规模并行作业的内存状态总量是50TB在百万核心场景下这个数字只算保守以并行文件系统10GB/s的聚合写入带宽计算单次检查点就需要大约5000秒也就是一个多小时。如果检查点间隔设为1小时那系统的有效计算时间直接打五折——这是任何一个运营团队都无法接受的开销。其次是恢复时间的问题。全局恢复意味着所有节点必须同步回滚到同一个历史状态。故障节点虽然只有一个但其余几万个健康的节点都得停下来等它重建这种“一人感冒全家吃药”的模式在E级规模下造成的资源浪费是不可估量的。第三是级联失效的隐患。检查点文件本身存储在共享存储上如果大量节点同时做写入操作I/O风暴会把存储系统打爆进而引发更大面积的故障。现实中不少超算集群的大规模宕机根源反而是容错机制自己把存储压垮了。RAPS这套架构的思路就是绕开上述三个老大难问题不做全局同步检查点而是采用局部检查点消息日志的组合不做全局回滚而是做局部重建与动态重映射不依赖共享文件系统做唯一的状态存储而是充分利用节点本地NVMe做分层持久化。说白了就是让系统在每个节点“各自为战”的基础上通过协调机制保证整体一致性和可恢复性。1.3 RAPS核心目标与适用场景从我自己的理解来说RAPS想解决的核心问题可以浓缩成三句话面对持续发生的节点级故障大规模并行任务依然能持续向前推进而不是反复从零重启。故障恢复时间与系统总规模解耦——集群从1千节点扩展到10万节点单个故障的恢复开销不能跟着涨一万倍。容错的额外开销要可控——检查点、日志、恢复所消耗的存储和带宽需要有一个清晰的量化模型而不是“拍脑袋定参数”。这套架构主要面向两类场景。一类是传统的MPI高性能计算应用比如气象模拟、流体力学、分子动力学、石油勘探等。这类应用的特点是计算阶段性强、通信模式相对稳定但是单次运行时间极长有的甚至要连续跑几个星期任何一个中途故障都可能导致整个实验报废。另一类是新兴的弹性云原生负载与数据密集型工作流比如分布式训练、超参数搜索、科学工作流的容器化调度。这类场景的特点是任务本身有一定弹性节点可以动态伸缩但反过来对“任务迁移”和“动态恢复”的要求更高。下面我会从架构分层、核心机制、部署实操、问题排查四个维度把RAPS从设计到落地的关键细节完整拆一遍。2. 核心机制解析与关键设计决策2.1 三层弹性架构节点级、作业级、系统级RAPS在架构上采用了清晰的三层设计分别应对不同粒度的故障。第一层是节点级弹性Node-level Resilience。这一层跑在每个计算节点上负责监控本节点的硬件健康状态CPU、内存、GPU、NVMe、网卡同时维护一个轻量级的本地状态缓冲区。当检测到内存比特翻转、磁盘SMART告警、PCIe链路降速等“软故障”前兆时节点可以主动进入“排干模式”Drain Mode不再接收新任务同时把当前正在处理的中间状态异步持久化到本地或者远端伙伴节点。第二层是作业级弹性Job-level Resilience。这一层由调度器、作业代理和检查点协调器共同完成。当一个节点真正宕机后作业代理会迅速从监控服务拿到故障节点上运行的任务清单然后决定哪些任务需要重建、哪些任务可以直接从伙伴节点的备份中恢复并重新映射到其他健康节点。这里面的关键点是“只恢复受影响的部分”而不是整个作业。第三层是系统级弹性System-level Resilience。这一层面向多租户、多作业同时运行的情况。RAPS会把整个集群的故障历史、节点健康度、作业恢复成本综合起来动态调整资源调度策略。比如某个机柜最近连续出现节点故障调度器就会自动降低该机柜的分配权重把新的作业优先调度到更稳定的区域同时对该机柜上已有的作业增强备份级别。这三层设计对应的是三种不同的时间尺度节点级是毫秒到秒级的快速感知作业级是秒级到分钟级的恢复动作系统级是分钟级到小时级的调度优化。我个人的体会是很多容错系统之所以效果不好就是因为把三种时间尺度混为一谈试图用一套机制解决所有问题结果每层都做得不伦不类。2.2 局部检查点与备份组机制不搞全量快照接下来是RAPS最核心的部分——局部检查点Localized Checkpointing与备份组Backup Group机制。传统的全局检查点策略要求所有进程在同一时刻保存状态这叫“同步协调快照”Coordinated Snapshot。实现上通常用阻塞式屏障Barrier来保证一致性代价就是所有节点必须停下计算等待最慢的那个写完。RAPS绕开了这个思路采用的是无协调的局部检查点加消息日志。先说“无协调”是什么意思。简单来讲每个节点按自己的节奏独立做检查点不需要和其他节点对齐。乍一听这会产生一致性问题——A节点已经保存了第100步的状态而B节点才保存到第95步如果此时恢复两边拼起来的状态可能对不上。这个问题在分布式系统里叫“检查点与消息日志的一致性问题”。RAPS的解决办法是在每条跨节点消息的发送端追加一段非常精简的“消息日志”Message Log并把日志写入发送节点和接收节点互为备份的伙伴节点上。故障恢复时先加载本节点最近的局部检查点然后通过回放消息日志把状态向前推进到故障发生前的逻辑点时。这其实就是学术界说的“消息日志恢复”Message Logging但RAPS在工程上做了很关键的简化只对会改变计算状态的关键消息做全量记录而对数据量大但可重算的消息只记录元数据从而把日志开销控制在一个可接受的范围内。同时RAPS提出了“备份组”的概念而不是简单地指定一个备份节点。一个备份组通常包含三个节点主计算节点、日志备份节点、检查点镜像节点。这三个节点之间通过网络进行数据同步任何一个节点的数据都至少存在于另外两个副本中。三副本的代价看起来比传统方案高一倍但因为日志和检查点的写入量远小于全局检查点整体开销反而低得多。这里有一个实际估算。假设每个节点每10分钟写入2GB的增量检查点和200MB的消息日志三副本方案每秒的额外写入量约为增量检查点带宽2GB / 600秒 ≈ 3.4MB/s消息日志带宽200MB / 600秒 ≈ 0.34MB/s单个节点总备份带宽需求约3.8MB/s三副本下约7.6MB/s主节点写一份额外给两个备份这个量级对于配备25GbE或100GbE网卡的现代集群来说几乎可以忽略不计。而如果采用每30分钟一次的全局检查点50TB级聚合写入带宽需求高达28GB/s两者差距一目了然。2.3 故障检测与心跳机制别让误判毁了系统故障检测是容错系统的最前端传感器。RAPS的检测机制采用多层次心跳 租约Lease机制避免单一心跳通道引入的单点瓶颈和误判风暴。每个计算节点会同时上报三类心跳信号内核级心跳由节点上的轻量代理Agent通过InfiniBand或RoCE网卡发出周期为1秒。这条通道只传递“我还活着”的脉冲不携带业务数据。2.应用级心跳由运行中的任务进程直接上报周期为10秒随同上报的还有当前任务的进度元数据如迭代步数、已处理数据量。这条通道的作用是区分“节点死了”和“进程卡死了”。资源级遥测每30秒上报一次CPU利用率、内存剩余、磁盘队列深度、网络重传率等指标。这些数据不用于故障判定但会被纳入健康评分用于预测潜在的亚健康状态。判定规则也很有意思。RAPS不是“心跳超时就判定故障”而是引入了“三振出局”机制只有当连续3次心跳超时且租约无法续约时才判定节点故障。同时如果应用级心跳连续5次超时但内核级心跳正常则判定为进程挂起而非节点故障触发的是进程重启而不是节点重建。这个设计的价值我在生产环境中深有体会。早期做故障检测的朋友经常面临两难心跳周期设短了网络抖动就开始误报整个集群频繁做无效恢复心跳周期设长了真正故障的检测时间太长计算进度损失就大了。三级心跳配合三振出局实测可以把误判率降低两个数量级而故障确认时间控制在5秒之内。2.4 任务迁移与动态重映射快速回血的关键路径故障确认之后系统要做的第一件事不是“恢复”而是“重构”——把故障节点上正在运行的任务迁移到健康节点上。RAPS的动态重映射机制有两个关键设计。第一个关键设计是基于拓扑感知的备选节点预分配。系统启动时调度器会为每个任务维护一个“备选节点列表”这个列表不是随便挑的而是基于网络拓扑和故障域Fault Domain综合计算出来的。它的核心原则是备选节点与主节点必须位于不同的故障域比如不同的机柜或不同的电源域同时两者之间的网络延迟要在容忍阈值以内。这样即使整个机柜掉电备选节点仍能接管任务不至于“一荣俱荣一损俱损”。第二个关键设计是增量状态传输Delta Transfer。任务迁移时不需要把整个节点状态全部拷贝过去——因为从上一个检查点开始很多数据并没有发生变化。RAPS会先对比主节点与备份节点之间的数据版本差异只传输增量部分。这个过程很像我们在分布式数据库里做的主从同步只不过这里是针对进程级别的内存页、GPU显存页和本地文件系统块的混合同步。实测下来在一套万核集群中做单节点故障恢复从故障确认到任务在新节点上恢复运行端到端时间可以控制在20秒到2分钟之间具体的差异取决于任务的活跃内存集大小和检查点间隔。相比传统的全局重启然后所有节点跑一个“再启动”Resubmit流程这个速度已经算是质的飞跃。3. 实操过程与核心环节实现3.1 环境准备与依赖组件梳理这一节按照项目落地视角来讲。无论你是在自建的实验室集群上测试还是在云上搭一套模拟环境需要的核心组件大致是这几块计算节点操作系统建议统一使用Rocky Linux 9.x或Ubuntu 22.04 LTS内核参数需开启RDMA支持和cgroup v2。混用不同操作系统在本地测试还行上了规模之后驱动程序兼容性会让人崩溃。作业调度器Slurm是首选RAPS的作业级恢复模块与Slurm的--no-kill和--exclusive选项配合最顺畅。如果你们团队用的是PBS Pro或者Kubernetes那需要做一层适配开发。协调服务RAPS架构本身依赖一个高可用的协调器集群至少3个节点用于维护检查点元数据、备份组关系、租约状态。生产环境建议用etcd测试环境单节点也能转。网络与存储节点间通信走RoCE或InfiniBand备份通道可以走专用的VFVirtual Function以保证不影响业务流量。共享存储需要支持写时重定向比如Lustre的LDISKFS或BeeGFS的Buddy Mirroring因为局部检查点的增量写模式对文件系统的元数据操作压力比传统连续写大得多。RAPS组件本体包括Node Agent节点代理、Coordinator事务协调器、Backup Manager备份管理器、Recovery Orchestrator恢复编排器四类服务各自可以独立部署为systemd服务。3.2 关键配置参数详解考察点、日志级别与恢复阈值RAPS的配置文件采用YAML格式。这里挑几个直接影响系统行为的参数来聊其他的默认配置也够用。检查点与日志相关参数checkpoint: # 增量检查点的基准时间间隔单位秒 interval_sec: 600 # 备份节点数量建议2含本节点共3副本 replica_count: 2 # 检查点保留代数超过该代数自动清理 max_generations: 5 # 大消息的日志粒度阈值超过该值的消息体不落日志只记录元数据 large_message_threshold_kb: 4096 messagelog: # 消息日志批量刷盘时间窗单位毫秒 batch_flush_ms: 100 # 日志缓冲区上限单位MB buffer_size_mb: 256 # 压力阈值超过后触发降级策略 buffer_high_watermark_mb: 192其中large_message_threshold_kb值得多说一句。在MPI应用中超过4MB的单个消息往往是大数组传输或文件I/O数据这类数据要么可以从上游重新计算要么可以从共享存储重读没必要全部写日志。RAPS的策略是只记录消息的“元数据”消息编号、源进程、目标进程、数据校验和恢复时如果发现数据缺失就从其对端节点重新拉取或重算。处理大消息的代价是恢复时间变长但换取的是正常运行时的日志开销大幅下降。故障检测相关参数detection: kernel_heartbeat_interval_sec: 1 app_heartbeat_interval_sec: 10 miss_threshold: 3 lease_duration_sec: 15 # 进入排干模式的SMART阈值 smart_temperature_c: 70 # 网卡重传率超过该比例触发亚健康标记 retransmit_ratio_threshold: 0.05lease_duration_sec这个参数决定了协调器认为“节点持有任务状态”的有效期。在这个时间内其他节点不能接管该任务避免出现“两个节点同时跑同一个任务”的脑裂问题。租约续约动作由节点代理每次上报心跳时顺带完成所以这个值必须大于心跳周期的数倍。设成15秒3倍于三振阈值若干余量是比较稳妥的选择。恢复策略相关参数recovery: # 恢复后是否优先调度到原机架兼顾局部性与故障域隔离的平衡 prefer_original_rack: true # 最大恢复并发度防止恢复风暴打垮协调器 max_concurrent_recoveries: 4 # 恢复超时时间超过则升级为全局降级 recovery_timeout_sec: 300 # 是否启用增量状态传输建议开启 use_delta_transfer: truemax_concurrent_recoveries是一个容易被忽略但很关键的参数。设想一个坏消息某个ToR交换机故障导致20个节点同时掉线如果系统同时对20个节点做恢复检查点镜像的读取和消息日志的回放会在短时间内形成I/O洪峰可能再次冲垮存储。限制恢复并发度会让恢复队列排成串行或小并发执行看着像是变慢了实际上对系统整体稳定性的保护至关重要。3.3 部署实施的标准流程下面是我在一套32节点测试集群上的部署流程按照这个顺序走基本不会出大错。第一步初始化协调器集群。在三个管理节点上安装etcd集群确认Raft选举正常。然后部署RAPS的Coordinator服务绑定固定IP对外暴露gRPC端口。此时可以先跑一个健康检查确认三节点之间的网络延迟和时钟同步Chrony或PTP都正常。这里时钟同步是必须的不是建议——心跳、租约、检查点版本号都依赖统一的时间基准否则会出现“时间倒流”一类的诡异故障。第二步为每个计算节点安装Node Agent。通过配置管理工具Ansible或SaltStack批量推送Agent二进制和YAML配置文件把节点角色标记为“compute”。启动后验证Agent与Coordinator之间的心跳通道是否通畅在etcd里能看到每个节点的在线状态。这一步最容易遇到的问题是防火墙策略挡了gRPC端口建议先用grpcurl手动调一次接口验证连通性再批量启用服务。第三步配置共享文件系统的检查点目录。RAPS会把检查点文件写在并行文件系统里一份同时本地NVMe上也有一份拷贝。共享目录的权限要规划好建议按作业ID建子目录避免多作业混写导致文件系统元数据膨胀。我习惯单独划一个逻辑卷格式化时启用discard和noatime减少无谓的写放大。第四步接入调度器。在Slurm的slurm.conf中增加RAPS的TaskPlugin和JobCompLoc相关配置使得每个作业启动时自动向RAPS注册任务信息、分配备份组、建立检查点周期。这一步完成后运行一个短小的MPI测试程序观察Agent日志中是否出现“checkpoint completed”和“backup group established”的记录。第五步故障注入测试。这是最刺激的一步。挑一个正在运行的作业用systemctl kill -s SIGKILL直接干掉几个节点上Agent对应的进程或者更粗暴一点直接拔掉一台节点的网线观察RAPS能否在预期时间内检测到故障完成状态迁移和任务重建。第一次做这个实验的时候千万别在跑关键生产作业的集群上测找个闲置的分区练手等流程稳定了再逐步缩小隔离范围。3.4 故障恢复的端到端运行逻辑为了让你对这套系统怎么运转有直观认识我按照一次真实故障的排查时间线来梳理T0秒节点N-17因内存控制器故障彻底宕机。Node Agent连同操作系统一起没了内核级心跳断流。T3秒Coordinator连续3次未收到来自N-17的心跳租约进入过期状态但还在宽限期之内。T5秒租约确认过期Coordinator标记N-17为故障状态同时通知该节点的备份组伙伴节点P-3和P-8开始准备恢复数据。T6秒Recovery Orchestrator被激活向调度器查询N-17上运行的任务列表从etcd读取这些任务的检查点元数据和消息日志索引。T8秒根据预分配规则从候选节点列表中选择N-23作为恢复目标发送一个“准备接管”指令。N-23开始从P-3和P-8拉取N-17的检查点镜像和增量日志。T40秒镜像传输完成总量大约40GB通过100GbE链路传输N-23加载检查点并启动进程实例。T45秒进程进入重放模式按时间顺序回放消息日志直到逻辑时钟追上故障前那一刻的状态。注意这里不是回放到时间点T而是回放到“最后一条被N-17处理过的一致消息”处因为消息日志保证的是因果序稳定。T75秒回放完成应用向调度器报告“已恢复”Slurm重新分配计算资源作业继续运行。整个过程中的计算进度损失约为最近一次检查点以来的增量最多10分钟因为检查点间隔设为600秒。一次完整的故障恢复在75秒内完成而且只有N-17上的任务受到影响其他节点的任务全程没有暂停。这正是RAPS与传统全局检查点方案最大的区别所在。4. 常见问题与排查技巧实录4.1 检查点一致性冲突恢复后任务计算结果对不上现象故障恢复后作业能继续跑但在后续校验阶段发现计算结果与预期不一致。原因分析这是容错系统最隐蔽的一类错误。最常见的原因是消息日志漏记或乱序。当一条消息的发送方日志尚未落盘接收方就已经处理了该消息并做出了状态变更此时检查点保存的状态里包含了“这条消息已被消费”的信息但日志里却没有对应的记录。故障恢复时接收方回放日志找不到这条消息状态自然就对不上。排查思路检查Coordinator日志中是否有“message log gap”或“sequence hole”告警。用rapsctl inspect --job jobid --message-log查看消息日志的连续性重点看send序列号是否有跳号现象。确认buffer_flush_ms配置是否过大。如果消息消费速度极快而日志缓冲区积压超过高水位线时才刷盘很可能出现上述场景。将高水位线从192MB调低到64MB可以显著减少这种风险。解决方案在应用侧为每个跨节点消息增加一个轻量的序列号类似于TCP的seqRAPS的消息日志模块会校验序列号的连续性发现跳号时触发一次“日志对齐”操作从发送方重传缺失的消息。这个方案不需要改业务代码只要在消息结构体的头部预留一个uint64字段即可。4.2 恢复风暴多节点同时故障导致恢复过程再次崩溃现象某个机架供电异常导致15个节点同时掉线系统在恢复过程中触发了新一轮故障最终整作业失败。原因分析恢复风暴的本质是资源竞争失控。15个节点同时做检查点镜像拉取每个节点要读取几十GB数据并行文件系统的读带宽瞬间被打满同时这些节点还要启动新的进程实例CPU和内存开销也会剧烈波动引发其他健康节点的心跳超时进而被误判为故障形成雪崩。排查思路查看recovery_controller.log中max_concurrent_recoveries参数是否生效确认恢复队列是否真的被限流。用sar -n DEV和iostat -x看恢复期间的网络与存储I/O是否接近硬件上限。检查检查点镜像在存储端的布局是否存在大量小文件随机读取——如果是考虑合并镜像文件或使用stripe_width调整条带宽度。解决方案把max_concurrent_recoveries改成更保守的值比如2或3同时为每个恢复任务设置I/O带宽上限通过tc或 cgroupio.max实现。另一个技巧是给恢复操作设置优先级先恢复占用资源最多的任务把小任务排在后面。这样做虽然拉长了整体恢复时间但系统稳定性显著改善。4.3 备份节点自身故障双重故障下的状态重建现象主节点N-01故障后系统发现负责备份N-01检查点镜像的节点N-02也处于亚健康状态部分镜像文件损坏。原因分析RAPS的三副本设计虽然能对抗单节点故障但双重故障依然是一个需要认真对待的场景。当备份节点在镜像写入过程中发生I/O错误或进程崩溃时备份数据可能不完整。这是一个概率事件但当集群规模超过一万节点时这种概率会从“小概率”变成“每天都可能发生”。排查思路查看备份管理器中每个检查点文件的校验和记录用sha256sum对比主节点、备份节点、共享存储三处的文件是否一致。检查备份节点的SMART日志和dmesg确认是否存在磁盘坏道或NVMe控制器重置。解决方案RAPS引入了“指纹校验延迟恢复”机制——每个检查点文件写完后立即计算哈希将哈希值随元数据写入etcd恢复时先校验哈希发现不一致就放弃该备份版本回退到更早一代的检查点。如果两代备份都损坏则从共享文件系统中的冷备份合并重建。这个方案的关键点是不要假设备份一定是对的一切以校验和为准。4.4 常见问题速查表现象可能原因排查动作最终解法心跳频繁超时网络抖动或Agent负载过高ping对端top看Agent进程CPU调大miss_threshold给Agent配置独立CPU核心恢复后MPI作业报“通信超时”恢复节点与原有对端节点网络路径绕远ib_write_bw测试节点间实际带宽重新规划备份组利用拓扑感知将恢复目标选在同可用区内检查点目录磁盘空间暴涨未配置max_generations自动清理du -sh定位大目录设置max_generations: 3增加定时清理任务日志回放耗时过长large_message_threshold_kb过小大量关键消息被降级为元数据检查消息日志大小分布根据实际消息体大小调高阈值或对特定通信组单独配置故障后任务迁移到性能较差的节点备选节点列表不区分节点规格查看节点标签为节点打上规格标签调度时按性能权重随机选点4.5 一条独家排障心得最后分享一个我不止一次踩过的坑测试环境的检查点路径千万不要指到NFS上。很多人在测试阶段图省事把RAPS的检查点目录挂在一个普通NFS服务器上。在小规模测试时问题确实看不出来因为节点少、数据量小NFS的性能瓶颈被掩盖了。但是当你把测试规模扩大到几十个节点、每个节点的检查点文件碎片化到上百个小文件后NFS的元数据操作会变得异常缓慢恢复操作的等待时间动辄超过recovery_timeout_sec系统就会错误地触发升级降级。这不是RAPS本身的问题而是存储选型没有跟上架构设计的逻辑。测试环境至少要用一个独立的NVMe盘作为本地检查点暂存区共享存储可以用NFS但只做最终镜像归档。有条件的话直接上BeeGFS或Lustre那种顺畅度是完全不一样的。5. 项目落地后的效果与扩展建议5.1 一个可量化的参考结果我们在一套128节点每节点双路CPU4张GPU的测试集群上跑过一次故障注入对比测试结果显示在检查点间隔为10分钟、故障率为每天2次的情况下RAPS的有效计算时间占比即真正的浮点计算时间除以总运行时间达到94%而传统全局检查点方案只有72%左右。恢复一个单节点故障的时间从原来的约30分钟含作业重启、排队、重新初始化下降到了2分钟以内。这个差距在长周期作业中非常直观——一个原本需要跑两周的模拟作业在RAPS下几乎不需要因为故障而额外浪费整天的时间。当然代价也不是没有。RAPS需要额外的后备带宽和存储空间备份组的三副本策略让检查点相关的存储量增长到原来的1.8倍左右。这些成本在TCO模型里需要提前算清楚但对于动辄数百万造价的高性能计算集群来说用这点存储换来可靠性的大幅提升我认为是划算的。5.2 可以继续深挖的方向如果你读完这篇文章后也想在自己的环境里试试我建议从三个方向入手。第一个方向把RAPS与检查点压缩和去重技术结合。增量检查点在相邻代之间的重复数据比例很高尤其是迭代类科学计算引入内容定义分块与指纹去重可以把实际写入量再压缩50%以上。第二个方向尝试把RAPS的恢复流程接入Kubernetes的Operator模式。如果你所在团队的主力技术栈是云原生那么RAPS的核心机制完全可以抽象成一个CRDCustom Resource Definition用Kubernetes的控制器模式实现故障检测与任务重建这比在传统集群上部署轻量很多。第三个方向是做一个基于模拟器的容量规划工具。RAPS的很多参数检查点间隔、备份组数量、恢复并发度都依赖于工作负载特征和故障率分布。用一个事件驱动的离散模拟器输入作业轨迹和硬件MTBF数据就可以在改造真实集群之前先把参数空间扫一遍找出最适合自己场景的配置组合。这块我们内部已经有一个雏形后续验证成熟了再单独写一篇展开。对我个人来说容错系统最有意思的地方在于它不像算法那样追求“算得快”而是追求“算得稳”。在一个每天都在死节点的真实集群里能把任务稳稳推进到最后一秒本身就是一种很扎实的成就感。
返回列表