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
创建 2 个 MergerFS 池 A) 一个包含所有 HDD 驱动器,包括 SSD(“POOL”,tier0),并设置为写入具有最少可用空间的设备(除非它还剩 X 量的可用空间)。 B) 第二个池(“POOL-ARCHIVE”,tier1)仅包含 HDD。
您的用户和所有应用程序仅使用第一个池的路径。
一个夜间脚本,将过去 X 天内未触及的所有内容从第一个池复制到第二个池(很简单,因为驱动器是相同的,这只会导致 SSD 上的数据被复制)。这是唯一使用第二个池的路径的项目。
这正是我设置家庭服务器的方式。所有驱动器均采用 BtrFS 格式。我不(不能,使用这个解决方案)使用Raid。
优点:
- 当驱动器发生故障时,您只会丢失该驱动器上的数据(我通过使用 SnapRAID 作为第一个备份系统来缓解这种情况)。您不会像 BtrFS-RAID0 那样丢失整个池。
- 这非常容易设置。 /etc/fstab 中有 2 个挂载点砰,分层缓存!
- 您始终首先使用 SSD(除非它只剩下 X 个可用空间)。给你最大的速度。
缺点:
- 您无法在 MergerFS 池中使用 BtrFS 子卷(跨磁盘),因为 MergerFS 在用户空间中的文件系统之上运行。
- 这也意味着您无法对池中的子卷进行快照。我希望在我的池中拥有类似时间机器的每个用户数据文件夹的快照。
我非常喜欢 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 中可能执行此操作的条目。