ZFS 快照到文件作为带轮换的备份

Mar*_*ann 14 freebsd zfs backup freenas snapshot

我有一个本地 FreeNAS 系统,想使用 ZFS 快照进行备份。
FreeNAS 有内置的复制任务,它使用

zfs send snapshot_name
Run Code Online (Sandbox Code Playgroud)

将快照发送到远程系统。但这需要另一端带有 ZFS 的系统。

我想将快照发送到一个文件并将这个压缩和加密的文件发送到远程机器。

这是可能的

zfs send snapshot_name | gzip | openssl enc -aes-256-cbc -a -salt > file.gz.ssl
Run Code Online (Sandbox Code Playgroud)

每天我都会制作存储池的快照并将每个快照保留 30 天。
每次拍摄快照后,我都会将此快照通过管道传输到文件中。
- 快照文件 1 中包含所有文件(假设为 2GB)
- 快照文件 2 仅包含对快照文件 1 的更改(假设为 5MB)
- 快照文件 3 包含对快照文件 2 的更改;等等。

在第 31 天,snapshot_file 1 被删除(因为我只想要过去 30 天的更改)

因此,snapshot_file 2 需要保存每个文件(2GB 的 snapshot_file 1 + 5MB 更改)

但是使用这种方法每天(从第 31 天开始)必须创建一个新的 2GB 文件并将其发送到远程系统。这开销太大了。

使用管道传输到文件的快照作为具有 X 天历史记录的备份策略的最佳方法是什么?

PS:我知道有很多备份软件(例如 rdiff-backup),我可以使用它们。但我很好奇如何做到这一点。

Mar*_*rco 12

如果您将快照存储在文件中,而不是存储在文件系统中(例如使用zfs receive),恐怕这是不可能的。

接收方的 ZFS

如果您在发送端和接收端使用 ZFS,您可以避免传输整个快照,而只传输与前一个快照相比的差异:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' | \
  zfs receive
Run Code Online (Sandbox Code Playgroud)

ZFS 知道快照并且只存储一次相互块。让文件系统了解快照使您可以毫无问题地删除旧快照。

接收端的其他文件系统

在您的情况下,您将快照存储在单个文件中,并且您的文件系统不知道这些快照。正如您已经注意到的,这会破坏旋转。您要么必须传输整个快照,这会浪费带宽和存储空间,但允许您删除单个快照。他们不相互依赖。您可以像这样执行增量快照:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' \
  > incremental-2014-02-04:05
Run Code Online (Sandbox Code Playgroud)

要恢复增量快照,您还需要以前的快照。这意味着您不能删除旧的增量。

可能的解决方案

您可以按照我上一个示例中的说明进行增量操作,并每月进行一次新的非增量操作。新的增量依赖于这个非增量,你可以随意删除旧的快照。

或者您可以查看其他备份解决方案。有 rsnapshot,它使用rsync硬链接。它在轮换方面做得非常好,而且带宽效率很高,因为它只需要一次完整备份。

然后是bareos。它执行增量操作,从而节省带宽和空间。它有一个非常好的功能;它可以从一组增量中计算完整备份。这使您能够删除旧的增量。但它是一个相当复杂的系统,旨在用于更大的设置。

然而,最好的解决方案是在接收端使用 ZFS。与其他解决方案相比,它将具有带宽效率、存储效率和更快的速度。我能想到的唯一真正的缺点是你应该在那个盒子上至少有 8?GiB ECC 内存(如果你不运行任何服务并且只用它来使用 4?GiB 可能没问题zfs receive)。

  • @MartinGrohmann 我明白你的意思了。嗯,这就是 ZFS 的美妙之处,您可以毫无问题地删除 ZFS 上的旧快照。在其他文件系统上,您必须保留旧文件系统。也许你最好使用像`rsnapshot`这样的东西。或者您可以在一个月后开始一个新的非增量,然后删除以前的增量。 (2认同)
  • @MartinGrohmann Duplicity 是一个不错的程序,但是 [它遇到了同样的问题](http://blog.sanctum.geek.nz/linux-crypto-backups/#comment-12017)。如果你只做增量,你的空间就会不断增长。您无法在不浪费带宽和进行新的完整备份的情况下回收空间。两边都去ZFS或者看看[bareos](http://www.bareos.org/en/),它可以从增量计算一个新的完整备份。这使您可以删除旧的增量而无需重新传输所有内容。 (2认同)