减少异地备份的 ZFS 流大小

eaj*_*eaj 6 freebsd backup zfs

注意:自从我第一次问这个问题以来,我对这个问题的理解发生了重大变化(请参阅下面的编辑 2),但我保留了原始版本。

我们已经建立了一个异地备份系统(仍在内部测试),通过 ZFS 发送/接收进行数据传输。两端的机器都是 FreeBSD 8.2。总体而言,该设置运行良好。

但是,对于 ZFS 快照流大小,我显然有一些不了解的地方。我很难找到这方面的信息,所以我希望有更多经验的人可以启发我。

在源机器上,我有一个大约 47GB 的文件系统,我需要为其传输快照:

# zfs list -t snapshot -r -s creation stg/serverx
NAME                   USED  AVAIL  REFER  MOUNTPOINT
(.......)
stg/serverx@20110620  2.88M      -  47.1G  -
stg/serverx@20110621  2.89M      -  47.1G  -
stg/serverx@20110622  2.88M      -  47.1G  -
stg/serverx@20110623  5.44M      -  46.6G  -
Run Code Online (Sandbox Code Playgroud)

我在远程服务器上已经有了 6/22 的快照,所以我将生成的流发送给它

zfs send -i stg/serverx@20110622 stg/serverx@20110623
Run Code Online (Sandbox Code Playgroud)

这是在另一端毫无问题地接收到的;然而,生成的流超过 80 GB — 几乎是整个源文件系统大小的两倍

我是否误解了由生成的“USED”列的含义zfs list?我原以为这个快照流是 5.44M 加上一定量的开销。似乎我不太明白什么是开销。

可能有用的信息:我们将每个服务器备份(通过 rsync)到它自己的文件系统。这个特定的流似乎生成了最大的流(相对于文件系统和快照大小)。我怀疑这可能与它是一个邮件服务器有关,所以它的一些内容是非常动态的。但是,我希望这也会显示在“已使用”大小的快照中。

显然,我们可以通过压缩流来节省很多(它可能会减少到原始大小的 12-20%)。即便如此,带宽仍将是我们的限制因素,因此我们想了解是什么让这些流如此庞大,以及我们是否可以采取任何措施来缓解它。

编辑:我忘记了我们在源文件系统上启用了 zfs 压缩。因此,所使用的 47 GB 确实转换为近 80 GB 的“真实”文件系统数据。我想这是一个部分的解释,但我仍然不明白为什么增量流zfs send会如此之大。


编辑2:

对该备份和其他一些备份的进一步调查得出的结论是,实际上可以预期大量传输(由于已经进行了一些升级)。但是,我在zfs list.

我已经阅读了文档,并且我知道计算快照使用的空间有很多复杂性。该zfs手册页说,在的描述如下used特性:

当快照。. . 创建后,它们的空间最初在快照和文件系统之间共享,并且可能与以前的快照共享。随着文件系统的变化,之前共享的空间成为快照独有的空间,并计入快照的已用空间。

这对我来说很有意义。但是,我希望看到在服务器升级当天结束时创建的更大的快照。事实上,它只有几兆字节。这里没有重复数据删除(zpool 版本 15)。但是生成的增量流zfs send -i比较大,包含了所有的升级信息。

有人可以解释这种明显的不一致吗?那么,相关的问题是:如何合理估计增量流的大小(例如,从zfs list输出)?

Eri*_*son 6

我知道这是一个非常古老的问题,但我在一些不同的地方看到过它。对于 zfs list 中表达的值总是存在一些混淆,因为它涉及使用 zfs send|recv。问题在于,USED 列中表示的值实际上是对删除单个快照时将释放的空间量的估计,请记住可能存在引用相同数据块的较早和较晚的快照。

例子:

