FreeBSD啟用ZFS快照功能

myskies發表於2022-11-26

FreeBSD的 ZFS 果然不讓人失望,在保證資料安全的前提下,效率也非常的高。4塊硬碟組成的raidz較NVME固態硬碟的速率略低,但不明顯。

而快照則是ZFS更核心的功能,ZFS可以達到秒級建立快照,這個速度嚴重的超出了自己的認知。

建立資料集(檔案系統)

zfs並不是可以直接對所有的資料夾設定快照的,要想對某個資料夾設定快照,則需要先建立檔案系統(資料集),比如我當前存在儲存池yzpool,則可以使用以下命令建立儲存池:

# zfs create yzpool/data
# zfs create yzpool/data/hosts
# zfs create yzpool/data/hosts/20pro

注意:在建立資料集時,需要由父到子依次建立。

此時我們便建立了3個資料集,分別是data, data/hosts以及data/hosts/20pro。然後我們便可以對這個20pro資料夾設定快照了。

建立快照

此時進入data/hosts/20pro資料夾,並建立一個測試檔案:echo "sfsdf" >> hello.text,然後執行

# zfs snapshot yzpool/data/hosts/20pro@22-11-19

便成功的建立了第一個快照,快照建立的位置位於yzpool/data/hosts/20pro資料夾下的.zfs/snapshot子資料夾,可以使用ls命令來直接檢視。

# ls -a -l .zfs/snapshot/ 
total 1
dr-xr-xr-x+ 3 root  wheel  3 Nov 20 01:50 .
dr-xr-xr-x+ 3 root  wheel  3 Nov 20 01:48 ..
drwxr-xr-x  2 root  wheel  3 Nov 20 01:49 22-11-19

順便看一下快照大小:

# du .zfs/snapshot/
7    .zfs/snapshot/22-11-19
7    .zfs/snapshot/

建立恢復快照

接著我們新增一個檔案,並且修改原檔案:

root@nfs:/yzpool/data/hosts/20pro # echo "123" >> hello.text 
root@nfs:/yzpool/data/hosts/20pro # cat hello.text 
sfsdf
123
root@nfs:/yzpool/data/hosts/20pro # echo "456" >> text.text
root@nfs:/yzpool/data/hosts/20pro # cat text.text 
456

然後我們再建立個快照:

root@nfs:/yzpool/data/hosts/20pro # zfs snapshot yzpool/data/hosts/20pro@22-11-19-18-13
root@nfs:/yzpool/data/hosts/20pro # ls -a -l .zfs/snapshot/
total 1
dr-xr-xr-x+ 4 root  wheel  4 Nov 20 01:59 .
dr-xr-xr-x+ 3 root  wheel  3 Nov 20 01:48 ..
drwxr-xr-x  2 root  wheel  3 Nov 20 01:49 22-11-19
drwxr-xr-x  2 root  wheel  4 Nov 20 01:55 22-11-19-18-13
root@nfs:/yzpool/data/hosts/20pro # du .zfs/snapshot/
14    .zfs/snapshot/22-11-19-18-13
7    .zfs/snapshot/22-11-19
21    .zfs/snapshot/

當前的情況下,我們擁有了兩個快照,第一個快照中我們新建了一個檔案,第二個快照中有兩個檔案。

現在我們再建立第3個檔案:

root@nfs:/yzpool/data/hosts/20pro # echo "333" >> 3.txt
root@nfs:/yzpool/data/hosts/20pro # ls
3.txt        hello.text    text.text

最後我們嘗試進行快照恢復,需要注意的是:快照間是有依存關係的,比如我們現在想恢復快照22-11-19,則會得到不能夠直接恢復的警告:

root@nfs:/yzpool/data/hosts/20pro # zfs rollback yzpool/data/hosts/20pro@22-11-19
cannot rollback to 'yzpool/data/hosts/20pro@22-11-19': more recent snapshots or bookmarks exist
use '-r' to force deletion of the following snapshots and bookmarks:
yzpool/data/hosts/20pro@22-11-19-18-13

這裡由於我們建立快照將基於最近的快照,具體的原因不太好解釋,總之就是記住如果有重要資料的話,恢復快照前對快照對行備份就對了。

在這裡我們使用-r參考來恢復到非最新的快照,則會發現快照22-11-19-18-13直接被刪除了。

root@nfs:/yzpool/data/hosts/20pro # zfs rollback -r yzpool/data/hosts/20pro@22-11-19
root@nfs:/yzpool/data/hosts/20pro # ls
hello.text
root@nfs:/yzpool/data/hosts/20pro # ls .zfs/snapshot/
22-11-19

