ZFS 发送/接收完整快照

ZFS 发送/接收完整快照

我一直通过 并将服务器 A 中的 ZFS 池备份到服务器 B(备份服务器)zfs send/recv,并使用每日增量快照。

服务器 B 充当备份服务器,分别为服务器 A 和服务器 C 保留 2 个池 (zfs41zfs49/tank)

由于硬件问题,服务器 A 中的 ZFS 池现已消失 - 我想尽快恢复/恢复它。

目前我的服务器B中的快照列表如下:

NAME                        USED  AVAIL     REFER  MOUNTPOINT
zfs41@2021Nov301205        14.9G      -     3.74T  -
zfs41@2021Dec011205        3.87G      -     3.74T  -
zfs41@2021Dec021205        3.77G      -     3.74T  -
zfs41@2021Dec031205           0B      -     3.74T  -
zfs49/tank@2021Nov301705   368G      -     3.52T  -
zfs49/tank@2021Dec011705  65.2G      -     3.52T  -
zfs49/tank@2021Dec021705  66.4G      -     3.52T  -
zfs49/tank@2021Dec031705     0B      -     3.52T  -

zfs49/tank@2021Dec031705服务器 B 的最新版本在哪里

我想将整个池(包括快照)发送回服务器 A,但我不确定要运行的确切命令。

问题:在服务器 B 上,这样做是否zfs send zfs49/tank@2021Dec031705 | ssh <Server A host ip> zfs recv tank足以接收服务器 A 上的完整 ZFS 池 + 所有快照(以便我可以继续增量发送/接收备份)?

答案1

首先,您需要在服务器 A 上创建一个空池。 zfs recv无法创建新池。所以在服务器A上:

zpool create -R /mnt zfs49 [ mirror diskID1 diskID2 ]

...或您选择的其他 VDEV 结构。服务器 A 上的 VDEV 结构不需要与您丢失的池的旧结构相匹配。它只需要足够大来容纳数据。因此,如果您从上次所做的选择中获得了经验,那么这次创建池时可以随意做出更好的选择。但是,是的,如果您使用 4k 原生驱动器,您仍然需要ashift=12等。

另外,我从下面的评论中得知,池和文件系统名称将相同,因此我们将服务器 B 上的池zfs49文件系统恢复到服务器 A 上的池文件系统。tankzfs49tank

与其显式地传输每个文件系统,不如说明如何使用 arecursive snapshot来传输整个池(包括所有文件系统及其快照)可能会更有益。

在上面的服务器 A 上创建空池后,下一步是在服务器 B 上创建最新的递归快照。该快照主要用于一次性恢复作业,因此不需要匹配您的命名方案YYYYMonDDHHMM。事实上,由于此恢复作业快照可能是短暂的,因此将其从其他作业快照中脱颖而出可能会有所帮助。

我建议您在服务器 B 上创建一个递归快照并将其命名为xfer,以用于此一次性传输的特定目的。所以在服务器B上:

zfs snap -r zfs49@xfer

现在,由于您在服务器 A 上有一个名为 的原始(空的)池zfs49,因此您可以将该递归快照从服务器 B 传输到服务器 A(从服务器 B 开始):

zfs send -R zfs49@xfer | ssh <Server A ip> zfs recv -Fuv zfs49

我倾向于-Fuv经常使用选项,zfs recv因为:

  • -u确认我想要在服务器 A 上保留新恢复的文件系统(暂时)未安装。将ZFS池从一个系统传输到另一个系统并破坏(覆盖)现有安装点很容易遇到麻烦。步骤-R /mnt上的选项也zfs create可以防止这种情况,所以也许这就是“吊带和腰带”的情况,但在传输和恢复备份时,很难过于谨慎。
  • -v为我提供一些有关工作进展情况的反馈,因为每个已完成的快照将依次列出。

至于进度指示,您可能还会发现zfs传输是利用 Andrew Wood 强大的管道查看器的绝佳机会pv(1)

(来自服务器B:)

zfs send -R zfs49@xfer |
  pv -Wbraft |   
  ssh <Server A ip> zfs recv -Fuv zfs49/tank

调整pv选项以满足您的品味和需求。

传输完成后,检查服务器 A 上的池,特别密切关注挂载点,请记住,/mnt由于您的zpool create ...语法,它们将带有前缀。如果您愿意,您可以(在服务器 A 上):

zpool export zfs49
zpool import -N zfs49
zfs list

这将导入池以显示本机安装点,但该zpool import -N命令告诉zpool您实际上不安装任何东西。这有助于对池的安装点实际所在位置进行逐一比较。确保池的挂载点不会覆盖服务器 A 上的任何现有挂载点,否则您可能会无法访问可能关键的文件系统。这种使用zpool import -N与上述使用相吻合,zpool recv -u试图最大限度地减少将新创建的文件系统安装在错误位置的风险。

最后,一旦您对服务器 A 上池的外观感到满意,您就可以xfer从两个系统中删除快照。从服务器A:

zfs destroy -rv zfs49@xfer
ssh <Server B> zfs destroy -rv zfs49@xfer

我没有一个好的解决方案的一个警告是,备份和恢复池本身的属性并不简单,也就是说,必须通过zpool而不是读取和写入选项zfs。这包括诸如 、 之类的属性,以及向您展示的bootfs所有其他花絮。zpool get all zfs49大多数默认值可能是合理的,如果您过去更改过其中任何默认值,希望您能识别它们,并可以手动更改服务器 A 的新池上的属性以满足您的需求。否则,如何备份和恢复池属性的主题可能值得单独提出一个问题(如果还没有)。

相关内容