是否可以在不需要完全重新镀银的情况下分离并重新连接 ZFS 磁盘?

是否可以在不需要完全重新镀银的情况下分离并重新连接 ZFS 磁盘?

我有一个总共有四个驱动器的 ZFS 镜像池。其中两个驱动器用于轮换异地备份。我的预期是,在初始重新同步之后,我可以detach稍后再attach对磁盘进行增量重新同步 - 然而在测试中,无论连接的磁盘是否已经包含几乎所有池内容,它似乎都会执行完整的重新同步。

使用offline/online方法是否会给我带来仅更新磁盘(而不是完全重建磁盘)的预期结果?或者,要使它按预期工作,我是否需要做一些完全不同的事情 - 例如将每个备份磁盘用作 1 磁盘池,并send在需要更新时将最新快照添加到其中?

答案1

不要破坏 ZFS 阵列以“旋转”异地磁盘。正如您所见,重建时间很长,并且重新同步过程将读取/验证用过的数据集的大小。

如果您有能力,快照和将数据发送到远程系统是一种干净、非侵入式的方法。我想您可以经历拥有专用的单磁盘池、复制到它以及 zpool 导出/导入的过程……但这不太优雅。

答案2

经过进一步的试验,我找到了一个不错的解决方案,但它有一个很大的代价。已offline删除但未分离的磁盘稍后可以通过增量重新镀银操作重新联机(“当设备上线时,任何已写入池的数据都会与新可用的设备重新同步。“)。在我的测试中,这将 3 磁盘镜像的重新镀银时间从 28 小时缩短至 30 多分钟,数据增量约为 40GB。

代价是,任何具有离线磁盘的池都将被标记为已降级。只要仍有至少两个在线磁盘(在镜像池中),这实际上就是一个警告——完整性和冗余度保持不变。

正如其他人提到的,这种整体方法远非理想 - 将快照发送到远程池会更合适,但在我看来是不可行的。

总而言之,如果您需要从池中删除磁盘,然后稍后将其添加回来而不需要完全重新镀银,那么我建议的方法是:

  • 使池中的磁盘脱机:zpool offline pool disk
  • 降低驱动器转速(如果要物理拉动):hdparm -Y /dev/thedisk
  • 使池处于降级状态,驱动器处于离线状态
  • 将磁盘添加回池:zpool online pool disk

而且,由于这尚未经过测试,因此存在增量重新同步操作不准确的风险。“实时”池和/或离线磁盘可能会遇到问题。如果我遇到这种情况,我会更新,但现在我会尝试这种方法。

答案3

更新2015 年 10 月 15 日:今天我发现了该zpool split命令,它可以将新池(使用新名称)从现有池中分离出来。 splitoffline和更干净detach,因为两个池可以存在于同一系统上(并分别清理)。新池export[ed]在从系统中拔出之前也可以干净地(正确地)清理。

(我的原始帖子如下。)

警告! 此页面上的各种评论暗示可以(或可能)访问zpool detach驱动器,然后以某种方式重新连接驱动器并访问其中包含的数据。

然而,根据此主题(以及我自己的实验) zpool detach从分离的驱动器中删除“池信息”。换句话说,detach就像快速重新格式化驱动器。一段时间后,detach大量数据可能仍在驱动器上,但几乎不可能重新挂载驱动器并将数据查看为可用文件系统。

因此,在我看来,这detach比更具破坏性destroy,因为我相信zpool import可以恢复被毁坏的池!

detach不是A umount也不A zpool export也不A zpool offline

在我的实验中,如果我先将zpool offline一个设备移出,然后再移出zpool detach同一个设备,则池中的其余设备会忘记该设备曾经存在过。但是,由于设备本身offline[d]在 之前就已经存在detach[ed],因此设备本身永远不会收到 的通知detach。因此,设备本身仍然具有其池信息,并且可以移至另一个系统,然后import[ed](处于降级状态)。

为了增加保护,您甚至可以在发出命令之后、发出命令之前detach物理拔下设备。offlinedetach

我希望使用这个offline,然后detach,然后的import过程来备份我的池。与原始海报一样,我计划使用四个驱动器,两个用于持续镜像,两个用于每月轮换异地(和离线)备份。我将通过在单独的系统上导入和清理来验证每个备份,然后再将其传输到异地。与原始海报不同,我不介意每月重写整个备份驱动器。事实上,我更喜欢完全重写,以便获得新鲜的部分。

答案4

在同一台机器上,您是否尝试过创建一个包含 2 个驱动器镜像的新池?接下来,在您的工作池上创建一个快照,然后将该快照发送到新池,重复此操作,然后下一个快照发送将是增量的。这与“将数据发送到远程系统”不同,因为这是同一系统/服务器/机器内的池。使用此设置,您仍然可以应用 zpool split/offline/detach/attach,但您只能在第二个(副本)池中执行此操作,而不是在源池中执行此操作。

相关内容