如何在不使用 RAID 的情况下创建驱动器存储池(包含现有数据)?

如何在不使用 RAID 的情况下创建驱动器存储池(包含现有数据)?

因此,我目前有一台 Ubuntu 20.04 机器,我正在将其作为 Plex 媒体服务器运行。它有一个 32gb SATA SSD,用于启动、交换、//home,以及一个 2TB M2 NVME SSD,我将媒体存储在该 SSD 上(安装在/media/nvme)。我目前在 NVME 上已经有大约 900gb 的媒体,而且我要搬出去,所以要再买一个 2TB SATA SSD,但把这台服务器留在我父母家,因为他们的网速比我快。我希望新的 SSD 和现有的 NVME 在 Ubuntu/Plex/etc 中显示为单个驱动器,这样我就不必担心手动对磁盘进行负载平衡(即在旧驱动器填满时手动将媒体放在新驱动器上),我希望能够在将来根据需要放入更多磁盘,让 Ubuntu 认为有更多空间

从一些初步研究来看,ZFS 似乎是推荐的选项,但我不想设置 RAID 阵列,因为我不想在奇偶校验位上浪费任何空间,也不想进行条带化,因为如果一个驱动器发生故障,我会丢失所有数据。我只想要一个系统,Ubuntu 将其视为/media一堆空间,而不关心其后面的驱动器数量,如果驱动器发生故障,我只会丢失该驱动器上的数据,而不是整个卷。这可能吗?我可以使用现有磁盘进行设置吗,还是必须进行一些改组(例如,使用新驱动器创建池,复制数据,重新格式化旧驱动器并将其添加到池中)?

答案1

但是,如果您将一组磁盘设置为没有冗余的单个文件系统,则丢失其中一个磁盘很可能会使您丢失所有数据。ZFS 绝对无法承受非冗余池中物理驱动器的丢失。

您可以选择以下可能性:

  • 将您的空间合并为一个非冗余的卷:丢失一个,丢失所有
  • 将您的空间合并为一个冗余卷:丢失一个卷,保留数据,牺牲空间
  • 不要合并你的空间,而是保持不同的体积:失去一个,失去一些,手动调整

答案2

我最终用不同的解决方案解决了这个问题,合并mergerfs 的工作方式是将驱动器安装到它们自己的安装点(例如/mnt/drive1/mnt/drive2等),然后创建另一个安装点,该安装点是底层驱动器的文件系统的联合(mergerfs 自述文件解释得更好)。这满足了我所寻找的所有要求:

  • 给定一组驱动器,提供一个包含所有空间的挂载点/文件夹
  • 不需要重新格式化驱动器,也不需要事先备份数据并将其复制回来
  • 如果某个驱动器发生故障,则只会丢失该驱动器上的数据,而不会丢失整个池

它还(主要)解释了 Eugen Rieck 在评论中提到的写入放大问题,因为您可以设置底层驱动器写入所需的最小空间。即,如果您知道将要写入的文件的平均大小,只需设置 minfreespace > 平均大小(但是,如果您所有驱动器上的可用空间都小于 minfreespace,您将无法写入任何内容,这是一个重要的警告)。

使用 mergerfs,我编辑了我的 fstab 以包含以下内容来实现驱动器池:

# nvme media
UUID=986b13e8-da8d-4839-801e-61d17dcf7d26 /drives/nvme    ext4    defaults        0       2
# ssd media
UUID=674f1abd-ea83-4797-823a-055db6b7c223 /drives/ssd     ext4    defaults        0       2
# mergerfs
/drives/*                                 /media          fuse.mergerfs  allow_other,use_ino,cache.files=off,dropcacheonclose=true,category.create=mfs,minfreespace=10G,moveonenospc=true   0       0

其中最重要的选项(在我看来)是category.create=mfs,它在执行写入操作时选择具有最多可用空间的驱动器。这可确保数据在驱动器之间保持平衡(因此,如果发生驱动器故障,您只会丢失 1/N 的数据,N = 驱动器数量)。此外,由于 mergerfs 支持您在上面的配置中看到的通配符,因此添加更多空间就像连接驱动器、分配分区和将 UUID 挂载到 一样简单/drives/{some_name_here},并且 mergerfs 将在下次重新启动时自动选择它(然后您可以使用合并平衡以平衡文件到新驱动器)。希望这对遇到这种情况的其他人有所帮助!

相关内容