自動快照

定義一個保留1周的自動快照是個備份的好辦法,自動備份的方式有很多,在這我們使用zfsnap2

# pkg install zfsnap2

安裝完成後測試一下,比如對根資料集data建立快照:

# [root@nfs /yzpool/data/hosts/20pro]# zfsnap snapshot -v -a 1w yzpool/data
/sbin/zfs snapshot  yzpool/data@2022-11-20_03.01.57--1w ... DONE
[root@nfs /yzpool/data/hosts/20pro]# zfs list -t snapshot
NAME                                  USED  AVAIL     REFER  MOUNTPOINT
yzpool/data@2022-11-20_03.01.57--1w     0B      -      140K  -
yzpool/data/hosts/20pro@22-11-19       93K      -      145K  -
[root@nfs /yzpool/data/hosts/20pro]# zfsnap snapshot -v -a 1w -r yzpo

如果我們想為資料集建立遞迴快照,則還可以加入-r引數:

[root@nfs /yzpool/data/hosts/20pro]# zfs list -t snapshot
NAME                                              USED  AVAIL     REFER  MOUNTPOINT
yzpool/data@2022-11-20_03.01.57--1w                 0B      -      140K  -
yzpool/data@2022-11-20_03.03.04--1w                 0B      -      140K  -
yzpool/data/hosts@2022-11-20_03.03.04--1w           0B      -      140K  -
yzpool/data/hosts/20pro@22-11-19                   93K     
yzpool/data/hosts/20pro@2022-11-20_03.03.04--1w     0B      -      157K  -
yzpool/data/hosts/test@2022-11-20_03.03.04--1w      0B      -      140K  -

此時將自動為 data, data/hosts, data/hosts/20pro, data/hosts/test分別建立快照。該快照的有效期為1周,在1周後如果執行了銷燬操作,則該快照將被自動銷燬。

由於當前時間還不夠1周,所以測試zfsnap的銷燬快照操作後,什麼也不會發生:

# zfsnap destroy -rv yzpool/data

更多的用法請參考zfsnap官方文件

熟悉了使用者以後,最後我們在切換為root使用者的前提下,為每天的快照備份、銷燬來制定個計劃任務。

[root]# crontab -e
10   2  *   *   *    /usr/local/sbin/zfsnap snapshot -v -a 1w -r yzpool/data >> /yzpool/log/zfsnap.log
43   3  *   *   *    /usr/local/sbin/zfsnap destroy -rv yzpool/data >> /yzpool/log/zfsnap.log

如果你採用的是直接編輯/etc/crontab檔案,則還應該在定時任務中加入執行的使用者。

10   2  *   *   *  root  /usr/local/sbin/zfsnap snapshot -v -a 1w -r yzpool/data >> /yzpool/log/zfsnap.log
43   3  *   *   *  root  /usr/local/sbin/zfsnap destroy -rv yzpool/data >> /yzpool/log/zfsnap.log

此時每天的2點10分將進行快照生成(這個很快),每天的3點43將刪除過期的快照(由於需要進行快照資料的合併,這個反而要花一些時間)。

注意:一定要寫好命令的全路徑,所以計劃任務不會順利執行。

永遠選擇相信計算機,而不是選擇相信自己。我們建立完計劃任務還需要如下測試,比如測試第1個任務:

$ env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/root NAME=root /usr/local/sbin/zfsnap snapshot -v -a 1w -r yzpool/data >> /yzpool/log/zfsnap.log

刪除資料集

資料集的刪除並不像普通資料夾那樣可以使用rm命令,而是使用zfs destroy命令,如果該資料集關聯了相關快照,則會得到以下提示:

# [root@nfs /yzpool/data/hosts]# zfs destroy yzpool/data/hosts/test
cannot destroy 'yzpool/data/hosts/test': filesystem has children
use '-r' to destroy the following datasets:
yzpool/data/hosts/test@2022-11-20_03.03.04--1w

此時加入-r引數即可完成刪除操作,同時該操作也同步刪除了該資料集對應的快照:

[root@nfs /yzpool/data/hosts]# zfs destroy -r yzpool/data/hosts/test

rsync

最後,我們再結合rsync檔案定時同步,從而達到快照及rsync雙重備份的目的。

參考

https://docs.oracle.com/cd/E3...

https://docs.freebsd.org/zh-t...

相關文章