【问题标题】:Why received ZFS dataset uses less space than original?为什么收到的 ZFS 数据集使用的空间比原始数据少?
【发布时间】:2017-12-29 11:09:37
【问题描述】:

我在server1 上有一个数据集,我想备份到第二个server2

Server1(原始):

zfs list -o name,used,avail,refer,creation,usedds,usedsnap,origin,compression,compressratio,refcompressratio,mounted,atime,lused storage/iscsi/webhost-old 产生:

NAME                        USED  AVAIL  REFER  CREATION                USEDDS  USEDSNAP  ORIGIN  COMPRESS  RATIO  REFRATIO  MOUNTED  ATIME  LUSED
storage/iscsi/webhost-old  67,8G  1,87T  67,8G  Út kvě 31  6:54 2016   67,8G       16K  -            lz4  1.00x     1.00x        -      -  67,4G

向第二台服务器发送卷:

zfs send storage/iscsi/webhost-old | pv | ssh -c arcfour,aes128-gcm@openssh.com root@10.0.0.2 zfs receive -Fduv pool/bkp-storage

在 378 秒(189MB/秒)内收到 69.6GB 流

Server2 zfs 列表产生:

NAME                                 USED  AVAIL  REFER  CREATION               USEDDS  USEDSNAP  ORIGIN  COMPRESS  RATIO  REFRATIO  MOUNTED  ATIME  LUSED
pool/bkp-storage/iscsi/webhost-old  36,1G  3,01T  36,1G  Pá pro 29 10:25 2017   36,1G         0  -            lz4  1.15x     1.15x        -      -  28,4G

为什么尺寸会有这么大的差别?谢谢。

【问题讨论】:

  • 什么是重复数据删除设置?另请注意,两个文件系统的压缩率不同。在我看来,ZFS 压缩比数字总是有些模糊。
  • 不使用去重(去重已关闭)。在备份池上设置了压缩,但是 1.15 不是 36,1 vs 67,8 G :\ 可能是一些 ZFS 数据存储优化?

标签: backup zfs


【解决方案1】:

从您发布的内容中,我注意到 3 件看起来很奇怪的事情:

  1. compressratio 在系统 2 上是 1.15x,但在系统 1 上是 1.00x
  2. 在系统 2 上,usedlogicalused 高 1.27 倍
  3. logicalused 和数字 zfs receive 报告在系统 1 上比系统 2 高约 2.3 倍

这些术语都在man page 中定义,但在实践中仍难以对逆向工程的解释造成混淆。

(1) 如果您在将所有数据写入源数据集后启用了压缩,则可能会发生这种情况,因为启用该设置时 ZFS 不会重写数据以对其进行压缩。 zfs send 发送的数据是未压缩的,除非您使用 -c,但如果在目标数据集上启用了该设置,系统 2 将在运行 zfs receive 时尝试对其进行压缩。如果系统 1 和系统 2 在写入数据之前具有相同的压缩设置,那么它们也将具有相同的 compressratio

(2) 可能由于与您的数据一起写入的元数据而发生,但在这种情况下,对于占大多数池的 1-2% 的“正常”元数据而言,它太高了。这可能是由池范围的设置引起的,例如配置 RAID-Z,或者条带化和镜像的奇怪组合(例如 4 个条带,但其中一个是镜像)。

对于(3),我重新阅读了手册页以试图弄清楚:

 logicalused

 The amount of space that is "logically" consumed by this dataset and
 all its descendents.  See the used property.  The logical space
 ignores the effect of the compression and copies properties, giving a
 quantity closer to the amount of data that applications see.

如果您发送数据集(而不是单个 iSCSI 卷)并且发送大小匹配系统 2 的 logicalused 值(而不是系统 1),我猜您忘记发送一些子数据集(即使用 @ 987654334@)。但是,在这种情况下,这些都不正确。

我不得不做一些额外的挖掘——this blog post from 2005 可能包含解释。如果系统 1 在写入数据时没有启用压缩(就像我在上面对 (1) 所猜测的那样),负责不写入归零块 (zio_compress_data) 的函数将不会运行,所以你可能有一个一堆写入磁盘的空块,占logicalused 大小。但是,由于lz4 是在系统 2 上配置的,它会在系统 2 上运行,并且不会计算这些块。

【讨论】:

  • 是的,压缩仅在第二台(备份)服务器上启用,而不是在原始池中。我们可以假设您的最后一段就是这种情况-归零块。很遗憾 zfs 没有删除它们并且没有回收空间。谢谢。
猜你喜欢
  • 2021-10-23
  • 2012-07-08
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多