如何从池中删除设备

dub*_*bis 4 zfs solaris

当我在我的 raidz 池中添加一个新设备时我犯了一个错误,认为 ZFS 应该自动执行它。

 :~# zpool status
  pool: data
 state: ONLINE

 scan: resilvered 78,3G in 2h4m with 0 errors on Tue May 10 18:12:31 2016
config:

    NAME         STATE     READ WRITE CKSUM
    data         ONLINE       0     0     0
      raidz2-0   ONLINE       0     0     0
        c2t2d0   ONLINE       0     0     0
        c2t3d0   ONLINE       0     0     0
        c2t4d0   ONLINE       0     0     0
        c2t5d0   ONLINE       0     0     0
        c2t6d0   ONLINE       0     0     0
        c2t7d0   ONLINE       0     0     0
        c2t8d0   ONLINE       0     0     0
        c2t9d0   ONLINE       0     0     0
        c2t10d0  ONLINE       0     0     0
        c2t11d0  ONLINE       0     0     0
      c2t13d0    ONLINE       0     0     0
    spares
      c2t12d0    AVAIL   
      c2t14d0    AVAIL 
Run Code Online (Sandbox Code Playgroud)

我在想 c2t13d0 不在 raidz 池中,是吗?如何从数据池中删除它?

感谢您的帮助。

cas*_*cas 7

你不能。它现在作为单驱动器 vdev 位于池中。无法从池中删除 vdev。

这就是坏消息。

更糟糕的消息是,您现在已经有效地获得了带有raidz2-0vdev 和c2t13d0vdev的 RAID-0 。这是不好的。这是双加不好。

您的选择是:

  • 与您创建的游泳池共存
  • 备份、销毁和重新创建池,然后恢复。

这两种选择都不好。从长远来看,备份/重新创建/恢复是正确的选择,但需要大量停机时间(避免这种情况的唯一方法是创建一个相同大小或更大的第二个池zfs send)。


顺便说一句,解决冗余不足的方法之一是将镜像附加到c2t13d0vdev。如果它们的大小相同,也许可以使用其中一个备件。

使用类似的东西:

zpool attach data c2t13d0 anotherdisk
Run Code Online (Sandbox Code Playgroud)

这远非理想,但使用镜像 vdev 条带化的 RAIDZ2 vdev 具有冗余(仍然令人厌恶,但不会吃掉您的数据),而使用单驱动器条带化的 RAIDZ2 没有任何可靠的冗余(您的某些数据将仅在单驱动器 vdev 上。这将始终成为您最有价值和不可替代的数据)。

它确实使第一个选项(“接受它”)的吸引力减少了很多……至少现在是这样。从长远来看,您会想要重建您的游泳池。

我无权访问 Solaris 手册页,但这是手册页的 ZFS On Linux 版本的相关摘录zpool(我添加了粗体以强调)。Solaris 版本应该相同或非常相似:

zpool attach [-f] [-o property=value] pool device new_device

将 new_device 附加到现有 zpool 设备。现有设备不能是 raidz 配置的一部分。如果 device 当前不是镜像配置的一部分,则 device 会自动转换为 device 和 new_device 的双向镜像。如果设备是双向镜像的一部分,则附加 new_device 会创建一个三向镜像,依此类推。无论哪种情况,new_device 都会立即开始重新同步。