zfs list -t snapshot -r montreve/cev-prod | grep 02-21
NAME                                      USED  AVAIL  REFER  MOUNTPOINT
montreve/cev-prod@2018-02-21_00-00-01     878K      -   514G  -
montreve/cev-prod@2018-02-21_sc-daily     907K      -   514G  -
montreve/cev-prod@2018-02-21_01-00-01    96.3M      -   514G  -
montreve/cev-prod@2018-02-21_02-00-01    78.5M      -   514G  -
montreve/cev-prod@2018-02-21_03-00-01    80.3M      -   514G  -
montreve/cev-prod@2018-02-21_04-00-01    84.0M      -   514G  -
montreve/cev-prod@2018-02-21_05-00-01    84.2M      -   514G  -
montreve/cev-prod@2018-02-21_06-00-01    86.7M      -   514G  -
montreve/cev-prod@2018-02-21_07-00-01    94.3M      -   514G  -
montreve/cev-prod@2018-02-21_08-00-01     101M      -   514G  -
montreve/cev-prod@2018-02-21_09-00-01     124M      -   514G  -
Run Code Online (Sandbox Code Playgroud)

为了找出通过 zfs send|recv 重建快照需要传输多少数据,您需要对这些值使用试运行功能 (-n)。拍摄上面列出的快照尝试:

zfs send -nv -I montreve/cev-prod@2018-02-21_00-00-01 montreve/cev-prod@2018-02-21_09-00-01
send from @2018-02-21_00-00-01 to montreve/cev-prod@2018-02-21_sc-daily estimated size is 1.99M
send from @2018-02-21_sc-daily to montreve/cev-prod@2018-02-21_01-00-01 estimated size is 624M
send from @2018-02-21_01-00-01 to montreve/cev-prod@2018-02-21_02-00-01 estimated size is 662M
send from @2018-02-21_02-00-01 to montreve/cev-prod@2018-02-21_03-00-01 estimated size is 860M
send from @2018-02-21_03-00-01 to montreve/cev-prod@2018-02-21_04-00-01 estimated size is 615M
send from @2018-02-21_04-00-01 to montreve/cev-prod@2018-02-21_05-00-01 estimated size is 821M
send from @2018-02-21_05-00-01 to montreve/cev-prod@2018-02-21_06-00-01 estimated size is 515M
send from @2018-02-21_06-00-01 to montreve/cev-prod@2018-02-21_07-00-01 estimated size is 755M
send from @2018-02-21_07-00-01 to montreve/cev-prod@2018-02-21_08-00-01 estimated size is 567M
send from @2018-02-21_08-00-01 to montreve/cev-prod@2018-02-21_09-00-01 estimated size is 687M
total estimated size is 5.96G
Run Code Online (Sandbox Code Playgroud)

哎呀!这比使用的值要多得多。但是,如果您不需要目标处的所有中间快照,则可以使用合并选项(-i 而不是 -I),该选项将计算任意两个快照之间的必要差异,即使中间还有其他快照也是如此。

zfs send -nv -i montreve/cev-prod@2018-02-21_00-00-01 montreve/cev-prod@2018-02-21_09-00-01
send from @2018-02-21_00-00-01 to montreve/cev-prod@2018-02-21_09-00-01 estimated size is 3.29G
total estimated size is 3.29G
Run Code Online (Sandbox Code Playgroud)

这样就隔离了快照之间重写的各个块,因此我们只获取它们的最终状态。

但这还不是故事的全部!zfs send 基于从源中提取逻辑数据,因此,如果您在源文件系统上激活了压缩,则估计值基于需要发送的未压缩数据。例如,拍摄一个增量快照并将其写入磁盘,您将获得接近试运行命令估计值的值:

zfs send -i montreve/cev-prod@2018-02-21_08-00-01 montreve/cev-prod@2018-02-21_09-00-01 > /montreve/temp/cp08-09.snap
-rw-r--r--  1 root root    682M Feb 22 10:07 cp08-09.snap
Run Code Online (Sandbox Code Playgroud)

但如果你通过 gzip 传递它,我们会看到数据被显着压缩:

zfs send -i montreve/cev-prod@2018-02-21_08-00-01 montreve/cev-prod@2018-02-21_09-00-01 | gzip > /montreve/temp/cp08-09.gz
-rw-r--r--  1 root root    201M Feb 22 10:08 cp08-09.gz
Run Code Online (Sandbox Code Playgroud)

旁注 - 这是基于 Linux 上的 OpenZFS,版本: - ZFS:加载模块 v0.6.5.6-0ubuntu16

您会发现一些可应用于发送流的优化参考(-D 重复数据删除流,-e 更紧凑),但在这个版本中,我没有观察到对我的数据集生成的流的大小有任何影响。