btrfs 不会将数据分发到 4 磁盘 RAID1 阵列中较小的磁盘

btrfs 不会将数据分发到 4 磁盘 RAID1 阵列中较小的磁盘

我有一个btrfs由四个大小分别为 3TB、3TB、1TB 和 1TB 的磁盘组成的文件系统,配置为 RAID1(数据和元数据)。

我注意到似乎btrfs根本不想使用较小的磁盘:

# btrfs fi show /butter
Label: none  uuid: 6d899bb3-e7c1-4fc8-a20e-8a854dd39e21
        Total devices 4 FS bytes used 956.38GiB
        devid    1 size 931.51GiB used 0.00B path /dev/sdb1
        devid    2 size 931.51GiB used 0.00B path /dev/sda1
        devid    3 size 2.73TiB used 965.03GiB path /dev/sdd
        devid    4 size 2.73TiB used 965.03GiB path /dev/sde

btrfs-progs v4.0.1

这是为什么?什么时候它会开始将数据放在较小的磁盘上?

btrfs尝试将所有磁盘保持在相同的磁盘使用率百分比以便 I/O 可以分布在更多设备之间似乎更有效率,但也许我遗漏了一些东西...这种行为可以配置吗?


更新:自从我最初问了这个问题,我已经换出了一些磁盘,并向池中添加了足够的数据,现在它开始使用较小的磁盘:

Label: none  uuid: 32a5c215-4a58-4686-9b3b-b30a5ee1fda0
        Total devices 4 FS bytes used 1.74TiB
        devid    1 size 931.51GiB used 141.00GiB path /dev/sda
        devid    2 size 931.51GiB used 141.00GiB path /dev/sdb
        devid    3 size 2.73TiB used 1.84TiB path /dev/sdd
        devid    4 size 2.73TiB used 1.84TiB path /dev/sde

所以btrfs 它按我预期的那样运行(将数据分布到池中的所有磁盘上),但它启动的时间比我预期的要晚得多。我很想知道它如何决定在磁盘上分布数据,以及其中是否有任何可调参数。

答案1

即使你跑了btrfs balance start -dconvert=raid1 -mconvert=raid1 /butter,您的结果符合预期。

来自 BTRFS WikiSysadminGuide#RAID 和数据复制

使用 RAID-1 和 RAID-10,无论文件系统上实际使用了多少个块设备,都只会写入每个字节数据的两个副本。

您拥有足够多的磁盘来保存两份数据副本。

也许您想要所有数据的 4 份副本?N 路镜像是一项计划中的功能。

尝试一下

答案2

我不记得在哪里,但我记得我前段时间在某个地方读过的东西。它可以解释你的问题,主要概念是:

  • BTRFS(RAID1 级别)首先在具有较多可用空间的磁盘上写入,然后在下一个磁盘上写入(不包括已经写入的磁盘),只是将两个副本写入不同的磁盘。

磁盘不是物理磁盘,而是物理磁盘的“设备”(此免责声明适用于在同一物理磁盘上使用多个分区的人,例如 /dev/sda1 /dev/sda2 /dev/sdb1 ...),这就是为什么要尽量避免在同一个磁盘上将多个分区分配给同一个 BTRFS;这样就扼杀了 BTRFS 在不同物理介质上写入(RAID1 级别的两个副本)的能力。

换句话说,直到所有剩余磁盘上的可用空间不低于最小磁盘的大小,BTRFS 才会使用它们(在 RAID1 级别),因为它会选择具有更高可用空间的磁盘。

换句话说,BTRFS 尝试在所有 RAID1 级别的磁盘上保留相同的可用空间,当它需要空间时,BTRFS 会从具有最多可用空间的磁盘中获取空间。

您输入的数据报告可以证实这一点:

devid    1 size 931.51GiB used 141.00GiB path /dev/sda
devid    2 size 931.51GiB used 141.00GiB path /dev/sdb
devid    3 size 2.73TiB used 1.84TiB path /dev/sdd
devid    4 size 2.73TiB used 1.84TiB path /dev/sde

只要做一些数学计算:

A) 2.73TiB - 1.84TiB = 0.89TiB       <-- close to what is free
B) 931.51GiB = 0.9292TiB             <-- Just convert the size units
C) 141.00GiB = 0.1377TiB             <-- Just convert the size units
D) 0.9292TiB - 0.1377TiB = 0.7915TiB <-- close to what is free
and 0.7915TiB is very similar to 0.89TiB, so free space is now balanced

直到你填充 2.73TiB-931.51GiB=1.8TiB,它才会使用最小的一个。

相关内容