ZFS 镜像池的有效异地备份策略是什么?

ZFS 镜像池的有效异地备份策略是什么?

我使用由两个镜像磁盘组成的 ZFS 池。为了进行异地备份,我又购买了两个磁盘。

我最初的计划是通过将第三个磁盘附加到镜像来创建异地备份,等待 ZFS 重新同步,然后分离驱动器并将其带到异地。这工作得很好,但令我惊讶的是它似乎执行了满的每次附加磁盘时都会重新同步(我读到,并且可能误解了,每次附加都会导致增量或增量重新同步)。这会导致备份时间超过可接受的时间。

我的要求是拥有我的 zpool 及其所有快照的异地副本,以便我可以每天轮换。这意味着重新同步最多需要 24 小时——目前已经接近这个时间,但我们扩大池的计划将使其超出该时间范围。

如何保留不需要完全重新同步操作的异地备份?我是否应该在备份驱动器上使用不同的文件系统(例如导出映像而不是让它们成为 ZFS 池的一部分)?我是否应该将备份放在单独的池中并在创建新快照时向其中发送新快照?

答案1

为什么 zfs 不将快照发送到远程 ZFS 机器?我为此使用一个简单的 bash 脚本:

#!/usr/local/bin/bash
# ZFS Snapshot BASH script by Shawn Westerhoff
# Updated 1/14/2014

### DATE VARIABLES
# D = Today's date
# D1 = Yesterday's date
# D# = Today less # days date
Y=$(date -v-1d '+%m-%d-%Y')
D=$(date +%m-%d-%Y)
D1=$(date -v-1d '+%m-%d-%Y')
D10=$(date -v-10d '+%m-%d-%Y')
D20=$(date -v-20d '+%m-%d-%Y')

# Step 1: Make the snapshots

for i in $( zfs list -H -o name ); do
    if [ $i == tier1 ]
    then echo "$i found, skipping"
    else
    zfs snapshot $i@$D
    fi
done

# Step 2: Send the snapshots to backup ZFS sever

    for i in $( zfs list -H -o name ); do
        zfs send -i $i@$D1 $i@$D | ssh -c arcfour [email protected] zfs recv $i
    done

# Step 3: Destroy snapshots that are 20 days old

for i in $( zfs list -H -o name ); do
        if [ $i == tier1 ]
        then echo "$i found, skipping"
        else
        zfs destroy $i@$D20
        fi
done

答案2

经过大量的修改和实验,我找到了一个解决方案,尽管需要进行相当大的权衡。

首先,我必须排除的选项:

  • 由于成本原因,无法选择拥有第二个带有镜像池的异地 ZFS 服务器。如果可以的话,这将是迄今为止最好的方法,利用 ZFS 发送/接收将快照发送到远程池。

  • 拥有第二个现场 ZFS 镜像池,我可以从中删除磁盘带回家。这比第一个选项更可行,但我需要第二个池始终在现场有两个磁盘(或在单个现场磁盘上使用两个数据副本)。目前我有四个磁盘,服务器中没有足够的空间容纳第五个磁盘。这将是一种公平的方法,但仍然不理想。

  • 使用 ZFS 附加和分离将备份磁盘轮转进出镜像池。这种方法效果很好,但每次添加磁盘时都必须执行完整的重新同步。这花费的时间长得令人无法接受,所以我不能依赖它。

我的解决方案类似于使用attachand detach,但它使用onlineand offline。与完全重新同步相比,这样做的优点是执行增量重新同步,但缺点是池始终报告状态DEGRADED(池始终有两个磁盘;旋转的异地磁盘offline在处于远程存储和重新同步然后上线时会被标记)当他们在现场时)。

因此,快速回顾和概述我的设置:

我有一台 ZFS 服务器和四个相同的磁盘。 ZFS 设置为使用镜像池。四个磁盘中的两个是该池的永久成员。另外两个圆盘旋转;一个始终位于异地存储中,另一个是池的一部分,充当随时可用的备份。

当需要轮换备份时:

  • 我等待zfs scrub完成以合理地确保备份磁盘没有错误

  • Izfs offline将被远程获取的磁盘。离线后我hdparm -Y /dev/id将其关闭。一分钟后,我部分移除磁盘底座(刚好足以确保其断电),然后再给它一分钟,然后完全拉动驱动器以确保其停止旋转。磁盘放入静电袋中,然后放入保护盒中并移至异地。

  • 我引入了另一个异地磁盘。它安装在热插拔托盘中并旋转。我用来zfs online将磁盘恢复到池中并启动部分重新同步以使其并发。

该系统保证在任何给定时间我都有两个ONLINE镜像磁盘和一个OFFLINE远程磁盘(已被擦洗)。第四个磁盘要么被重新同步,要么在线,这样做的好处是,如果正在运行的驱动器发生故障,池可能仍然与两个在线磁盘保持一致。

过去几周效果很好,但我仍然认为这是一种黑客方法。如果遇到重大问题我会跟进。


更新:在运行了几个月后,我发现在我的实际使用中,重新同步对于分离/附加和离线/在线都花费相同的时间。在我的测试中,我认为我没有运行擦洗 - 我的预感是,如果驱动器因擦洗而脱机,则需要完全重新同步。

答案3

我已经创建了zfs 自动备份以透明的方式执行此操作以及更多操作:(它仅在两个 zfs 系统之间工作,无法备份到外部系统)。

ZFS-autobackup 力图成为最可靠、最易于使用的工具,同时具有所有功能。

您可以将其用作备份工具、复制工具或快照工具。

您可以通过设置自定义 ZFS 属性来选择要备份的内容。这使得添加/删除特定数据集或仅备份整个池变得容易。

其他设置只需在命令行上指定:只需设置和测试 zfs-autobackup 命令并修复您可能遇到的所有问题。完成后,您只需将命令复制/粘贴到 cron 或脚本即可。

由于它使用 ZFS 命令,因此您可以通过指定 --debug 来查看它实际执行的操作。如果您遇到一些奇怪的问题或错误,这也会有很大帮助。您只需复制粘贴失败的命令并在命令行上使用它即可。 (我在其他工具中错过的东西)

其他工具缺少的一个重要功能是可靠的 --test 选项:这使您可以查看 zfs-autobackup 将执行的操作并调整参数。除了对系统进行更改之外,它会执行所有操作。

有关安装说明和下载,请参阅https://github.com/psy0rz/zfs_autobackup

相关内容