无中断 FUSE 迁移

背景

在许多现代机器学习 (ML) 工作负载中,数据通过基于 FUSE 的虚拟文件系统进行访问。这些工作负载通常在 Kubernetes 等容器化环境中运行,其中计算 Pod 依赖于挂载的 FUSE 路径的可用性来进行数据提取、训练检查点和实时模型评估。

然而,FUSE 守护进程的典型重启或升级会导致文件系统挂载暂时被拆除和重建。这会中断打开的文件描述符,使目录句柄失效,并可能导致长时间运行的 ML 作业出现 I/O 错误或失败。在最坏的情况下,它会强制完全重启作业或导致中间结果损坏。

为了缓解这些问题,我们引入了 FUSE 无中断迁移。这是一种机制,使 FUSE 守护进程能够被暂停,其内部状态被快照,然后由一个新进程(例如,一个新的容器或 Pod)恢复,而不会中断正在进行的用户操作。这使得系统更新、错误修复或资源迁移能够无缝执行——这对于要求高可用性和容错性的生产级 ML 系统至关重要。


目标和限制

目标

  • 在 FUSE 升级期间,读操作 (read) 将被保留。 这些请求在迁移期间会短暂挂起(通常在几十秒内),并在新守护进程激活后自动恢复。这确保了对只读工作负载的最小干扰。

限制

  • 慢速读取请求将被强制中止,如果它们无法在 3 秒内完成。

  • 写和列出操作(writemvunlinkreaddir)将在迁移窗口期间失败。 这些操作依赖于无法安全传输的内存中状态,并将返回错误而不是挂起。如有必要,应用程序应实现重试逻辑。 这是为了优先考虑安全性和迁移速度而做出的权衡。


工作原理

启用此功能后,在 FUSE 重启或升级期间会发生“接管”过程,而不是简单地终止先前的 FUSE Pod 并启动一个新的。

  1. 暂停旧进程:旧的 FUSE 守护进程停止处理新请求。

  2. 状态转移:新的 FUSE 守护进程启动并从旧守护进程转移必要的状态。

  3. 无缝切换:状态转移完成后,操作员终止旧的 FUSE 守护进程,新的守护进程开始为所有请求提供服务。

整个转换过程旨在平稳进行。对于只读工作负载,应用程序不应感觉到任何中断。


如何启用

此功能可通过 Alluxio Operator 启用。

  • 启用功能: 只需将以下属性设置为 true

    alluxio.fuse.non.disruptive.migration.enabled=true

    详细说明可在官方文档中找到。

  • 配置宽限期: 当触发无中断迁移时,旧的 FUSE 守护进程将为正在进行的请求提供一个宽限期以完成。默认值为 5 秒。要修改此值,请更改以下属性:

    alluxio.fuse.migration.ongoing.request.grace_period=5s

Last updated