我正在扩展 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
或标志。大写字母会移动所有-R
zfs 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(或类似的东西),您就会得到乒乓效应,即一端不断阻塞另一端。