
我們的應用程式迄今已生成超過 54 萬張圖像。圖像保存在樹結構中,到目前為止使用了 500 萬個索引節點。
我們希望每天在遠端異地伺服器中備份資料。我們考慮過使用 rsync,但我們不確定它是否是最快的方法。
你們對有效的備份策略有什麼建議嗎?
答案1
天哪,每天掃描 5,000,000 個 inode 才能找到發生變化的文件,需要這麼長時間!
如果有辦法只備份自上次備份以來的變更怎麼辦?
好吧,你可以…與快照!
快照的最大障礙是切換到支援快照的檔案系統。
在 Linux 上,兩個著名的快照檔案系統是:
兩者都是寫時複製檔案系統。這對您來說實際上意味著它們會追蹤自上次快照以來的更改,以便當您將最新快照發送到備份伺服器時,只會發送更改,但您仍然擁有您決定的所有每日備份的完整副本保留。
這意味著作為獎勵,您有可能保留一天以上的備份,而無需太多額外空間(僅是每天更改所使用的磁碟空間),並且您可以靈活刪除備份,保留每週、每月、或根據您的需要每年備份。
Btrfs 增量備份
這是您可以運行來進行增量備份並將其發送到備份伺服器的命令範例:
# Make a snapshot
btrfs subvolume snapshot -r /app/data /backup/app-data-$(date "+%Y%m%dT%H%M%S%Z")
# Ensure the snapshot is saved
sync
# Find your latest snapshot, referred to as `/backup/app-data-THIS_BACKUP_TIMESTAMP` below
ls -lhtr /backup/
# Send the snapshot since the previous snapshot to the backup server
btrfs send -p /backup/app-data-LAST_BACKUP_TIMESTAMP /backup/app-data-THIS_BACKUP_TIMESTAMP | ssh BACKUP_USER@BACKUP_SERVER "btrfs receive /backup/app-data"
筆記:-p /backup/app-data-LAST_BACKUP_TIMESTAMP
如果這是第一次備份,則從最後一個命令中排除。
ZFS 增量備份
這是您可以運行來進行增量備份並將其發送到備份伺服器的命令範例:
# Create a snapshot of the "data" dataset in your "app-pool" zpool
zfs snapshot app-pool/data@$(date "+%Y%m%dT%H%M%S%Z")
# Find your latest snapshot, referred to as `app-pool/data@THIS_BACKUP_TIMESTAMP` below
zfs list -rt snapshot app-pool/data
# Send the snapshot since the previous snapshot to the backup server
zfs send -i app-pool/data@LAST_BACKUP_TIMESTAMP app-pool/data@THIS_BACKUP_TIMESTAMP | ssh BACKUP_USER@BACKUP_SERVER "zfs receive backup-pool/app-data"
筆記:-i app-pool/data@LAST_BACKUP_TIMESTAMP
如果這是第一次備份,則從最後一個命令中排除。