樹莓派自建NAS云盤之——數(shù)據(jù)自動(dòng)備份
把你的樹莓派變成數(shù)據(jù)的安全之所。
在《樹莓派自建 NAS 云盤》系列的 ***篇 文章中,我們討論了建立 NAS 的一些基本步驟,添加了兩塊 1TB 的存儲(chǔ)硬盤驅(qū)動(dòng)(一個(gè)用于數(shù)據(jù)存儲(chǔ),一個(gè)用于數(shù)據(jù)備份),并且通過網(wǎng)絡(luò)文件系統(tǒng)(NFS)將數(shù)據(jù)存儲(chǔ)盤掛載到遠(yuǎn)程終端上。本文是此系列的第二篇文章,我們將探討數(shù)據(jù)自動(dòng)備份。數(shù)據(jù)自動(dòng)備份保證了數(shù)據(jù)的安全,為硬件損壞后的數(shù)據(jù)恢復(fù)提供便利以及減少了文件誤操作帶來的不必要的麻煩。
備份策略
我們就從為小型 NAS 構(gòu)想一個(gè)備份策略著手開始吧。我建議每天有時(shí)間節(jié)點(diǎn)、有計(jì)劃的去備份數(shù)據(jù),以防止干擾到我們正常的訪問 NAS,比如備份時(shí)間點(diǎn)避開正在訪問 NAS 并寫入文件的時(shí)間點(diǎn)。舉個(gè)例子,你可以每天凌晨 2 點(diǎn)去進(jìn)行數(shù)據(jù)備份。
另外,你還得決定每天的備份需要被保留的時(shí)間長短,因?yàn)槿绻麤]有時(shí)間限制,存儲(chǔ)空間很快就會(huì)被用完。一般每天的備份保留一周便可以,如果數(shù)據(jù)出了問題,你便可以很方便的從備份中恢復(fù)出來原數(shù)據(jù)。但是如果需要恢復(fù)數(shù)據(jù)到更久之前怎么辦?可以將每周一的備份文件保留一個(gè)月、每個(gè)月的備份保留更長時(shí)間。讓我們把每月的備份保留一年時(shí)間,每一年的備份保留更長時(shí)間、例如五年。
這樣,五年內(nèi)在備份盤上產(chǎn)生大量備份:
- 每周 7 個(gè)日備份
- 每月 4 個(gè)周備份
- 每年 12 個(gè)月備份
- 每五年 5 個(gè)年備份
你應(yīng)該還記得,我們搭建的備份盤和數(shù)據(jù)盤大小相同(每個(gè) 1 TB)。如何將不止 10 個(gè) 1TB 數(shù)據(jù)的備份從數(shù)據(jù)盤存放到只有 1TB 大小的備份盤呢?如果你創(chuàng)建的是完整備份,這顯然不可能。因此,你需要?jiǎng)?chuàng)建增量備份,它是每一份備份都基于上一份備份數(shù)據(jù)而創(chuàng)建的。增量備份方式不會(huì)每隔一天就成倍的去占用存儲(chǔ)空間,它每天只會(huì)增加一點(diǎn)占用空間。
以下是我的情況:我的 NAS 自 2016 年 8 月開始運(yùn)行,備份盤上有 20 個(gè)備份。目前,我在數(shù)據(jù)盤上存儲(chǔ)了 406GB 的文件。我的備份盤用了 726GB。當(dāng)然,備份盤空間使用率在很大程度上取決于數(shù)據(jù)的更改頻率,但正如你所看到的,增量備份不會(huì)占用 20 個(gè)完整備份所需的空間。然而,隨著時(shí)間的推移,1TB 空間也可能不足以進(jìn)行備份。一旦數(shù)據(jù)增長接近 1TB 限制(或任何備份盤容量),應(yīng)該選擇更大的備份盤空間并將數(shù)據(jù)移動(dòng)轉(zhuǎn)移過去。
利用 rsync 進(jìn)行數(shù)據(jù)備份
利用 rsync
命令行工具可以生成完整備份。
pi@raspberrypi:~ $ rsync -a /nas/data/ /nas/backup/2018-08-01
這段命令將掛載在 /nas/data/
目錄下的數(shù)據(jù)盤中的數(shù)據(jù)進(jìn)行了完整的復(fù)制備份。備份文件保存在 /nas/backup/2018-08-01
目錄下。-a
參數(shù)是以歸檔模式進(jìn)行備份,這將會(huì)備份所有的元數(shù)據(jù),例如文件的修改日期、權(quán)限、擁有者以及軟連接文件。
現(xiàn)在,你已經(jīng)在 8 月 1 日創(chuàng)建了完整的初始備份,你將在 8 月 2 日創(chuàng)建***個(gè)增量備份。
pi@raspberrypi:~ $ rsync -a --link-dest /nas/backup/2018-08-01/ /nas/data/ /nas/backup/2018-08-02
上面這行代碼又創(chuàng)建了一個(gè)關(guān)于 /nas/data
目錄中數(shù)據(jù)的備份。備份路徑是 /nas/backup/2018-08-02
。這里的參數(shù) --link-dest
指定了一個(gè)備份文件所在的路徑。這樣,這次備份會(huì)與 /nas/backup/2018-08-01
的備份進(jìn)行比對(duì),只備份已經(jīng)修改過的文件,未做修改的文件將不會(huì)被復(fù)制,而是創(chuàng)建一個(gè)到上一個(gè)備份文件中它們的硬鏈接。
使用備份文件中的硬鏈接文件時(shí),你一般不會(huì)注意到硬鏈接和初始拷貝之間的差別。它們表現(xiàn)的完全一樣,如果刪除其中一個(gè)硬鏈接或者文件,其他的依舊存在。你可以把它們看做是同一個(gè)文件的兩個(gè)不同入口。下面就是一個(gè)例子:
左側(cè)框是在進(jìn)行了第二次備份后的原數(shù)據(jù)狀態(tài)。中間的方塊是昨天的備份。昨天的備份中只有圖片 file1.jpg
并沒有 file2.txt
。右側(cè)的框反映了今天的增量備份。增量備份命令創(chuàng)建昨天不存在的 file2.txt
。由于 file1.jpg
自昨天以來沒有被修改,所以今天創(chuàng)建了一個(gè)硬鏈接,它不會(huì)額外占用磁盤上的空間。
自動(dòng)化備份
你肯定也不想每天凌晨去輸入命令進(jìn)行數(shù)據(jù)備份吧。你可以創(chuàng)建一個(gè)任務(wù)定時(shí)去調(diào)用下面的腳本讓它自動(dòng)化備份。
#!/bin/bash
TODAY=$(date +%Y-%m-%d)
DATADIR=/nas/data/
BACKUPDIR=/nas/backup/
SCRIPTDIR=/nas/data/backup_scripts
LASTDAYPATH=${BACKUPDIR}/$(ls ${BACKUPDIR} | tail -n 1)
TODAYPATH=${BACKUPDIR}/${TODAY}
if [[ ! -e ${TODAYPATH} ]]; then
mkdir -p ${TODAYPATH}
fi
rsync -a --link-dest ${LASTDAYPATH} ${DATADIR} ${TODAYPATH} $@
${SCRIPTDIR}/deleteOldBackups.sh
***段代碼指定了數(shù)據(jù)路徑、備份路徑、腳本路徑以及昨天和今天的備份路徑。第二段代碼調(diào)用 rsync
命令。***一段代碼執(zhí)行 deleteOldBackups.sh
腳本,它會(huì)清除一些過期的沒有必要的備份數(shù)據(jù)。如果不想頻繁的調(diào)用 deleteOldBackups.sh
,你也可以手動(dòng)去執(zhí)行它。
下面是今天討論的備份策略的一個(gè)簡(jiǎn)單完整的示例腳本。
#!/bin/bash
BACKUPDIR=/nas/backup/
function listYearlyBackups() {
for i in 0 1 2 3 4 5
do ls ${BACKUPDIR} | egrep "$(date +%Y -d "${i} year ago")-[0-9]{2}-[0-9]{2}" | sort -u | head -n 1
done
}
function listMonthlyBackups() {
for i in 0 1 2 3 4 5 6 7 8 9 10 11 12
do ls ${BACKUPDIR} | egrep "$(date +%Y-%m -d "${i} month ago")-[0-9]{2}" | sort -u | head -n 1
done
}
function listWeeklyBackups() {
for i in 0 1 2 3 4
do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "last monday -${i} weeks")"
done
}
function listDailyBackups() {
for i in 0 1 2 3 4 5 6
do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "-${i} day")"
done
}
function getAllBackups() {
listYearlyBackups
listMonthlyBackups
listWeeklyBackups
listDailyBackups
}
function listUniqueBackups() {
getAllBackups | sort -u
}
function listBackupsToDelete() {
ls ${BACKUPDIR} | grep -v -e "$(echo -n $(listUniqueBackups) |sed "s/ /\\\|/g")"
}
cd ${BACKUPDIR}
listBackupsToDelete | while read file_to_delete; do
rm -rf ${file_to_delete}
done
這段腳本會(huì)首先根據(jù)你的備份策略列出所有需要保存的備份文件,然后它會(huì)刪除那些再也不需要了的備份目錄。
下面創(chuàng)建一個(gè)定時(shí)任務(wù)去執(zhí)行上面這段代碼。以 root 用戶權(quán)限打開 crontab -e
,輸入以下這段命令,它將會(huì)創(chuàng)建一個(gè)每天凌晨 2 點(diǎn)去執(zhí)行 /nas/data/backup_scripts/daily.sh
的定時(shí)任務(wù)。
0 2 * * * /nas/data/backup_scripts/daily.sh
有關(guān)創(chuàng)建定時(shí)任務(wù)請(qǐng)參考 cron 創(chuàng)建定時(shí)任務(wù)。
- 當(dāng)沒有備份任務(wù)時(shí),卸載你的備份盤或者將它掛載為只讀盤;
- 利用遠(yuǎn)程服務(wù)器作為你的備份盤,這樣就可以通過互聯(lián)網(wǎng)同步數(shù)據(jù)
你也可用下面的方法來加強(qiáng)你的備份策略,以防止備份數(shù)據(jù)的誤刪除或者被破壞:
本文中備份策略示例是備份一些我覺得有價(jià)值的數(shù)據(jù),你也可以根據(jù)個(gè)人需求去修改這些策略。
我將會(huì)在 《樹莓派自建 NAS 云盤》 系列的第三篇文章中討論 Nextcloud。Nextcloud 提供了更方便的方式去訪問 NAS 云盤上的數(shù)據(jù)并且它還提供了離線操作,你還可以在客戶端中同步你的數(shù)據(jù)。