将 ZFS 文件系统从一个池移动到另一个池

将 ZFS 文件系统从一个池移动到另一个池

我正在扩展 Solaris 10 U8 服务器,除了 root rpool 之外还添加一个额外的存储池。

将特定的 ZFS 文件系统从 rpool 移动到这个新的存储池的最有效/简单/可靠的方法是什么?

可以在线完成吗?还是我应该先关闭使用这些池的服务?

答案1

关于禁用服务的问题本质上取决于服务本身:

  • 他们是否正在积极地写入您计划移动的文件系统?
  • 它们是否存储了您想要保留的持久数据。

无论如何,发送 ZFS 文件系统可能需要很长时间。通过以下方式使服务大部分时间保持在线,可以最大限度地减少服务不可用的情况:

  • 创建快照

  • 按照之前建议的方式发送快照,但同时保持所有服务处于活动状态

  • 当另一个池接收到 fs 时,禁用与该文件系统绑定的关键服务。确保目标池上的新文件系统未被修改,因为更改稍后将被丢弃。

  • 创建第二个快照(例如快照2)

  • 逐步发送第二个快照,这将比前一次传输快得多。例如:

    zfs send -i rpool/filesystem@snapshot rpool/filesystem@snapshot2 \
        | zfs receive -F destinationpool/filesystem
    
  • 完成后,将文件系统挂载点从旧数据集移动到新数据集。例如:

    zfs set mountpoint=/application/directory.old rpool/filesystem
    zfs set mountpoint=/application/directory destination/filesystem
    

    您需要确保没有任何进程被绑定/application/directory(例如:访问文件或将其作为当前目录)来实现这一点。

  • 重新启用服务,您就完成了。

答案2

我重复了 jlliagre 所说的大部分内容,但对后代文件系统进行了补充。(主要是这样当我忘记时可以参考。)

如果您有子文件系统,则需要-r在 zfs 快照命令中使用标志,并在命令中使用-r或标志。大写字母会移动所有-Rzfs send-R特性、快照和克隆。

要移动整个池:

zfs snapshot -r sourcepool@moving
zfs send -R sourcepool@moving | zfs receive -F destpool

然后同步更改以缩短迁移期,关闭应用程序、关闭 samba、nfs

zfs snapshot -r sourcepool@moving2
zfs send -Ri sourcepool@moving sourcepool@moving2 | zfs receive -F destpool

如果您要为迁移创建多个中间快照,请阅读有关交换机的手册页zfs send -I

答案3

我认为这无法在线执行,但我的流程是关闭必要的服务,拍摄快照并使用 zfs send/receive 进行迁移。类似于:

zfs send rpool/filesystem@snapshot | zfs receive destinationpool/filesystem

编辑:

如果您安装了“管道视图”命令(pv),您可以使用以下方式监视传输的状态:

zfs send rpool/filesystem@snapshot | pv | zfs receive destinationpool/filesystem

答案4

您还会发现在管道中使用“mbuffer”之类的工具有一些好处;显然,如果两端都可以连续传输数据,ZFS 发送/接收性能会显著提高,而如果没有 mbuffer(或类似的东西),您就会得到乒乓效应,即一端不断阻塞另一端。

相关内容