转载:https://blog.csdn.net/PANGHAIFEI/article/details/100139196
备注:本文翻译自 IBM Research Report BTRFS - Linux Btree Filesystem
Linux 有设备映射(DMs)子系统去管理存储设备。举个例子,LVM和mdadm,这些时软件模型,主要功能是管理raw disks,合并他们到虚拟的连续的块地址空间,并且将其抽象话到更高级别的内核层。他们支持镜像,剥离和RAID5/6。无论如何,checksums是不支持的,这样会导致BTRFS有一个问题。举个例子,考虑一种情况,数据存储在磁盘上是RAID-1的格式,每个4KB块有一个额外的拷贝。 如果文件系统在一个拷贝上检测到一个checksum的错误,它需要从其他拷贝恢复。DMs隐藏了虚拟地址空间抽象化背后的信息,并且返回其中一份拷贝。为了规避这个问题,BTRFS做了自己的设备管理。它计算checksums,将他们存储在一个单独的树中,然后更好的确定当媒介错误发生的时候合适恢复数据。
一台机器可以被附加到多个存储设备上;BTRFS分离每个设备到large chunks,经验法则是chunk大约是一个设备尺寸的1%。
在写的时刻, 1GB chunks 被用于数据, 256Mchunks用于元数据。
一个chunk tree 包含一个从逻辑chunks到物理chunks的映射。 一个device tree包含反向映射,文件系统剩余部分可以看到有逻辑的chunks,所有的extent references 地址逻辑chunks。这个允许移动物理的chunks under the covers无需回溯和引用修复。 chunk/device trees 是很小的,并且典型的可以在内存中缓存。这个减少增加间接层的性能开销。
物理的chunks根据逻辑chunk的需要的RAID级别被分成组。对于镜像,chunks被分成对。表1呈现了一个三个硬盘,两个组的例子。举个例子,逻辑chunk L1由C11 和 C21组成。 表2展示了一个硬盘比另外两个大的情况。
表 1: 为了支持RAID1逻辑chunks,物理chunks被分为对。 三个磁盘,每个有两个物理chunks,提供三个逻辑chunks. 逻辑chunk L1由物理chunks C11和C21组建。
表2: 一个大的磁盘,两个小的磁盘,在一个RAID1配置。
对于条带化,n chunks 的组被使用, 每个物理chunk在不同的磁盘上。举个例子,表3展示了条带宽度位4(n=4),四个磁盘,三个逻辑chunks的情况。
表3: n=4 每个逻辑chunks 由四个物理chunks组成。
在写的时候,RAID 级别0,1和10是支持的。 额外的,有一些实验的代码来自于Intel支持RAID5/6。更高级的RAID的核心思想是去使用Reed-Solomon parity relationship的chunks group。举个例子,表4展示了一个RAID6配置,逻辑chunks L1,2,3由双重物理chunks组建。举个例子,L1由{C11,C21,C31,C41},Chunks{C11,C12}保持数据清晰, C31=C21+C11,C41=Q(C21,C11),函数Q通过Reed-Solomon代码定义这样任何双重的chunk失败组合将可以被恢复。
表4: 一个RAID6的例子, 有四个磁盘{D1,D2,P,1}。每个逻辑chunk在每个硬盘上有一个物理chunk。举个例子,L1的原始数据被条带化在磁盘D1和D2中。C31是C11和C21的奇偶校验。C41是C11和C12chunks的Q计算。
复制数据和存储奇偶校验数据对存储系统来说是很消耗成本的。无论如何,它允许从许多媒介错误场景中恢复。最简单的情况是RAID1, 每个块都有一个镜像的拷贝。当文件系统尝试去读取一个拷贝时,发现IO或者checksum错误,他会尝试第二份拷贝。 如果第二份拷贝是有效的,然后他会返回给调用者。 额外的,第一份拷贝可以被有效的数据重写。一个主动的方法,一个低强度的擦洗操作被持续性的运行在数据中,也是支持的。
逻辑chunks的RAID 配置是灵活的。一个单个的BTRFS存储池可以有多种逻辑chunks在不同的RAID 级别中。这个会从低级别的可以来的和条带化的机制中解耦高级的逻辑结构。这些对下面的操作很有用:
1. 在飞速的,增长或者减少可靠性中改变RAID 级别
2. 改变条带宽度:更宽带来更好的带宽
3. 给不同的子卷不同的RAID级别。也许一些子卷需要更高的可靠性,而其他在更小少可靠性的开销下需要更多的性能
默认的行为时使用RAID1给元数据,即使只有一个磁盘。这个给文件系统一个更好的机会在介质失败的时候恢复。
在文件系统的周期中普通的操作发生是设备的添加和移除。 这个是支持的,通过一个常规的平衡算法尝试去传播分配均衡的在所有的磁盘上,即使当设备总体改变的时候。
举个例子,表5(a) 系统有两个磁盘在RAID1配置;每个磁盘有1/2的原始数据。然后一个新磁盘添加进来,看表5(b),均衡代码的目标是达到在表5(c)中的状态,数据均衡的分布在所有硬盘上,每个硬盘拥有1/3的数据。
表5:设备添加。 初始(a) 有两块盘。 状态(b),另一个磁盘被添加,初始化位空。状态c展示了目标:数据均衡分布在所有磁盘上。物理chunks C12和C23被移动到硬盘3。
当一个设备被移除时,情况是相反的。从一个1/3比例(表5的c),系统移动回到1/2.如果有未使用的chunks在剩余磁盘,然后再次平衡可以自动完成这个任务。无论如何,我们不会总是这么幸运。如果数据在所有chunks之间传播,然后尝试去驱逐一个chunk需要遍历整个文件系统,移动extents,修复references。这个域碎片整理是类似的。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/PANGHAIFEI/article/details/100139196