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


22

我在许多Linux服务器上运行着许多Xen虚拟机。这些虚拟机使用/ dev / xenVG / SERVER001OS等行的设备名称将其磁盘映像存储在Linux LVM卷中。我想对这些磁盘映像进行定期备份,以便在需要时可以还原VM(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选项?

Answers:



16

尽管有用于RSync的“写入设备”和“复制设备”补丁,但它们仅适用于小图像(1-2GB)。RSync会花很多时间在较大的图像上寻找匹配的块,而40GB或较大的设备/文件几乎用处不大。

我们使用以下命令对每1MB的校验和进行比较,然后简单地复制不匹配的内容。我们使用它通过公共Internet将美国虚拟主机上的服务器备份到英国的备份系统。仅在几个小时后,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

起初我很害怕,但后来尝试了一下,它确实有效。
马丁

为什么read ARGV,$buf,1024read STDIN,$buf,1024@ sysadmin1138 代替?(我试图回答stackoverflow.com/q/22693823/2987828,并且在这里不了解ARGV)。我每天在问题stackoverflow.com/q/22693823/2987828中使用该变体,并且效果很好。
user2987828 2014年

1
请参阅perlmonks.org/bare/?node_id=492858,该文件说ARGV和STDIN相似,除非给定文件名作为参数。
user2987828 2014年

9

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


6

看看Zumastor Linux Storage Project,它通过ddsnap工具使用二进制“ rsync”实现了“快照”备份。

从手册页:

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


嗯,这就像我一直在寻找的东西,谢谢。
David Hicks,2009年

Zumastor项目的链接已过时,我想这是正确的链接:shapor.com/zumastor.org
Martin

2

有一个名为blocksync的python脚本,它是一种通过ssh在网络上同步两个块设备的简单方法,仅传输更改。

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

我最近对它进行了黑客攻击,以对其进行清理并将其更改为使用与rsync(Adler-32)相同的快速校验和算法。


1
我正在使用,效果很好。请注意,有一个修改后的版本可以修复可能的损坏源并使用更可靠的哈希。
cmc

1

如果您要尽量减少使用普通导线在电线上发送的空白空间dd,您难道不可以在将其输送到ssh之前将其输送到gzip吗?

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


它减少了所需的带宽,但是我们已经有了60和100 GB的磁盘映像,即使使用gzip,它也会花费太长时间。
David Hicks,2009年

@Ophidian,您应该知道SSH在内部处理压缩,这里有一个选项。
poige,2011年

1

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

例如,带有lvm快照的Mysql性能


确实,我的最初解决方案涉及简单地设置每日快照,然后与前一天的快照进行比较,然后将其添加到备份服务器。我非常生气,发现事情不会那么简单。
David Hicks,2009年

这可能不是真的有LVM薄快照被实现多不同
亚历˚F

0

除了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

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


0

这是一个古老的问题,但是没有人提到两个非常有用的工具来有效地同步两个块设备:

我强烈建议同时使用这两种工具,并选择更适合您预期用途的任何一种。


0

经过几年的搜索,最近我创建了一个用于在服务器之间同步LVM快照的工具。它旨在使用最少的IO,并允许系统在同步发生时运行。

它与ZFS发送/接收类似,因为它可以同步LVM快照之间的差异,并使用精简配置,从而将性能影响降至最低。

我需要反馈,所以请看一看。


-1

此脚本有一些效率:

  1. 至少在我的系统上,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 |
perl -ne'BEGIN {\ $ / = \ 1} if(\ $ _ eq \” s \“){\ $ s ++} else {if (\ $ s){搜寻STDOUT,\ $ s * 8192,1; \ $ s = 0};读取ARGV,\ $ buf,8192;打印\ $ buf}'1 <> $ dev2”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.