Backup

減少異地備份的 ZFS 流大小

  • February 23, 2018

**注意:**自從我第一次提出這個問題以來,我對這個問題的理解發生了很大變化(參見下面的編輯 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  -

我已經在遠端伺服器上擁有來自 6/22 的快照,所以我將它發送給它生成的流

zfs send -i stg/serverx@20110622 stg/serverx@20110623

這是在另一端收到的,沒有問題;但是,生成的流超過 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輸出)?

我知道這是一個非常古老的問題,但我已經在幾個不同的地方看到了它。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  -

為了找出通過 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

哎呀!這比 USED 值要多得多。但是,如果您不需要目標位置的所有中間快照,則可以使用合併選項(-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

所以這是隔離在快照之間重寫的各種塊,所以我們只取它們的最終狀態。

但這還不是全部!zfs 發送基於從源中提取邏輯數據,因此如果您在源文件系統上啟動了壓縮,則估計值基於需要發送的未壓縮數據。例如,獲取一個增量快照並將其寫入磁碟,您會得到接近從乾執行命令估計的值:

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

但是如果通過 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

旁注 - 這是基於 Linux 上的 OpenZFS,版本: - ZFS:載入的模組 v0.6.5.6-0ubuntu16

您會發現一些可應用於發送流的優化參考(-D 去重流,-e 更緊湊),但在這個版本中,我沒有觀察到對我的數據集生成的流大小有任何影響。

引用自:https://serverfault.com/questions/283872