无中断 FUSE 迁移
背景
在许多现代机器学习 (ML) 工作负载中,数据通过基于 FUSE 的虚拟文件系统进行访问。这些工作负载通常在 Kubernetes 等容器化环境中运行,其中计算 Pod 依赖于挂载的 FUSE 路径的可用性来进行数据提取、训练检查点和实时模型评估。
然而,FUSE 守护进程的典型重启或升级会导致文件系统挂载暂时被拆除和重建。这会中断打开的文件描述符,使目录句柄失效,并可能导致长时间运行的 ML 作业出现 I/O 错误或失败。在最坏的情况下,它会强制完全重启作业或导致中间结果损坏。
为了缓解这些问题,我们引入了 FUSE 无中断迁移。这是一种机制,使 FUSE 守护进程能够被暂停,其内部状态被快照,然后由一个新进程(例如,一个新的容器或 Pod)恢复,而不会中断正在进行的用户操作。这使得系统更新、错误修复或资源迁移能够无缝执行——这对于要求高可用性和容错性的生产级 ML 系统至关重要。
目标和限制
目标
在 FUSE 升级期间,读操作 (
read
) 将被保留。 这些请求在迁移期间会短暂挂起(通常在几十秒内),并在新守护进程激活后自动恢复。这确保了对只读工作负载的最小干扰。
限制
慢速读取请求将被强制中止,如果它们无法在 3 秒内完成。
写和列出操作(
write
、mv
、unlink
、readdir
)将在迁移窗口期间失败。 这些操作依赖于无法安全传输的内存中状态,并将返回错误而不是挂起。如有必要,应用程序应实现重试逻辑。 这是为了优先考虑安全性和迁移速度而做出的权衡。
工作原理
启用此功能后,在 FUSE 重启或升级期间会发生“接管”过程,而不是简单地终止先前的 FUSE Pod 并启动一个新的。
暂停旧进程:旧的 FUSE 守护进程停止处理新请求。
状态转移:新的 FUSE 守护进程启动并从旧守护进程转移必要的状态。
无缝切换:状态转移完成后,操作员终止旧的 FUSE 守护进程,新的守护进程开始为所有请求提供服务。
整个转换过程旨在平稳进行。对于只读工作负载,应用程序不应感觉到任何中断。
如何启用
此功能可通过 Alluxio Operator 启用。
启用功能: 只需将以下属性设置为
true
。alluxio.fuse.non.disruptive.migration.enabled=true
详细说明可在官方文档中找到。
配置宽限期: 当触发无中断迁移时,旧的 FUSE 守护进程将为正在进行的请求提供一个宽限期以完成。默认值为 5 秒。要修改此值,请更改以下属性:
alluxio.fuse.migration.ongoing.request.grace_period=5s
Last updated