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 时,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)
您必须以相反的方式执行此操作:替换发生故障的池磁盘(使用新磁盘或本身),然后从池中分离备用磁盘(以便所有 vdev 都可以使用它)。我假设只要用来替换的磁盘本身没有被替换,备用磁盘就忙。分离该磁盘或另一个磁盘只会使情况变得更糟。
另外,我记得 ZoL 没有根据事件自动附加/分离备件,您必须编写自己的脚本或使用ZFS 事件守护程序之类的东西。
如果C盘有故障,那么我们更换它然后将其分离。但它弄乱了我的池,因为 zpool 不记得我曾经在镜像 1 中有一个 C 盘:/
这取决于你如何看待它。如果将磁盘从镜像中分离出来,它就不再相关了。它可能有缺陷,可能在另一个系统上使用,可能在制造商保修期内被更换。无论用它做什么,你的泳池都不在乎。
如果你只是分离磁盘,那么它就会降级;如果您改为提供另一个磁盘(从自动备用、手动备用或完全手动替换),则该磁盘将承担旧磁盘的角色(因此术语“replace新磁盘”完全取代旧磁盘的位置和职责)。
如果需要,您可以将分离的磁盘添加回池中,例如作为备用磁盘(因此与初始情况相反)。
备件只有在自动激活时才真正有意义。Sun设计的ZFS存储阵列有许多类似的磁盘,18到48个磁盘的数量并不少见。它们由多个 vdev 组成,例如 24 个磁盘系统的 4 个 RAID Z2。此外,它们由专门的管理员管理,但没有人可以 24/7 工作。因此,他们需要一些东西作为第一响应,并且它必须在所有 vdev 上运行,因为任何磁盘都可能随时出现故障。
因此,如果深夜第二个 vdev 中的磁盘发生故障,系统会自动采用两个配置的备用磁盘之一并替换故障磁盘,以便池正常工作(对于使用其上运行数据库的网站的客户来说,性能相同) , 例如)。早上,管理员阅读故障报告并排除原因:
如果您按照工程师为最常见的预期使用场景设计的方式来思考它,就会更有意义。这并不意味着您必须完全按照描述进行操作,这可能只是该行为的一个原因。
为什么更换C盘不足以重建满池?正如 oracle 博客和这里所解释的那样,我希望我不必为 zfs 分离磁盘来正确重建池(为了维护方便,最好保留拔出磁盘的 zpool 状态跟踪)
如上所示,您可以用另一个池磁盘或它本身替换池磁盘(备用磁盘将是空闲的并继续作为备用磁盘工作),或者您可以分离池磁盘,而备用磁盘将永久承担池磁盘的角色,并且您可以将池磁盘替换为池磁盘。必须手动添加另一个备用磁盘zpool add poolname spare diskname(可以是分离的磁盘或新磁盘)。
为什么 zpool 一直告诉我备用磁盘“忙”(它们确实不忙)?
我认为这是因为 IO 未完成。这可以解释为什么只花了一点时间就完成了操作。
请参阅下文:如何自动恢复我的备用磁盘?
zpool replace(而不是将其分离)。只有在更换池磁盘后并且没有自动管理(在我看来,除了特定的池布局和管理情况之外,这没有任何意义)的情况下,才需要对备用磁盘执行分离步骤。