Copy-on-Abundant-Write for Nimble File System Clones——论文阅读

TOC 2021 Paper 分布式元数据论文阅读笔记整理

Copy-on-Abundant-Write for Nimble File System Clones

问题

制作文件和目录的逻辑副本或克隆对于许多现实世界的应用程序和工作流(包括备份、虚拟机和容器)至关重要。因此许多文件系统支持目录树的逻辑拷贝,而不进行完整的物理拷贝,避免昂贵的时间和空间消耗。

用于卷快照的一个经典优化是写时拷贝(CoW),将目录标记为CoW是很快的,尤其是当文件系统可以将顶级目录标记为CoW并在目录树中缓慢传播更改时。但标准CoW在写入放大和局部性之间存在折衷,主要由复制粒度影响。如果复制粒度较大,例如文件级CoW中,则会放大小更改的成本,对任何CoW单元的第一次写入延迟都很高,并且浪费空间。如果复制粒度很小,更新很快但导致局部性变差,使顺序读取开销高。

挑战

理想的克隆(灵活克隆)需要满足以下性能目标:(1)创建克隆具有低延迟;(2) 读取在所有版本中都是快速的,即使在修改之后,也始终保持空间局部性;(3) 所有版本的写入速度都很快;(4) 整个系统是节省空间的,使写放大和磁盘占用空间尽可能小。

背景

BetrFS以其KV存储数据结构Bε树命名[6,10]。Bε树在叶子中存储键值对。Bε树的一个关键特征是内部节点缓冲叶内容的未决突变,编码为消息。消息被插入到树的根中,当内部节点的缓冲区充满消息时,消息会被大批量刷新到一个或多个子缓冲区。最终,消息到达叶节点,并应用更新。因此,随机更新是廉价的。由于更新是分批向下移动的,因此IO节省会随着批处理大小的增加而增加。因为给定键值对的所有未决消息都位于由其键定义的根到叶遍历路径上。因此,点查询需要读取并应用遍历路径上所有适用的缓冲消息,以构建正确的响应。消息有一个逻辑时间戳,可以将这些缓冲消息的内容视为自上次写入叶子以来的突变历史。

本文方法

本文描述了Bε树文件系统(BetrFS 0.5)中的灵活克隆,基于两个关键观察结果:

  • 标准的写时复制(CoW)过于粗糙,无法节省空间,或者过于细粒度,无法保持局部性。

  • 写优化的键值存储,如Bε树或LSM树,可以将更新的逻辑应用与数据物理复制的粒度解耦。通过缓冲对克隆文件或目录的微小更改,直到累积足够的更改以真正修改克隆数据。

本文在BetrFS的写优化克隆实现中,只有当克隆发生足够的变化时,克隆之间的数据共享才会中断,称之为大量写入时复制的策略(CAW)。

  • 将BetrFS的Bε树[6,10,18]数据结构转换为有向无环图(Bε-DAG),使不同的遍历路径能够重用相同的物理数据。支持:节点引用计数,过滤主键,前缀转换。(1) 维护每个节点的引用计数,以便在多个Bε-DAG搜索路径之间共享节点,引用计数与节点本身分离,并存储在节点转换表中。(2) 过滤主键,在Bε-DAG数据结构中,由于节点较大,因此包含许多无关 key 值,在克隆过程中对这些无关 key 值进行过滤。(子节点中 q 和 v 需要过滤)。(3) 前缀转换,对克隆文件进行查询时,要将 key 值转换为克隆前的 key 值。(子节点是克隆而来,查询 pw 时,访问到子节点需要将 p 转换为 s)。

  • 为了实现快速的逻辑拷贝,开发了应用写优化的新技术,以批量更改数据结构本身的拓扑结构,即其pivot和内部指针。核心思想是将单次的小写通过缓冲区汇集,一次性写入,从而降低写放大。 虽然打破节点共享,但仍保持子树的其余部分共享。进一步引入了GOTO消息,可以将逻辑副本快速持久化到消息缓冲区中,与任何小型写入一样快。因此Bε-DAG的内部内务工作就可以搭载到对逻辑复制区域的任何写入上。

  • 引入了一种翻译前缀抽象,可以在静态时从逻辑上纠正共享数据中的过时密钥,从而促进部分共享数据的延迟复制和正确查询。使BetrFS可以以比当前最先进技术(33%-6.8×)更快的速度持久化大型逻辑拷贝,而不会降低读、写或空间效率。

