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雙重備份的目的。