大型媒体存储和 ZFS 或 BTRFS

大型媒体存储和 ZFS 或 BTRFS

我有一台服务器,在单个 8TB WD 硬盘上有大约 6TB 的媒体文件。

在我提出问题之前,我可能应该提供一些背景知识。

这些文件在 BTRFS 上保存了几周,但在出现不相关的硬件问题和随后的操作系统重建后,我不小心毁掉了磁盘并不得不从备份中恢复文件,因此我决定以此为契机尝试使用 ZFS。

我想使用 zfs 的主要原因是它能够维护数据完整性。在我转向 btrfs(现在是 zfs)之前,我将这些文件放在 ext4 上,在驱动器出现位腐烂问题后,我有一堆文件被悄悄损坏。

因此,将数据重新加载到 zfs 后几周一切都正常,直到今天早上我注意到磁盘被无情地鞭打。

经过一番探索后,我发现它正在被 zfs 以 586K/s 的快得令人眼花缭乱的速度“擦洗”。按照这个速度,它永远不会完成!

现在这个过程的一部分是我越来越熟悉 ZFS,所以如果我误解了这里的某些内容,请告诉我,但我相信为了数据完整性目的需要清理,因为整个数据集存储在单个物理磁盘上?

如果这是正确的,如果我购买更多磁盘并使用某种形式的 raidz,鞭打问题是否可以解决?

如果是这样,解决这个问题的最佳方法是什么?

1) 购买 2 x 4TB 磁盘并使用非冗余条带化? (最便宜)

2) 购买 3 x 4TB 磁盘并使用冗余条带? (更贵)

3) 购买第二个8TB磁盘并镜像它? (最贵的)

请记住,我并不真正需要选项 2 和 3 的冗余(可用性),而且我更感兴趣的是维护数据(完整性),而不需要让磁盘不断地进行清理。

系统详细信息:intel i3 6100T 16Gb RAM 8TB WD Red Ubuntu 16.04(在单独的 SSD 上)

zfs 压缩和重复数据删除已关闭(它们最初是打开的,但后来我将其关闭)

谢谢阅读

答案1

我认为出于数据完整性目的需要进行清理,因为整个数据集存储在单个物理磁盘上?

仅当数据集访问该数据集中的所有重要文件的频率不足以让 ZFS 的正常文件检查机制足够快地发现问题时,才需要 ZFS 清理。如果您选择每周清理一次,但您的正常使用模式每天读取或修改所有重要数据块一次,则清理是多余的。

对于像您这样的情况,某些文件可能多年都无法访问,但随后需要在那里当他们终于获得访问,定期磨砂确实是一个好主意。

现在,话虽如此,清理对单磁盘池所做的所有工作就是将具有损坏块的文件标记为不可访问。没错:如果 ZFS 在此类文件中检测到哪怕一个位错误,它都会拒绝让您读取整个文件。 ZFS 仅传送它知道未损坏的数据。

这就是为什么您希望将 ZFS 与一定量的冗余存储一起使用(如果可能的话)。如果您给 ZFS 一个镜像来使用,那么相同的块两个都镜子必须被破坏才能得到相同的结果。

ZFS 仍然允许您在单磁盘池上从这种情况中手动恢复:从备份恢复该文件。 (希望也有类似的校验和,这样您就知道您正在恢复文件的未损坏版本。)因为 ZFS 是一个写时复制文件系统中,恢复的文件存储在未使用的数据块中,并且旧版本被删除,包括其损坏的数据块。

如果我购买更多磁盘并使用某种形式的 raidz,鞭打问题会得到解决吗?

如果池空闲,则清理将花费与读取整个池大约相同的时间。对于如此大的磁盘,我预计需要 8 到 24 小时。

如果花费的时间比这长得多,则池一定没有闲置。如果你想法如果池空闲,那么您可能有一些后台任务经常中断清理,从而阻止 ZFS 快速完成其低优先级后台清理作业。

我感觉到这是某种家庭媒体服务器,所以尝试这个实验:在睡觉前启动磨砂,将机器关闭到单用户模式,然后运行以下命令:

# watch -n 120 zpool status

记下磨砂膏需要多长时间,然后上床睡觉。当您在睡了 N 小时后早上起床时,看看该估计时间是否多于或少于 N 小时。我怀疑它的下降幅度会比 N 多很多,因为现在系统除了清理该磁盘之外几乎没有其他事情可做。

在这种情况下,您需要找出在多用户模式下运行的哪个后台进程不断晃动 ZFS 的肘部,从而阻止它完成大量有用的工作。

至于您的实际问题,不,购买更多磁盘并不会使清理速度更快。它只会给 ZFS 更多的机会从数据损坏事件中自动恢复。无论您提供多少个磁盘,ZFS 仍然必须读取磁盘上的所有数据块才能进行清理,而对于当今的多 TB 磁盘来说,这需要几个小时。

请注意:添加磁盘也会降低整个池的 MTBF,但这就是权衡:前期和长期花费更多的钱来从错误中恢复,而不必求助于备份。 ZFS 不是备份,但通过冗余存储,它可能会减少您需要返回文件备份的次数。

(备份不仅仅可以防止存储介质故障:意外删除、恶意软件、异地灾难恢复等。您仍然需要使用 ZFS 进行备份。)

购买 2 x 4TB 磁盘并使用非冗余条带化? (最便宜)

这是 MTBF 的一半,除了速度之外没有任何优势。仅在您可以承受失去整个池的池上执行此操作。

购买 3 x 4TB 磁盘并使用冗余条带? (更贵)

鉴于更换现代多 TB 池中的驱动器可能需要几个小时,我建议至少使用双冗余,这意味着您需要磁盘和 raidz2。对于简单的2路镜像,如果其中一个磁盘出现故障,如果直接更换坏磁盘来修复它,就没有冗余。当你等待替代者到达时,你也没有多余的时间。 (如果你手头已经有了替换件,你就会把它放在泳池里作为备用,对吧?正确的?

只有一个有限的例外,即当您的存储系统中有空闲插槽时,ZFS 镜像可让您将替换项添加到 N 路镜像,暂时使其成为 N+1 路镜像。然后,ZFS 重建过程能够检查坏磁盘上的好块,以检查磁盘上的任何坏块。思考还是不错的。不过,这只适用于出现软错误的磁盘。如果磁盘发生严重故障,您将返回到 N-1 冗余,如果 N 为 2,则没有冗余。

购买第二个 8TB 磁盘并对其进行镜像? (最贵的)

在您的三个选项中,这是我选择的一个,因为通过镜像组扩展 ZFS 池是最简单的选项。它为您提供了轻松移动到 3 路镜像的选项,而如果不重建整个池,则无法从 raidz1 移动到 raidz2。

我并不真正需要选项 2 和 3 的冗余(可用性)&我对维护数据(完整性)更感兴趣

除非您对自己的备份有 100% 的信心,否则这似乎是一个没有区别的区别。如果您的备份有可能在您获取后发生位腐烂,或者您没有备份需要恢复的文件,则您不可用的数据的剩余完整性为零。

坦率地说,我建议使用另一个冗余 ZFS 池来备份冗余 ZFS 池,否则您如何信任备份?

是的,它变得昂贵。现在您需要决定您是否愿意将 8TB 的数据连接到您的计算机上。

相关内容