ATC 2024 Paper 分布式元数据论文阅读笔记整理
问题
分布式文件系统(DFS)是现代数据中心存储的支柱。为了满足性能需求,分布式文件系统依赖于持久存储器等高速存储设备[12,36,41,49,72]。与大型、廉价、缓慢的存储设备(如固态或硬盘驱动器)相比,持久内存具有三个独特特征:超高速(约300 ns延迟)、有限的存储容量(每个DIMM插槽≤512 GB)、昂贵的价格(3.27美元/GB)。在当前的单片数据中心[61]中,每台服务器都配备了多个PM模块,本文称之为对称PM架构。然而,这种平等的PM导致了一系列性能和成本问题。
对于对称PM架构,PM文件系统数据分散在一组机器上。在处理客户端请求时,服务器节点必须与其他节点交互,导致过度、昂贵的网络往返。当遇到非均匀访问模式时,就会出现负载不平衡问题,存储热文件的服务器节点不可避免地成为性能瓶颈。当前PM文件系统有三个性能和成本相关的问题:昂贵的跨节点交互、薄弱的单节点能力、昂贵的横向扩展性能,这不仅没有充分利用快速PM设备,而且放大了其有限的存储容量和高昂的价格缺陷。
本文方法
本文提出了Ethane,基于分离式持久内存(DPM)构建的文件系统。DPM将CPU和PM资源分离,并组装成专用计算节点(CN)和内存节点(MN),这些节点通过快速数据连接技术(例如RDMA[31,40,60]和CXL[44,45,52])连接,以经济高效的方式提供超越的大存储容量和高聚合带宽,同时保留了低延迟的内存访问。
-
采用非对称文件系统架构,其灵感来自DPM的不平衡资源提供功能。将文件系统拆分为控制平面FS和数据平面FS,并设计这两个平面以充分利用各自的硬件资源。在CN上部署控制平面FS,具体化为一组在可用CN上运行的CacheFS,每个cacheFS在其本地小型DRAM中维护一个缓存的部分视图。MN提供了具有PB级PM模块的共享内存池,提供整个文件系统的全局视图,将数据平面FS设计为SharedFS,在不相交的PM模块上对数据进行分片,并利用硬件提供的并行性对数据访问路径进行并行化。
-
控制平面FS负责处理复杂的系统控制和管理逻辑,如并发控制和崩溃一致性。利用共享MN的集中视图,将复杂的控制平面FS功能委托给简化的轻量级共享日志[13-15,25,38,48,67]。例如,可线性化的系统调用执行被转化为日志排序问题。通过提取文件系统语义,提出了各种技术来提高日志插入的可扩展性,减少日志回放延迟,并实现强大的操作持久性。
-
数据平面FS负责存储管理和处理数据请求,旨在发挥并行连接MN的大容量和聚合带宽优势。为此,设计了统一的存储范式,将各种依赖耦合的文件系统数据结构转换为统一的、可访问的键值元组,并提出了实现并行元数据和数据路径的机制。
实验结果表明,Ethane获得了DPM硬件的好处,性能比现代分布式文件系统最高好68倍,数据密集型应用程序吞吐量最高提高了17倍。
控制平面FS
控制平面FS由一组cacheFS实例组成。每个cacheFS主要由两部分组成:(1)命名空间缓存,存储最近访问的命名空间条目,使用基于链的哈希表;(2) 数据块元数据缓存(例如远程地址)并组织为平衡二叉树(AVL)树。
利用日志持久性实现持久性
将日志持久性与日志顺序解耦[25]。系统调用有一个操作日志(oplog),其中包括数据日志(dlog)和元日志(mlog)。每个cacheFS在MN中有一个私有PM区域用于存储dlog。dlog包含操作码、文件路径、凭据、元对象地址和协作日志回放中使用的重用字段。此外,还有一个全局日志顺序数组用于存储mlog。mlog包含cacheFS ID(CID)、路径指纹、dlog区域偏移、dlog大小和标志,用于指示此oplog与重命名/symlink系统调用或其他系统调用相关联。
如图3a所示,cacheFS为mkdir系统调用创建了一个dlog和一个mlog。首先通过RDMA_WRITE ① 将dlog写入私有区域。然后,它对发出RDMA_WRITE的队列对使用另一个RDMA_READ,以刷新MN的PCIe缓冲区[68],持久化dlog确保此系统调用的数据持久性。利用商品RNICs提供的订单交付特性[66],同时发出这两个RDMA请求。
利用日志排序实现线性化(处理并发)
利用共享日志将并发系统调用执行转化为oplog的连续历史。cacheFS将mlog写入全局日志顺序数组 ②,顺序数组中的mlog顺序反映了系统调用执行的顺序。每个cacheFS实例都会重放相同的日志序列。
图3a显示了mlog区域被划分为一系列竞技场,竞技场由多个存储mlog的插槽组成。竞技场插入包括两个步骤:(1)mlog插入和(2)填充前面的空槽。在步骤(1)中,每个cacheFS在当前活动竞技场中随机选取一个空槽,使用RDMA_CAS插入mlog,并使用RDMA_READ将其持久化(图3b情况I)。在理想情况下,当C1-C4完成竞技场插入时,不存在前面的空槽,省略了步骤(2),且这些竞技场插入没有争议。它们还会生成有效的日志序列,因为C1-C4是并发cacheFS实例,mlog插入没有顺序限制。
当cacheFS完成竞技场插入时,应该确保在插入的mlog1之前没有空槽。否则,如果后续的cacheFS将mlog2插入到其中一个空插槽中,mlog2在日志历史记录中位于mlog1之前,就会破坏线性化。在图3b情况II中,C4扫描前面的插槽,用伪mlog(空操作)填充空插槽。如果C4在C1之前,C4的伪mlog插入可能会导致C1的插入失败,C1将重新插入mlog。
在图3b情况III中,C3与其他三个cacheFS实例不并发。C3的mlog位于竞技场中他们的mlog后面。当C3完成mlog插入时,其mlog前面存在两个空插槽,它填充这些空槽以完成日志历史记录。
利用日志播放实现一致性
每个cacheFS都通过复制保持一致的状态,实例之间的一致性是通过日志回放实现。因此,cacheFS首先通过扫描和重放oplog将其本地状态转发到最新状态③,之后在本地执行mkdir并返回执行结果④。非nilext接口属性强制在系统调用执行路径期间显示日志回放,为了解决这个瓶颈,提出了两种技术:基于文件依赖的日志依赖性检查和协作日志回放。
日志依赖性检查
为了减少日志回放序列长度,cacheFS旨在回放依赖日志。为此,需要识别哪些oplog是依赖的,如何快速识别依赖性oplog。
依赖包括三种,如图4:直接依赖是路径中的所有父目录,步骤依赖是由于重命名导致的路径修改,远程依赖是由于符合链接导致的新依赖。
快速识别依赖,如图5:设计mlog跳表来减少日志回放范围。每个cacheFS都有一个易失的私有mlog跳表,每个文件都有一个相应的表条目,记录了上次播放期间全局日志顺序数组中的插槽位置,用于跳过上次播放时回放的日志。cacheFS计算目标文件/a/b/c的直接依赖①。使用每个文件路径的指纹查询跳表②,找到每个文件的相关播放范围,最终的回放范围是所有范围的并集。cacheFS逐一读取mlog并检查它们的依赖关系③,并执行相关操作以更新cacheFS状态。
协作日志回放
日志回放执行历史操作以得到一致的cacheFS状态。协作日志回放通过重用其他日志回放的部分执行结果来加速系统调用的执行。在dlog中添加了一个重用字段,设置字段表示此日志已回放过。当前回放例程通过获取路径解析结果并直接修改文件来执行部分日志回放(4.2)。否则,执行完整的日志回放(4.1)。
总结
针对基于PM的分布式文件系统,现有方法存在3个问题:昂贵的跨节点交互、薄弱的单节点能力、昂贵的横向扩展性能。本文提出Ethane,基于分离式持久内存(DPM)的文件系统。包括3个技术:(1)采用非对称文件系统架构,拆分为控制平面FS(运行在CN,维护部分缓存视图)和数据平面FS(运行在MN,维护全局视图,提供共享空间)。(2)控制平面FS负责持久性、并发性和一致性,利用共享日志实现。将每个操作的oplog写入PM实现持久性;将文件系统操作转换为日志排序,处理并发性;在每个操作前回放共享日式实现一致性。(3)数据平面FS负责存储管理和处理数据请求,设计了统一的存储范式,将各种文件系统数据结构转换为键值元组,并实现并行元数据和数据路径的机制。