zfs snapshot 管理

[華語, cmn-Hant-TW]

目前 zfs 對我來說主要就是備份用,使用的方式大致上就是逐日備份,然後定期清掉舊的備份,試過一些工具不過都覺得不是很理想,所以就自己動手弄了,備份的方式不限定,只要把檔案塞進目錄即可,目前的話大致上是 windows 用 windows 的機制,mac 用 time machine,其他 linux 或 freebsd 用 rsync,對備份主機來說只要各別開適當的分享出去即可。備份跟清理備份的時間也可以錯開,我是習慣晚上11點左右打 snapshot 跟清舊備份,其他機器有一整天的時間可以丟資料到備份主機上去,對 snapshot 的管理,主要的需求是:

  • 用日期當 snapshot 的名字,例如 backup@2012-07-30
  • 可以分別針對年,月,日設定保存個數,例如30天內的每日備份,6個月內的每月保留一備份,3年內每年保留一備份。
  • 年、月原則上優先保留該年或該月之第一天,如果當天剛好沒備份,就往次日找,直到找到有備份為止。

用 perl 寫了一個 snapshot.pl 來配合這樣的需求,使用方法也很簡單,比如說要處理 backup/pighead,那就

# ./snapshot.pl backup/pighead

即可,預設是保留32天內的逐日備份,12個月內每月保留一份,一年內保留一份,如果不想照預設的話,後面可以加參數 D-M-Y (日-月-年),這個數字包含當日/月/年,例如要保留三天內、一月內、二年內:

# ./snapshot.pl backup/pighead 3-1-2

如果每天都有正常備份,會留下來的是

backup/pighead@2012-07-30 (當日)
backup/pighead@2012-07-29
backup/pighead@2012-07-28
backup/pighead@2012-07-01
backup/pighead@2012-01-01
backup/pighead@2011-01-01

年月日之間的規則彼此獨立,所以像是 60-20-3 (逐日備份跨月/逐月備份跨年) 或是設成 0-0-10 (只留每年備份) 都是可行的,如果設成 0-0-0 的話就相當於是全清空了。話說回來,更理想的方式是整合 quota 或是 refquota,在空間不足時用能內插方式強制刪除 snapshot,還要再花時間想想這部份要怎麼實作就是。

附帶一提,像是 time machine 這類的備份機制其實本來就有逐次備份跟配合容量刪除舊備份的能力,其實就不太需要用 snapshot.pl 這樣的機制了。不過因為走網路的 time machine 有時候會突然兩光結果怎麼修都修不好,為了保險起見我還是會丟個 15-0-0 之類的,這樣遇到修不好問題時至少還可以用 zfs rollback 回到正常的點再重新備份。另外因為 time machine 會抓可用空間做刪檔判斷的依據,用 refquota (算 quota 時不納入 snapshot 使用量) 限制大小會是比較穩定的方式。

Leave a Reply

Your email address will not be published. Required fields are marked *