如何以最少的停机时间迁移 zfs 池?

如何以最少的停机时间迁移 zfs 池?

我有一个 RAID1 ZFS 池,其中有 2 个 5TB 镜像驱动器和 2 个 1TB 镜像驱动器,我想用 4TB 驱动器替换这两个 1TB 设备。由于zpool add无法撤消[1],因此必须在以所需布局重新创建池后销毁池。

所以

  • zpool detach编辑了镜像设备并用它们创建了一个新池。
  • 由于挂载点重叠,以下命令失败后,我使用备用根目录重新导入了它zpool import -R /mnt/data1
  • 我创建了一个快照migrate1以便能够运行sudo zfs send -R data@migrate1 | sudo zfs receive -F data1当前正在进行的操作。

现在,我想知道zfs send管道完成后的最佳程序,因为根据我的理解,我必须让旧池data在备用根上挂载,并data1在重新启动后让新池不带备用根挂载,以便能够删除旧池并使其设备可连接到新池。也许还有其他方法。

我正在使用在 Ubuntu 17.10 上从源代码构建的 ZFS 0.7.0-182_gc0daec32f8 和 SPL 0.7.0-20_g35a44fcb,以及 Linux 4.13.0-16-generic。

我检查了

我知道这很复杂,并且将 1TB 设备保留在池中也不会有什么坏处,但这不是问题的一部分。


[1] 我将此作为 ZFSOnLinux 问题请求于https://github.com/zfsonlinux/zfs/issues/6857提供背后复杂计划/路线图的链接

答案1

我有一个 RAID1 ZFS 池,其中有 2 个 5TB 镜像驱动器和 2 个 1TB 镜像驱动器,我想用 4TB 驱动器替换这两个 1TB 设备。由于 zpool add 不可撤销[1],因此必须在以所需布局重新创建池后销毁池。

这听起来更像是条带镜像 (2x2),而不是 RAIDZ1 (至少 3x1)。无论哪种方式,您都可以通过一次移除和替换一个磁盘来扩展这两种配置。等待每个重新镀银完成,然后替换下一个磁盘。最后,在更换所有磁盘后,zpool offline池然后将zpool online -e其扩展到新大小(或autoexpand=true在扩展之前设置):

    zpool online [-e] pool device...
         Brings the specified physical device online. This command is not
         applicable to spares.

         -e      Expand the device to use all available space. If the
                 device is part of a mirror or raidz then all devices must
                 be expanded before the new space will become available to
                 the pool.

当然,您首先需要重新连接已拆卸的设备,因为只有在具有足够冗余的情况下才有可能进行替换。


除此之外,您还可以动态设置和更改挂载点,并且可以销毁具有活动挂载点的池(只要它们上没有活动 I/O)。如果它不起作用,zpool export/zpool import在大多数情况下都可以,重新启动也可以(如果您允许,并且这不是根池)。

相关内容