最近想架設 NextCloud 來放一些東西,但是無奈 VPS 空間太小,於是四處尋找便宜的 Storage VPS,經過一段時間搜尋,覺得 BudgetNode STOR250 價格上跟容量上都還算 OK ($24 / y),猶他州離本來的主機洛杉磯也不算太遠(應該吧),準備要下手的時候突然想到,小蛙的 VPS 加一加也有 50, 60 GB,而且大部份空間都是放互相備份的檔案,如果可以把備份檔案移去別的地方放著,e.g. Google Drive(誤),那就有更多空間可以儲存了,等到時候真的不夠再買好了,於是就開始了今天的跳坑記。

首先查了很多備份的問題,小蛙原本是將要備份的目錄 tar 成 bz2,然後透過 Dropbox 機制同步到雲端儲存,因空間問題再搭配計算天數的指令,來定期刪除 n 天前的備份,剛去翻這篇文章竟然已經是 Ubuntu 11.04 的事情,真是慚愧 …

這樣做遇到一個問題是,因為主機上及 Dropbox 空間太小,可以留存的備份天數就很少,好處是每一份備份都是完整備份,由於天天備份,萬一系統出了問題,也可以抓前一天的備份出來直接上。

Tar 備份方案

既然空間不足,又不買新空間,那就找看看其他備份方案,上網搜尋了下,知道 tar 可以做到三種備份:

完整備份

就是小蛙現在正在用的方案,每個備份檔案都是完整的,優點是每次只要把單檔解壓縮蓋回就好了,缺點就是佔用空間大

差異備份

設定一個時間點做完整備份,往後的備份以這個備份為基礎,有變動的檔案才進行備份,例如:

每個月 1 號進行完整備份,往後的 29 ~ 30 號都進行差異備份,
如果在 15 號的時候需要進行資料回復,只需要 1 號的完整備份 + 14 號的差異備份,即可得到 14 號的完整備份。

優點是跟完整備份比較起來儲存空間可以降低不少缺點是如果後面的備份資料變動跟基礎完整備份差異太多,跟增量備份比較起來,也還是會佔用不少空間

增量備份

這個方案前半部跟差異備份一樣,都必須要先有一個完整備份為基礎,後面的備份都是跟上一份備份來做比較,例如:

每個月 1 號進行完整備份,往後的 29 ~ 30 號都進行增量備份。
如果在 15 號的時候需要進行資料回復,此時需要 1 號的完整備份 + 2 ~ 14 號的增量備份,才可以得到 14 號的完整備份。
由於每個增量備份都是以上一個備份為基礎,因此回復備份的時候 2 號的要根據 1 號,3 號的要根據 2 號,以此類推,才能得到所有的備份。

優點是儲存空間理論上會是三者最少缺點是還原要一步一步照順序進行,以及如果少了其中一個,就沒辦法正確還原

三種方案都有好有壞,青菜蘿蔔各有所好,沒有一定好或是一定不好,完全取決於適不適合自己的環境及使用習慣。基於上述分析,小蛙最後選擇了「增量備份」。

Tar 增量備份流程

小蛙本來就有完整備份的腳本(詳情請參考定期備份WordPress到Dropbox),只要拿來修改一下就可以用了。

  1. 建立備份的時候,必須透過 -g 參數來指定記錄檔
  2. 如果記錄檔不存在,會建立一個記錄檔並執行完整備份,把備份資訊記錄在記錄檔中
  3. 如果記錄檔已存在,就會以此記錄檔為基礎進行增量備份

上面看起來應該很好理解吧!下面是小蛙自己用來備份 /var/www 的指令

tar -g 記錄檔位置 -jpc -f 備份檔案名稱.tar.bz2 --one-file-system 要備份的資料夾
-g 記錄檔位置:這裡最好使用絕對路徑,e.g. /root/snapshot
-jpc bz2 的壓縮參數
-f 備份檔案名稱:bj4
–one-file-system 只限制本機的檔案系統

指令看起來有點複雜,但是只要照著填就可以了,例如:

tar -g /root/snapshot-www -jpc -f /root/vpsbackup/www-$(date +%Y%m%d).tar.bz2 --one-file-system /var/www

檔案名稱可以隨便取,有些人可能會把完整備份取名為 www-fullbackup-xxxx.tar.bz2,增量備份取名為 www-incremental-xxxx.tar.bz2,這個純粹是為了讓自己好辨識,如果確定 1 號一定是完整備份,其他天一定是增量備份,倒也是不用這麼麻煩。

這裡要特別介紹的一個參數是--one-file-system,小蛙剛開始測試的第二天,就發現奇怪,/var/www 的備份為什麼兩個差不多大,到底哪裡出了問題,仔細一查才發現,原來小蛙在 /var/www 下面有掛載其他主機,因此在下 tar 指令的時候,把這些檔案全部一起 tar 進去了,又正好小蛙上傳了一批資料,所以第一天的完整備份原本就很大,第二天又增加了剛好差不多量的資料,造成第二天的檔案跟第一天的一樣大 … 真是太巧合,下了--one-file-system排除之後,完整備份檔跟增量備份檔的 size 就正常了。

有了備份檔之後,當然是希望用不到,但是世事難料,如果真的必須要用上,請服用以下指令

tar -jxv -G -f www-2018-11-01.tar.bz2 -C /root/recovery
tar -jxv -G -f www-2018-11-02.tar.bz2 -C /root/recovery
... # 要從 1 號的完整備份,一直執行到前一天的增量備份
tar -jxv -G -f www-2018-11-14.tar.bz2 -C /root/recovery

小蛙一開始看到沒有介紹完全的文章,裡面提及 tar 增量備份無法記錄刪除動作,也就是原本有 a b c 三個檔案,後來增量備份刪除 c 並增加 d,當還原的時候會出現 a b c d 四個檔案,這小蛙一看就覺得問題很大,用這來備份最後一定會出問題,而 -G 就可以完全避掉這個困擾,加上這參數後,就可以正確還原 a b d 四個檔案了!

其他的坑,小蛙將陸續更新。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *