zfs - 热备、替换、分离:资源正忙

4wk*_*wk_ 7 zfs debian zfsonlinux

我对zfsonlinux陌生。我刚刚成功建立了一个全新的服务器,在 ZFS 上有一个 Debian ROOT。一切正常,但我遇到了热备用和更换磁盘的问题。

这是我的游泳池:

NAME                            STATE     READ WRITE CKSUM
mpool                           ONLINE       0     0     0
  mirror-0                      ONLINE       0     0     0
    ata-ST1XXXXXXXXXXA-part1    ONLINE       0     0     0
    ata-ST1XXXXXXXXXXB-part1    ONLINE       0     0     0
  mirror-1                      ONLINE       0     0     0
    ata-ST1XXXXXXXXXXC-part1    ONLINE       0     0     0
    ata-ST1XXXXXXXXXXD-part1    ONLINE       0     0     0
spares  
  ata-ST1XXXXXXXXXXE-part1      AVAIL   
  ata-ST1XXXXXXXXXXF-part1      AVAIL  
Run Code Online (Sandbox Code Playgroud)

现在,我可以开始真正的乐趣了。拉盘!我现在正在拔下磁盘 C。我有一个工作池,但降级(如预期):

NAME                            STATE     READ WRITE CKSUM
mpool                           ONLINE       0     0     0
  mirror-0                      ONLINE       0     0     0
    ata-ST1XXXXXXXXXXA-part1    ONLINE       0     0     0
    ata-ST1XXXXXXXXXXB-part1    ONLINE       0     0     0
  mirror-1                      DEGRADED     0     0     0
    ata-ST1XXXXXXXXXXC-part1    UNAVAIL      0     0     0
    ata-ST1XXXXXXXXXXD-part1    ONLINE       0     0     0
spares  
  ata-ST1XXXXXXXXXXE-part1      AVAIL   
  ata-ST1XXXXXXXXXXF-part1      AVAIL   
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好。但是,当我尝试将磁盘 C 替换为磁盘 E 时,无论如何我都被 DEGRADED 池困住了。

# zpool replace mpool ata-ST1XXXXXXXXXXC-part1 ata-ST1XXXXXXXXXXE-part1
cannot open '/dev/disk/by-id/ata-ST1XXXXXXXXXXE-part1': Device or ressource busy
(and after a few sec)
Make sure to wait until resilver is done before rebooting.
Run Code Online (Sandbox Code Playgroud)

所以我等了几秒钟让重新同步(有 0 个错误),然后我有:

NAME                                STATE     READ WRITE CKSUM
mpool                               ONLINE       0     0     0
  mirror-0                          ONLINE       0     0     0
    ata-ST1XXXXXXXXXXA-part1        ONLINE       0     0     0
    ata-ST1XXXXXXXXXXB-part1        ONLINE       0     0     0
  mirror-1                          DEGRADED     0     0     0
    spare-0                         UNAVAIL
        ata-ST1XXXXXXXXXXC-part1    UNAVAIL      0     0     0
        ata-ST1XXXXXXXXXXE-part1    ONLINE       0     0     0
    ata-ST1XXXXXXXXXXD-part1        ONLINE       0     0     0
spares  
  ata-ST1XXXXXXXXXXE-part1          INUSE       currently in use   
  ata-ST1XXXXXXXXXXF-part1          AVAIL   
Run Code Online (Sandbox Code Playgroud)

然后,如果我zpool detach的C盘(如解释在这里),我的池再次在线获取,所有工作正常(一个带游泳池只有5 HDD)


所以这里是我的问题:

  1. 为什么更换C盘还不足以重建全池?作为解释在Oracle博客这里太我期待,我没有要分离磁盘的ZFS重建正确的游泳池(和它远远更好地保持在拔出磁盘的zpool状态的痕迹,对于maintening方便)
  2. 为什么 zpool 一直告诉我备用磁盘“忙”(它们确实不是)?
  3. 见下文:如何自动取回我的备用磁盘?

编辑:对于问题 1 来说甚至是最糟糕的 => 当我重新插入磁盘 C 时,zfs 不管理我的备用备份!所以我只剩下一个磁盘

NAME                                STATE     READ WRITE CKSUM
mpool                               ONLINE       0     0     0
  mirror-0                          ONLINE       0     0     0
    ata-ST1XXXXXXXXXXA-part1        ONLINE       0     0     0
    ata-ST1XXXXXXXXXXB-part1        ONLINE       0     0     0
  mirror-1                          ONLINE       0     0     0
    ata-ST1XXXXXXXXXXE-part1        ONLINE       0     0     0
    ata-ST1XXXXXXXXXXD-part1        ONLINE       0     0     0
