我可以从 ZFS 条带中移除磁盘吗?

我可以从 ZFS 条带中移除磁盘吗?

我在系统上有一个大型池。该系统是 Hadoop 集群中的存储节点,因此条带化是可行的,因为如果我们丢失了本地池,我们可以在集群级别重建数据。

磁盘出现故障:我可以让 ZFS 尝试将存储块从设备上移出,以便我可以将其移除,还是需要删除整个池并重建?理想情况下,我可以拔出磁盘,然后在换出故障硬件时添加新磁盘。

我认为答案是否定的,因为传统 RAID 在块级别运行,但也许 ZFS 存储池足够智能,至少会尝试重新定位文件数据。

> sudo zpool list
NAME   SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tank  19.9T  8.09T  11.8T        -         -    15%    40%  1.00x  DEGRADED  -
> sudo zpool status
  pool: tank
 state: DEGRADED
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 0B in 0 days 02:45:39 with 0 errors on Sun Jan  9 03:09:41 2022
config:

        NAME                               STATE     READ WRITE CKSUM
        tank                               DEGRADED     0     0     0
          ata-ST2000DM001-1ER164_Z4Z0xxxx  ONLINE       0     0     0
          ata-ST2000DM001-1ER164_Z4Z0xxxx  DEGRADED    96     0     0  too many errors
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc8xxxx           ONLINE       0     0     0
          scsi-35000cca22dc8xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          scsi-35000cca22dc7xxxx           ONLINE       0     0     0
          ata-ST2000DM001-1ER164_Z4Z3xxxx  ONLINE       0     0     0
          ata-ST2000NM0011_Z1P3xxxx        ONLINE       0     0     0

我预测答案是,当我准备更换故障磁盘时,我会首先销毁该池,更换磁盘,然后构建一个新池。

答案1

首先,ZFS 需要所有顶层 vdev 都正常运行,池才能运行。如果一个 vdev 脱机,您将无法访问池中的所有数据。您正在使用单个磁盘作为 vdev,因此如果该磁盘发生故障(而不是其当前状态为“许多读取错误”),您将不得不从头开始重新创建整个池。

如果您使用的是 Solaris 或者使用 OpenZFS 0.8 或更高版本,您应该能够运行:

zpool remove tank ata-ST2000DM001-1ER164_Z4Z0xxxx

这可能不起作用! 如果发生这种情况,可能会导致池的性能永久性下降。

删除 vdev 需要剩余磁盘上有足够的空间来容纳移位的数据。在这种情况下,看起来您可能有足够的空间,但我提到这个问题是为了完整性。

至少在 OpenZFS 上,删除 vdev 的时间存在一些限制。只有当您的池仅由单磁盘 vdev 和/或镜像 vdev 组成时,您才能删除 vdev。您的池符合条件,因为您只使用单磁盘 vdev。但如果您在 OpenZFS 上有任何 raidz、draid 或特殊分配 vdev,您将无法执行此操作。

最后需要注意的是,删除 vdev 会导致 OpenZFS 永久性的性能损失。OpenZFS 将记录所有之前位于已删除磁盘上的块的内部表。只要这些块从那时起存在于池中,对它们的所有访问都需要通过重新映射表进行间接查找。这会大大降低随机访问的速度。我对 Solaris ZFS 内部机制了解不够,无法判断它是否做了类似的事情。

当然,ZFS 需要读取故障磁盘上的所有数据才能将其删除。在此过程中,它很可能会遇到足够多的错误,导致磁盘故障。如果发生这种情况,如前所述,整个池将处于离线状态,并且可能无法恢复。

如果您有可用插槽来添加磁盘,最好插入备用磁盘,并用zpool replace新磁盘替换故障磁盘。这将产生相同的读取负载来复制数据(并将承担单个磁盘在此过程中发生故障的相同风险),但如果成功,您将无需担心 vdev 移除带来的潜在弊端。

总体而言,如果按照您目前的使用方式使用非冗余单磁盘 vdev,ZFS 可能会非常脆弱。有句老笑话说,RAID0 中的零表示您必须关心数据。从数据安全的角度来看,单磁盘 vdev 的 ZFS 池与 RAID0 基本相同。任何单个磁盘发生故障都可能导致您丢失所有数据。即使您有能力更换数据,也请确保考虑到更换所需的时间。如果您能够承受以性能损失换取数据安全,请考虑将您未来的池的磁盘放入 raidz2 vdev。如果您能够承受以可用磁盘空间换取数据安全(并可能提高读取性能),请考虑将您未来的池的磁盘放入镜像 vdev。

相关内容