Freebsd

ZFS 快照到文件作為帶輪換的備份

  • February 8, 2014

我有一個本地 FreeNAS 系統,想使用 ZFS 快照進行備份。

FreeNAS 具有內置的複制任務,它使用

zfs send snapshot_name

將快照發送到遠端系統。但這需要另一端帶有 ZFS 的系統。

我想將快照發送到一個文件並將這個壓縮和加密的文件發送到遠端機器。

這是可能的

zfs send snapshot_name | gzip | openssl enc -aes-256-cbc -a -salt > file.gz.ssl

每天我都會對儲存池進行快照,並將每個快照保留 30 天。

拍攝每個快照後,我都會將此快照通過管道傳輸到文件中。

  • 快照文件 1 包含所有文件(假設為 2GB)

  • 快照文件 2 僅包含對快照文件 1 的更改(假設為 5MB)

  • 快照文件 3 保存對快照文件 2 的更改;等等。

在第 31 天,快照文件 1 被刪除(因為我只想要過去 30 天的更改)

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

但是每天使用這種方法(從第 31 天開始),必須創建一個新的 2GB 文件並將其發送到遠端系統。這成本太大。

使用管道傳輸到文件的快照作為具有 X 天歷史記錄的備份策略的最佳方法是什麼?

PS:我知道那裡有很多備份軟體(例如 rdiff-backup),我可以使用它們。但我很好奇如何做到這一點。

如果您將快照儲存在文件中,而不是在文件系統中(例如使用zfs receive),恐怕這是不可能的。

接收端的 ZFS

如果您在發送端和接收端使用 ZFS,您可以避免傳輸整個快照,而只傳輸與前一個快照相比的差異:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' | \
 zfs receive

ZFS 知道快照並且只儲存相互塊一次。讓文件系統了解快照使您可以毫無問題地刪除舊的。

接收端的其他文件系統

在您的情況下,您將快照儲存在單個文件中,並且您的文件系統不知道這些快照。正如您已經註意到的那樣,這會破壞旋轉。您要麼必須傳輸整個快照,這將浪費頻寬和儲存空間,但可以刪除單個快照。他們不相互依賴。您可以像這樣執行增量快照:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' \
 > incremental-2014-02-04:05

要恢復增量快照,您還需要以前的快照。這意味著您不能刪除舊的增量。

可能的解決方案

您可以按照我上一個範例中所示的方式進行增量,並每月執行一次新的非增量。新的增量依賴於這個非增量,您可以隨意刪除舊的快照。

或者您可以查看其他備份解決方案。有 rsnapshot,它使用rsync硬連結。它在輪換方面做得很好,並且頻寬效率很高,因為它只需要一次完整備份。

然後是bareos。它執行增量,這是節省頻寬和空間的。它有一個非常好的功能;它可以從一組增量計算完整備份。這使您能夠刪除舊的增量。但這是一個相當複雜的系統,適用於更大的設置。

然而,最好的解決方案是在接收端使用 ZFS。它將比其他解決方案更節省頻寬、儲存效率並且速度更快。我能想到的唯一真正的缺點是,你應該在那個盒子上至少有 8 GiB ECC 記憶體(如果你不執行任何服務並且只使用它,你可能對 4 GiB 沒問題zfs receive)。

引用自:https://unix.stackexchange.com/questions/113743