将LVM快照同步到备份服务器

我在许多Linux服务器上运行了许多Xen虚拟机。 这些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镜像的本地副本不是一个选项,因为没有磁盘空间。

是否有一个方便的工具,可以在块设备和远程服务器上的备份文件之间同步? 如果必须,我可以写一个,但现有的解决scheme会更好。 我错过了一个rsync选项,为我做这个?

标准的rsync缺less这个function,但在rsync-patches tarball(copy-devices.diff)中有一个补丁可以从http://rsync.samba.org/ftp/rsync/下载。申请和重新编译后,您可以使用–copy-devices选项来rsync设备。

尽pipeRSync有“写入设备”和“复制设备”补丁,但它们只适用于小图像(1-2GB)。 RSync会花费很长时间在较大的图像上search匹配的块,并且几乎没有40GB或更大的设备/文件。

我们使用以下内容来执行每1MB的校验和比较,然后只要复制不匹配的内容即可。 我们通过公共互联网将美国虚拟主机上的服务器备份到英国的备份系统。 很less的CPU活动和快照性能只是在几个小时之后才能实现:

创build快照:

 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='[email protected]'; 

初播:

 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 

对LVM快照特别感兴趣的用户可能会喜欢我的lvmsync工具,该工具读取快照中已更改块的列表,并只发送这些更改。

看看Zumastor Linux存储项目,它使用二进制“rsync”通过ddsnap工具实现“快照”备份。

从手册页:

ddsnap提供块设备复制给定一个块级快照设施,能够有效地保存多个同时快照。 ddsnap可以生成两个快照之间不同的快照块列表,然后通过线路发送该差异。 在下游服务器上,将更新的数据写入快照块设备。

有一个名为blocksync的python脚本,它是通过ssh通过networking同步两个块设备的简单方法,只是传输更改。

  • 将blocksync.py复制到远程主机的主目录
  • 确保您的远程用户可以sudo或root本身
  • 确保您的本地用户(root?)可以将源设备ssh读取到远程主机
  • 调用: python blocksync.py /dev/source user@remotehost /dev/dest

我最近在黑客中进行了清理,并将其更改为使用与rsync( Adler-32 )相同的快速校验algorithm。

如果你想尽量减less你通过电话线发送的空白空间的数量,你能不能把它pipe道到gzip之前pipe道到ssh?

例如dd if = / dev / xenVG / SERVER001OS | gzip | ssh administrator @ backupserver“dd of = / mnt / largeDisk / SERVER001OS.img.gz”

请注意,具有LVM快照的系统的性能与快照数量成正比。

例如, 使用lvm快照的Mysql性能

除了David Herselman的回答 – 以下脚本将同步到本地设备:

 perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};print md5($_)' $dev2 | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=\1024};$b=md5($_); read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 | 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 

据我所知,这两个脚本首先发布在lists.samba.org 。

这个脚本有一些效率:

  1. 至less在我的系统上,perl缓冲区读取是8k,所以使用8192块大小。
  2. 自动刷新,所以本地结束不会阻止,直到远程输出缓冲区是'充分',因为我们喂lzop缓冲似乎毫无意义。

ssh -i /root/.ssh/rsync_rsa $ remote“perl -'MDigest :: MD5 md5'-ne'BEGIN {$ | = 1; \ $ / = \ 892}; print md5(\ $ )'$ dev2 | lzop -c“| lzop -dc | perl -'MDigest :: MD5 md5'-ne'BEGIN {$ | = 1; $ / = \ 8192}; $ b = md5($ ); 阅读STDIN,$ a,16; if($ a eq $ b){print“s”} else {print“c”。 $ _}'$ dev1 | lzop -c | ssh -i /root/.ssh/rsync_rsa $ remote“lzop -dc |
如果(\ $ _ eq \“s \”){\ $ s ++} else {if(\ $ s){seek STDOUT,\ $ s * 8192,1; \ $ S = 0}; 阅读ARGV,\ $ buf,8192; print \ $ buf}'1 <> $ dev2“