zfs – 热备份,replace,分离:资源很繁忙

我对zfsonlinux很新。 我刚刚成功地build立了一个全新的服务器,在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 

现在,我可以从真正的乐趣开始。 磁盘拉! 我现在拔出磁盘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 

到现在为止还挺好。 但是,当我尝试replace磁盘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. 

所以我在等待几秒钟让重新连接(有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 

然后,如果我zpool detach的C盘(如这里解释),我的池再次联机,并一切工作正常(只有5个硬盘池)


所以这是我的问题:

  1. 为什么更换C盘不足以重build一个完整的池? 正如在oracle博客上所解释的那样,我也在这里期待着我不必为了zfs而分离磁盘来正确地重build池(为了维护方便,保留在拔出的磁盘的zpool状态轨迹上好得多)
  2. zpool为什么告诉我备件磁盘是“忙”(他们确实不是)?
  3. 请参阅下面的内容:如何自动取回备用磁盘?

编辑:即使最坏的问题1 =>当我插回磁盘C,zfs不pipe理我的备用! 所以我只剩下一个磁盘了

 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 

简洁版本:

您必须反过来:更换失败的池磁盘(使用新磁盘或使用自己),然后将备用磁盘从池中分离出来(以便它可供所有vdevs使用)。 我认为,只要用来replace的磁盘本身没有被replace,那么备用磁盘就很忙。 分离此磁盘或另一个磁盘只会使情况变得更糟。

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


长版本:

关于你的后续评论

如果C盘FAULTED,好吧,让我们取代它,然后分离它。 但它上了我的池,因为zpool不记得我曾经有一个C盘在镜像-1:/

这取决于你如何看待它。 如果从镜像中分离磁盘,则不再相关。 这可能是有缺陷的,它可能会在另一个系统上使用,它可能会在制造商的保修期内被replace。 不pipe用它做什么,你的游泳池都不在乎。

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

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

备份如何在ZFS系统上工作

备件只有在自动激活时才有意义。 由Sundevise的ZFS存储arrays有许多类似的磁盘,数量为18到48个磁盘并不less见。 它们由多个vdevs组成,例如4个用于24个磁盘系统的RAID Z2。 另外,他们由一个专门的pipe理员pipe理,但没有人能24/7工作。 因此,他们需要一些东西作为第一个响应,而且必须在所有vdevs上工作,因为任何时候任何磁盘都可能会失败。

因此,如果深夜在第二个vdev中的磁盘出现故障,系统会自动采用两个configuration的备用磁盘之一,并replace故障磁盘,以便池像往常一样工作(使用数据库上运行数据库的网站的客户性能相同, 例如)。 早上,pipe理员读取失败的报告并排除原因:

  • 如果磁盘已经死掉,可以用同一个磁盘托盘中的replace磁盘replace它,让它变成可恢复的,然后磁盘会自动退到备用状态,观察另一个死磁盘,它可以做出第一个响应。
  • 如果没有更换磁盘可用,他甚至可以将备用磁盘备份到新数据磁盘,临时将备件数量减less1(直到另一个更换磁盘出货,这将成为新的备用磁盘)。
  • 如果这只是一个控制器错误的丢失的磁盘,他甚至可能会replace它自己,引发与第一种情况相同的备用更新。

如果您按照工程师为最常见的预期使用情况devise的方式来考虑,那么这将更有意义。 这并不意味着你必须完全按照所描述的,它可能是一个行为的原因。

您的问题的答案

为什么更换C盘不足以重build一个完整的池? 正如在oracle博客上所解释的那样,我也在这里期待着我不必为了zfs而分离磁盘来正确地重build池(为了维护方便,保留在拔出的磁盘的zpool状态轨迹上好得多)

如上所示,您可以将池磁盘replace为另一个或其自身(备用将是空闲的,并继续作为备用),也可以分离池磁盘,而备用磁盘将永久承担池磁盘的angular色,而您必须手动添加另一个备用磁盘zpool add poolname spare diskname磁盘名称(可以是分离的磁盘或新的一个)。

zpool为什么告诉我备件磁盘是“忙”(他们确实不是)?

我认为这是因为杰出的IO。 这就解释了为什么只花了一点时间才能完成这个操作。

请参阅下面的内容:如何自动取回备用磁盘?

  • 启用自动备件更换(在Solaris上是缺省的,在Linux上很麻烦)
  • zpool replace (而不是分离它)replace故障的池磁盘。 更换池磁盘后,如果您没有自动pipe理(除了特定的池布局和pipe理情况,这对我来说是没有意义的),则备用磁盘只需要分离步骤。