減少異地備份的 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 -
我已經在遠端伺服器上擁有來自 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 更緊湊),但在這個版本中,我沒有觀察到對我的數據集生成的流大小有任何影響。