BTRFS 分层存储 - 它是如何完成的?

BTRFS 分层存储 - 它是如何完成的?

NETGEAR 在其 ReadyNAS 操作系统中使用 BTRFS,并在其最新版本中实施分层存储。他们从 ReadyNAS v6.9 中仅使用“元数据”层开始,然后在 v6.10 中添加了“数据层”。系统使用 SSD 作为第 0 层,以加快对系统中速度较慢的 HDD 的访问速度。系统的描述指出,在这两种情况下,元数据都将驻留在 SSD 上,并且在“数据层”情况下,新写入的数据将首先写入 SSD,然后定期迁移到 HDD,或者当SSD 层已填充至指定级别。

ReadyNAS 在其正常安装中在 RAID-ed HDD 之上使用 BTRFS - 例如,我的系统有一个由 4 个磁盘组成的 RAID5,BTRFS 将其视为/使用为单个设备。

看看分层是如何实现的,“元数据”和“数据层”设置似乎都是通过将仅由 SSD 组成的第二个 RAID 阵列添加到主 HDD RAID 阵列,并转换初始的单设备来完成的。 BTRFS 成为多设备之一。

我不明白的是迁移是如何完成的,以及“元数据”案例如何设法将元数据与数据分离,以便只有元数据进入SSD?另外,“数据层”模式如何将写入完全定向到 SSD 层?

有任何想法吗?

答案1

您是说 Netgear 已经找到了一种方法,可以通过用户友好且极其简单的配置完成 MergerFS 分层缓存已经允许您执行的操作: https://github.com/trapexit/mergerfs#tiered-caching

  1. 创建 2 个 MergerFS 池 A) 一个包含所有 HDD 驱动器,包括 SSD(“POOL”,tier0),并设置为写入具有最少可用空间的设备(除非它还剩 X 量的可用空间)。 B) 第二个池(“POOL-ARCHIVE”,tier1)仅包含 HDD。

  2. 您的用户和所有应用程序仅使用第一个池的路径。

  3. 一个夜间脚本,将过去 X 天内未触及的所有内容从第一个池复制到第二个池(很简单,因为驱动器是相同的,这只会导致 SSD 上的数据被复制)。这是唯一使用第二个池的路径的项目。

这正是我设置家庭服务器的方式。所有驱动器均采用 BtrFS 格式。我不(不能,使用这个解决方案)使用Raid。

优点:

  1. 当驱动器发生故障时,您只会丢失该驱动器上的数据(我通过使用 SnapRAID 作为第一个备份系统来缓解这种情况)。您不会像 BtrFS-RAID0 那样丢失整个池。
  2. 这非常容易设置。 /etc/fstab 中有 2 个挂载点砰,分层缓存!
  3. 您始终首先使用 SSD(除非它只剩下 X 个可用空间)。给你最大的速度。

缺点:

  1. 您无法在 MergerFS 池中使用 BtrFS 子卷(跨磁盘),因为 MergerFS 在用户空间中的文件系统之上运行。
  2. 这也意味着您无法对池中的子卷进行快照。我希望在我的池中拥有类似时间机器的每个用户数据文件夹的快照。

我非常喜欢 MergerFS,因为它很简单,但是第 2 个问题让我对 Netgear 如何使用 BTRFS 破解类似的解决方案非常感兴趣。

答案2

好的,这是我发现定期平衡期间发生的情况:

主机上启动以下进程:

btrfs balance start -dsweep lt:/dev/md127:7 /data LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DBUS_SESSION_BUS_ADDRESS=unix:path=/var/netatalk/spotlight.ipc TRACKER_USE_CONFIG_FILES=1 TRACKER_USE_LOG_FILES=1 XDG_DATA_HOME=/apps/.xdg/local/share XDG_CONFIG_HOME=/apps/.xdg/config XDG_CACHE_HOME=/apps/.xdg/cache

其中 /data 是我的分层数据卷,/dev/md127 是用作缓冲区/缓存的 SSD 阵列。

此过程一直运行,直到 SSD 层的数据几乎完全移动到 HDD 层 - 例如,我看到的沿途某个地方:

btrfs fi sh /data
Label: '0a44c6bc:data'  uuid: ed150b8f-c986-46d0-ada8-45ee219acbac
    Total devices 2 FS bytes used 393.14GiB
    devid    1 size 7.12TiB used 359.00GiB path /dev/md126
    devid    2 size 114.68GiB used 42.06GiB path /dev/md127

然后它会下降,直到 SSD 层的使用率几乎为零。奇怪的是,到目前为止我无法手动运行这个命令。

我仍然无法弄清楚“扫描”平衡滤波器。

这是 -help 显示的内容:

# btrfs balance start --help
usage: btrfs balance start [options] <path>

    Balance chunks across the devices

    Balance and/or convert (change allocation profile of) chunks that
    passed all filters in a comma-separated list of filters for a
    particular chunk type.  If filter list is not given balance all
    chunks of that type.  In case none of the -d, -m or -s options is
    given balance all chunks in a filesystem. This is potentially
    long operation and the user is warned before this start, with
    a delay to stop it.

    -d[filters]    act on data chunks
    -m[filters]    act on metadata chunks
    -s[filters]    act on system chunks (only under -f)
    -v             be verbose
    -f             force reducing of metadata integrity
    --full-balance do not print warning and do not delay start
    --background|--bg
                   run the balance as a background process

但这并不能解释它如何映射到lt:/dev/md127:7定期运行的命令的“”部分:

btrfs balance start -dsweep lt:/dev/md127:7 /data

这里的意思是什么:运行直到 /dev/md127 数据使用率降至 7% 以下?!?

答案3

它必须是定期运行并执行迁移的 cronjob。

检查 /etc/cron.d 中可能执行此操作的条目。

相关内容