spares  
  ata-ST1XXXXXXXXXXF-part1          AVAIL 
Run Code Online (Sandbox Code Playgroud)

use*_*391 5

简洁版本:

您必须以相反的方式执行此操作:替换发生故障的池磁盘(使用新磁盘或本身),然后从池中分离备用磁盘(以便所有 vdev 都可以使用它)。我假设只要用来替换的磁盘本身没有被替换,备用磁盘就忙。分离该磁盘或另一个磁盘只会使情况变得更糟。

另外,我记得 ZoL 没有根据事件自动附加/分离备件,您必须编写自己的脚本或使用ZFS 事件守护程序之类的东西。


长版:

关于您的后续评论

如果C盘有故障,那么我们更换它然后将其分离。但它弄乱了我的池,因为 zpool 不记得我曾经在镜像 1 中有一个 C 盘:/

这取决于你如何看待它。如果将磁盘从镜像中分离出来,它就不再相关了。它可能有缺陷,可能在另一个系统上使用,可能在制造商保修期内被更换。无论用它做什么,你的泳池都不在乎。

如果你只是分离磁盘,那么它就会降级;如果您改为提供另一个磁盘(从自动备用、手动备用或完全手动替换),则该磁盘将承担旧磁盘的角色(因此术语“replace新磁盘”完全取代旧磁盘的位置和职责)。

如果需要,您可以将分离的磁盘添加回池中,例如作为备用磁盘(因此与初始情况相反)。

备件如何在 ZFS 系统上工作

备件只有在自动激活时才真正有意义。Sun设计的ZFS存储阵列有许多类似的磁盘,18到48个磁盘的数量并不少见。它们由多个 vdev 组成,例如 24 个磁盘系统的 4 个 RAID Z2。此外,它们由专门的管理员管理,但没有人可以 24/7 工作。因此,他们需要一些东西作为第一响应,并且它必须在所有 vdev 上运行,因为任何磁盘都可能随时出现故障。

因此,如果深夜第二个 vdev 中的磁盘发生故障,系统会自动采用两个配置的备用磁盘之一并替换故障磁盘,以便池正常工作(对于使用其上运行数据库的网站的客户来说,性能相同) , 例如)。早上,管理员阅读故障报告并排除原因:

  • 如果磁盘已损坏,他可能会在同一个托盘中用替换磁盘替换它,让它重新同步,然后热备用自动退出备用状态,监视另一个可以执行第一响应的损坏磁盘。
  • 如果没有可用的替换磁盘,他甚至可能将备用磁盘作为新的数据磁盘,暂时将备用磁盘数量减少 1(直到另一个替换磁盘发货,该磁盘将成为新的备用磁盘)。
  • 如果只是控制器错误导致磁盘丢失,他甚至可能会自行替换它,从而触发与第一种情况相同的备用更新。

如果您按照工程师为最常见的预期使用场景设计的方式来思考它,就会更有意义。这并不意味着您必须完全按照描述进行操作,这可能只是该行为的一个原因。

回答您的问题

为什么更换C盘不足以重建满池?正如 oracle 博客和这里所解释的那样,我希望我不必为 zfs 分离磁盘来正确重建池(为了维护方便,最好保留拔出磁盘的 zpool 状态跟踪)

如上所示,您可以用另一个池磁盘或它本身替换池磁盘(备用磁盘将是空闲的并继续作为备用磁盘工作),或者您可以分离池磁盘,而备用磁盘将永久承担池磁盘的角色,并且您可以将池磁盘替换为池磁盘。必须手动添加另一个备用磁盘zpool add poolname spare diskname(可以是分离的磁盘或新磁盘)。

为什么 zpool 一直告诉我备用磁盘“忙”(它们确实不忙)?

我认为这是因为 IO 未完成。这可以解释为什么只花了一点时间就完成了操作。

请参阅下文:如何自动恢复我的备用磁盘?

  • 启用自动备件更换(Solaris/illumos 上默认,Linux 上有点麻烦)
  • 将出现故障的池磁盘替换为zpool replace(而不是将其分离)。只有在更换池磁盘后并且没有自动管理(在我看来,除了特定的池布局和管理情况之外,这没有任何意义)的情况下,才需要对备用磁盘执行分离步骤。