异步元数据操作

sage

过去几周的重点是加速元数据操作。问题在于,重点首先是可靠性和可恢复性。每个元数据操作都由 MDS 执行,并在应用之前安全地记录到 OSD 中。这意味着每个元数据操作都类似于客户端 -> mds -> 主 OSD -> 副本 OSD -> 主 OSD -> mds -> 客户端。这非常安全(客户端、mds 或 osd 的故障不会导致任何问题),但对于像 untar(open/create、chmod、chown)这样的操作来说尤其缓慢。

我们已经通过多种方式改进了这种情况。首先,MDS 现在可以向元数据请求发送两个回复。第一个指示操作已成功,并包含结果,第二个指示操作已安全地记录到磁盘。客户端在两次响应之间跟踪“不安全”(未提交)操作,并且对相关目录的 fsync() 将阻塞,直到操作完全提交为止。

客户端/MDS 协议也得到了改进,以使能力和租约基础设施更有用。关键的区别是,MDS 现在可以向客户端提供异步更新 inode 字段的独占能力。默认情况下,当创建文件时,MDS 会对文件字段(大小、mtime、atime)、auth 字段(uid、gid、mode)和 xattrs 发出独占租约。随后的 chmod 或 chown 只是更新客户端中的这些字段,并在稍后异步将更改刷新回 MDS。

这会将 untar 工作负载减少到仅两个 MDS 往返次数(一个请求确定文件不存在,一个创建+打开文件并获得独占能力/租约),而无需在日志刷新时阻塞。逻辑下一步是允许在客户端是目录的唯一用户时完全异步地进行文件创建。实际上,像 untar 这样的操作应该能够在客户端完全进行,并通过异步方式写回 MDS。现在已经具备了允许这样做的基础设施的大部分(主要项目是锁定基础设施,以确保客户端是目录的独占用户)。不过,我认为我们将在发布新版本之前,稍后再处理使其正常工作,直到我们消除此最新一组更改中的错误为止。

下一步是运行一些基准测试,以查看性能提高了多少,并与 NFS 进行长期以来的比较。