![从已填充的 ext4 磁盘扩展 ZFS 池](https://linux22.com/image/1412056/%E4%BB%8E%E5%B7%B2%E5%A1%AB%E5%85%85%E7%9A%84%20ext4%20%E7%A3%81%E7%9B%98%E6%89%A9%E5%B1%95%20ZFS%20%E6%B1%A0.png)
我有一台 Ubuntu 媒体服务器,其中有 4 个 ext4 2TB 驱动器、1 个 ext4 4TB 驱动器和 1 个新的空白 4TB 驱动器。ext4 卷配置为单独的驱动器(不是 RAID 等)。2TB 驱动器已满约 70%,4TB 驱动器已满约 50%。
我想将它们全部转换为共享 ZFS 池,以便获得其提供的驱动器故障/位腐烂保护。我的问题是:我可以一次执行一个磁盘的操作吗(将空磁盘格式化为 ZFS,将数据从 ext4 4TB 移动到 ZFS 4TB,然后将现在空的 ext4 4TB 驱动器添加到池中,然后将数据从其中一个 2TB 驱动器移过去并将该磁盘添加到池中,等等。这可能吗?人们会推荐哪种配置?RAID-Z?
答案1
您可以在创建池之后将设备添加到池中,但是方式似乎并非您所想象的那样。
使用 ZFS,唯一可以添加设备的冗余配置是镜像。目前无法在创建 raidzN vdev 后添加更多设备。向镜像添加设备会增加冗余度,但不会增加可用的存储容量。
可以在一定程度上解决这个问题,通过使用稀疏文件创建所需配置的 raidzN vdev冗余设备,然后删除稀疏文件,然后再用数据填充 vdev。一旦有驱动器可用,您就会用zpool replace
这些驱动器填充(现在不存在的)稀疏文件。使用这种方法作为更理想解决方案的迁移路径的问题在于,池将不断显示为,DEGRADED
这意味着您必须更加仔细地查看才能识别任何实际的存储质量下降;因此,我并不建议将其作为永久解决方案。
简单地将设备添加到 ZFS 池实际上会带来严重的风险减少池对故障的恢复能力,因为所有顶层 vdev 都必须正常运行,池才能正常运行。这些顶层 vdev 可以具有冗余配置,但这不是必须的;完全可以在 JBOD 样式的配置中运行 ZFS,在这种情况下,单个设备故障很可能会导致池瘫痪。(如果可以避免,这是一个坏主意,但即使在单驱动器设置中仍可为您提供许多 ZFS 功能。)基本上,冗余 ZFS 池由一个或多个冗余 vdev 的 JBOD 组合组成;非冗余 ZFS 池由一个或多个 JBOD vdev 的 JBOD 组合组成。
添加顶层 vdev 也不会导致 ZFS 将数据平衡到新设备上;它最终对于被重写的数据会发生这种情况(由于文件系统的写时复制特性和优先使用具有更多可用空间的 vdev),但对于只存在并被读取但从未被重写的数据,则不会发生这种情况。您可以通过重写数据来实现这一点(例如通过使用zfs send | zfs recv
,假设池未启用重复数据删除),但这确实需要您采取特定操作。
根据您帖子中的数字,您有:
- 4 × 2TB 硬盘
2 个 4TB 硬盘
大约 8 TB 的数据
既然你说你想要一个冗余配置,考虑到这些限制(特别是可用的驱动器集),我可能会建议将驱动器分组为镜像对。这将为您提供如下池布局:
- 坦克
- 镜像-0
- 2TB硬盘1
- 2TBHDD2
- 镜像-1
- 2TBHDD3
- 2TB硬盘4
- 镜子-2
- 4TB硬盘1
- 4TB硬盘2
- 镜像-0
此设置将具有大约 8 TB 的用户可访问存储容量,包括元数据开销(您有两个镜像,每个镜像提供 2 TB,加上一个镜像提供 4 TB,总共 8 TB)。您可以稍后添加更多镜像对以增加池容量,或用 4 TB 驱动器替换一对 2 TB 驱动器(但请注意,如果镜像对中的驱动器发生故障,则重新同步会给其余驱动器带来严重压力,在双向镜像的情况下,会大大增加镜像完全故障的风险)。这种配置的缺点是,池子从一开始就几乎是满的,一般建议将 ZFS 池保持在 75% 以下。如果您的数据大部分时间只被读取,那么您可以减少裕度,但性能将受到很大影响尤其是在写入方面。如果您的数据集写入量很大,那么您肯定希望块分配器能够有一定的余地。因此,对于某些定义而言,此配置将“有效”,但不是最优的。
由于您可以自由地向 vdev 添加额外的镜像设备,通过一些规划,应该可以以不丢失任何数据的方式执行此操作。
原则上,你可以用最终由四个 2 TB HDD 组成的单个 raidz1 vdev 替换上面的镜像 0 和镜像 1(为你提供 6 TB 的可用存储容量,而不是 4 TB,并且能够在数据面临风险之前承受任何一个 2 TB HDD 故障),但这意味着最初将其中三个驱动器提交给 ZFS。考虑到你的使用数据,听起来像这样可能可以通过一些数据重组来实现。不过,我不建议混合使用不同冗余级别的 vdev,我认为在这种情况下,这些工具甚至会迫使您有效地说“是的,我确实知道自己在做什么”。
在一个池中混合使用不同大小的驱动器(以及尤其在单个 vdev 中(除非作为迁移到更大容量驱动器的路径)实际上并不推荐;在镜像和 raidzN vdev 配置中,vdev 中最小的组成驱动器决定了 vdev 容量。混合不同容量的 vdev 是可行的,但会导致存储设置不平衡;但是,如果您的大多数数据很少被读取,并且读取时是顺序读取的,则后者不应该出现重大问题。
最佳配置可能是获得额外的三个 4 TB 驱动器,然后创建一个由这五个 4 TB 驱动器组成的单个 raidz2 vdev 组成的池,并有效地淘汰 2 TB 驱动器。raidz2 中的五个 4 TB 驱动器将为您提供 12 TB 的存储容量(留出相当大的增长空间),并且 raidz2 使您能够承受其中两个驱动器发生故障,在磁盘问题恢复能力方面,镜像设置遥遥领先。通过一些规划和数据改组,应该很容易迁移到这样的设置而不会丢失数据。五个驱动器 raidz2 也是接近最优根据一位用户执行的测试(该测试于 4 月底发布在 ZFS On Linux 讨论列表中),在存储开销方面,使用 1 TB 设备时,可用存储容量达到最佳值的 96.4%,仅次于每个 vdev 六个驱动器的配置,在同一测试中达到 97.3%。
我确实意识到五个 4 TB 驱动器在家庭环境中可能并不实用,但请记住 ZFS 是一个企业文件系统,它的许多限制(特别是在这种情况下,创建后增加冗余 vdev 的限制)都反映了这一点。
永远记住,没有类型的 RAID 是备份. 您需要同时确保二者的合理安全性,以免丢失数据。