Linux

將 LVM 快照同步到備份伺服器

  • June 23, 2019

我有許多 Xen 虛擬機在許多 Linux 伺服器上執行。這些 VM 將其磁碟映像儲存在 Linux LVM 卷中,設備名稱類似於 /dev/xenVG/SERVER001OS 等。我想定期備份這些磁碟映像,以便在需要時恢復虛擬機(LVM 設備已經在兩台物理機器之間使用 DRBD 進行了鏡像,我只是在這裡更加偏執)。

我該怎麼做?顯然第一步是對 LVM 設備進行快照,但是我如何以最有效的方式將數據傳輸到備份伺服器?我可以簡單地複制整個設備,類似於:

dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"

…但這會佔用大量頻寬。是否有類似 rsync 的工具用於在遠端伺服器之間同步整個磁碟塊的內容?就像是:

rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img

如果我正確理解了 rsync 的手冊頁,上面的命令實際上不會起作用(會嗎?),但它顯示了我的目標。我了解 –devices rsync 選項是複制設備本身,而不是這些設備的內容。在與遠端伺服器同步之前製作 VM 映像的本地副本不是一種選擇,因為沒有磁碟空間。

是否有一個方便的實用程序可以在塊設備和遠端伺服器上的備份文件之間進行同步?如果必須,我可以寫一個,但現有的解決方案會更好。我是否錯過了為我執行此操作的 rsync 選項?

標準 rsync 缺少此功能,但在 rsync-patches tarball (copy-devices.diff) 中有一個更新檔,可以從http://rsync.samba.org/ftp/rsync/下載 應用並重新編譯後,您可以使用 –copy-devices 選項 rsync 設備。

儘管 RSync 有“寫入設備”和“複製設備”更新檔,但它們僅適用於小圖像 (1-2GB)。RSync 將花費很長時間在更大的圖像上搜尋匹配的塊,並且它對 40GB 或更大的設備/文件幾乎沒有用處。

我們使用以下內容執行每 1MB 的校驗和比較,如果內容不匹配,則簡單地複制內容。我們使用它通過公共網際網路將美國虛擬主機上的伺服器備份到英國的備份系統。很少的 CPU 活動和快照性能僅在幾個小時後受到影響:

創建快照:

lvcreate -i 2 -L 25G /dev/vg_kvm/company-exchange -n company-exchange-snap1

export dev1='/dev/mapper/vg_kvm-company--exchange--snap1';
export dev2='/dev/mapper/vg_kvm-company--exchange';
export remote='root@backup.company.co.za';

初始播種:

dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"

增量夜間備份(僅發送更改的塊):

ssh -i /root/.ssh/rsync_rsa $remote "
 perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=\1024};print md5(\$_)' $dev2 | lzop -c" |
 lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_);
   read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | lzop -c |
ssh -i /root/.ssh/rsync_rsa $remote "lzop -dc |
 perl -ne 'BEGIN{\$/=\1} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
   seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"

刪除快照:

lvremove -f company-exchange-snap1

引用自:https://serverfault.com/questions/27397