通过渐近分析证明,批处理和摊销BetrFS克隆操作成本所需的算法,不会削弱BetrFS的性能优势,克隆本身的成本是Bε-DAG大小的对数。

实验证明BetrFS克隆是有效的,当使用克隆操作创建容器时,BetrFS的性能比简单递归复制高出两个数量级,比具有专用Linux容器(LXC)后端的文件系统高出3–4倍。

Bε-DAG克隆流程

将/green克隆到/red,第一部找到所有 green 开头的 key node 的最低公共祖先(LCA),图中最下方的节点为起点生成的子图中包含了所有在 /green 这个文件夹中的文件。

为了更快的响应 clone,采用 logical copy 机制,从 /red 文件中加入一个指针,指向那个包含所有 /green 文件的节点

同时向这个加入的有向边中添加一个前缀转换信息, 使得通过这个有向边查找的诸如 /red/M 之类的查询会被转换为 /green/M 

向 clone 所得的 /red 文件夹中的文件加一点改动,比如对 /red/B, /red/Q, /red/Z 这三个文件的某些地方进行改动, 像 Bε-Tree 一样依次往 root 节点的 buffer 中压入改动的 message 结构即可 

当放入 message /red/Z  后 root 节点的 buffer 满了,要对这个 buffer 进行 flush 操作,将这些 message 刷入子节点中

拷贝子图共享子图中最高的节点

将拷贝后的节点中所有标前缀为 /green 的 message, 将其前缀改为 /red

将拷贝节点中无关的节点 (也就是那些在 /red 这条路径上访问不到的节点) 删去

将前缀转换放入下一层结构的有向边中

将 message 刷入拷贝所得的节点中

通过GOTO消息降低延迟

要克隆 /green 并命名为 /violet

首先将所有的前缀中带有 /green 的 message 刷入 /green 的最大子图中,从而可以在 LCA 中找到所有关于 /green 的信息

在 root 节点的 buffer 中放入 GOTO message,类似于一个节点的 pivot。新加入的 GOTO message 包含一个指向 /green 的 LCA 的指针, 以及将所有关于 /violet/* 的查询转换为 /green/*。

如果有查询命令,如 /violet/H,直接通过 GOTO message,将查询转变前缀,转为/green/H,直接指向查询目标的子图,实现更快的查询

GOTO message 和其他的 message 完全一样, 每当 buffer 满了, 其会同别的 message 一样被 flush 到子节点中。同时维护 GOTO 消息的路径长度,GOTO 消息的最小高度限制为比消息的目标节点高一级,确保GOTO消息创建的路径不会比普通的根到叶路径长。

当 GOTO message 到达其指向的节点的上一层时,将这个 message 转换为正常 pivot,回到Bε-DAG克隆流程

总结

针对BetrFS中目录克隆的优化,传统的CoW受复制粒度影响,复制粒度较大则对CoW单元的第一次写入延迟高;复制粒度较小则局部性差,顺序读取开销高。本文提出大量写入时复制的策略(CAW)。(1)将BetrFS的Bε树数据结构转换为有向无环图(Bε-DAG),使不同的遍历路径能够重用相同的物理数据,将单次的小写通过缓冲区汇集,一次性写入,从而降低写放大。支持:节点引用计数(克隆后添加新引用指向克隆路径),过滤主键(克隆后删除缓冲区中克隆路径无法访问的路径),前缀转换(不修改数据,修改查找时的路径)。(2)引入了GOTO消息,将逻辑副本快速持久化到消息缓冲区中,降低对克隆区域第一次写入的延迟。

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妙BOOK言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值