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

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

我有许多 Xen 虚拟机运行在多台 Linux 服务器上。这些虚拟机将其磁盘映像存储在 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 映像与远程服务器同步之前制作 VM 映像的本地副本不是一个选择,因为没有磁盘空间。

是否有一个方便的实用程序可以在块设备和远程服务器上的备份文件之间进行同步?如果有必要,我可以编写一个,但现有的解决方案会更好。我是否错过了一个可以帮我完成此操作的 rsync 选项?

答案1

标准 rsync 缺少此功能,但在 rsync-patches tarball(copy-devices.diff)中有一个补丁,可以从以下位置下载http://rsync.samba.org/ftp/rsync/ 应用并重新编译后,您可以使用 --copy-devices 选项 rsync 设备。

答案2

尽管 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='[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

答案3

对使用 LVM 快照进行此操作感兴趣的人可能会喜欢我的lvm同步工具,它读取快照中已更改块的列表并仅发送那些更改。

答案4

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

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

我最近对它进行了修改,清理了它,并将其改为使用与 rsync 相同的快速校验和算法(阿德勒-32)。

相关内容