O rsync padrão está faltando esse recurso, mas há um patch para ele no tarball rsync-patches (copy-devices.diff) que pode ser baixado em
Eu tenho várias máquinas virtuais Xen em execução em vários servidores Linux. Essas VMs armazenam suas imagens de disco em volumes LVM do Linux com nomes de dispositivos ao longo das linhas de / dev / xenVG / SERVER001OS e assim por diante. Eu gostaria de fazer backups regulares dessas imagens de disco para que eu possa restaurar as VMs no caso de precisarmos (os dispositivos LVM já estão espelhados com DRBD entre duas máquinas físicas cada, estou apenas sendo paranóico aqui).
Como faço para isso? Obviamente, o primeiro passo é tirar um instantâneo do dispositivo LVM, mas como faço para transferir dados para um servidor de backup da maneira mais eficiente possível? Eu poderia simplesmente copiar todo o dispositivo, algo como:
dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"
... mas isso exigiria muita largura de banda. Existe uma ferramenta parecida com rsync para sincronizar o conteúdo de blocos inteiros de disco entre servidores remotos? Algo como:
rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img
Se eu entendi a página man do rsync corretamente, o comando acima não funcionará (não é?), mas mostra o que eu estou querendo. Eu entendo que a opção --sevices rsync é copiar os próprios dispositivos, não o conteúdo desses dispositivos. Fazer uma cópia local da imagem da VM antes de sincronizá-la com o servidor remoto não é uma opção, pois não há espaço em disco.
Existe um utilitário útil que pode sincronizar dispositivos de bloqueio e um arquivo de backup em um servidor remoto? Eu posso escrever um, se for preciso, mas uma solução existente seria melhor. Eu perdi uma opção de rsync que faz isso por mim?
Embora existam patches 'write-device' e 'copy-device' para o RSync, eles só funcionam bem em imagens pequenas (1-2GB). O RSync gastará muito tempo pesquisando blocos correspondentes em imagens maiores e será quase inútil usar dispositivos / arquivos de 40 GB ou mais.
Usamos o seguinte para realizar uma comparação por soma de verificação de 1 MB e, em seguida, simplesmente copiamos o conteúdo se ele não corresponder. Nós usamos isso para backup de servidores em um host virtual nos EUA para um backup sistema no Reino Unido, através da Internet pública. Muito pouca atividade de CPU e desempenho de snapshot acerto é só depois de horas:
Criar instantâneo:
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]';
Semente inicial:
dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"
Backup nocturno incremental (envia apenas blocos alterados):
ssh -i /root/.ssh/rsync_rsa $remote "
perl -'MDigest::MD5 md5' -ne 'BEGIN{\$/=24};print md5(\$_)' $dev2 | lzop -c" |
lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=24};$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{\$/=} if (\$_ eq\"s\") {\$s++} else {if (\$s) {
seek STDOUT,\$s*1024,1; \$s=0}; read ARGV,\$buf,1024; print \$buf}' 1<> $dev2"
Remover instantâneo:
lvremove -f company-exchange-snap1
As pessoas interessadas em fazer isso especificamente com os instantâneos do LVM podem gostar da minha ferramenta lvmsync , que lê a lista de blocos alterados em um instantâneo e envia apenas essas mudanças.
Dê uma olhada no Projeto de Armazenamento Linux Zumastor ele implementa o backup "instantâneo" usando o binário "rsync" via ferramenta ddsnap .
Da página do manual:
O ddsnap fornece replicação de dispositivo de bloco, dado um recurso de instantâneo em nível de bloco capaz de manter múltiplos snapshots simultâneos com eficiência. O ddsnap pode gerar uma lista de fragmentos de snapshots que diferem entre dois snapshots e, em seguida, enviar essa diferença pelo fio. Em um servidor downstream, grave os dados atualizados em um dispositivo de bloco instantâneo.
Existe um script python chamado blocksync que é uma maneira simples de sincronizar dois dispositivos de bloco em uma rede via ssh, transferindo apenas alterar.
- Copy blocksync.py to the home directory on the remote host
- Make sure your remote user can either sudo or is root itself
- Make sure your local user (root?) can read the source device & ssh to the remote host
- Invoke:
python blocksync.py /dev/source user@remotehost /dev/dest
Eu o hackeei recentemente para limpá-lo e alterá-lo para usar o mesmo algoritmo de soma de verificação rápida que o rsync ( Adler-32 ).
Se você está tentando minimizar a quantidade de espaço vazio que você enviaria através do fio com um dd
simples, você não poderia simplesmente canalizá-lo para o gzip antes de enviá-lo para o ssh?
por exemplo. dd if = / dev / xenVG / SERVER001OS | gzip | ssh administrador @ backupserver "dd de = / mnt / largeDisk / SERVER001OS.img.gz"
Apenas tome cuidado, pois o desempenho de um sistema que possui instantâneos de LVM é proporcional ao número de instantâneos.
Por exemplo, Mysql desempenho com instantâneos lvm
Além da resposta de David Herselman - o script a seguir será sincronizado com um dispositivo local :
perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=24};print md5($_)' $dev2 |
perl -'MDigest::MD5 md5' -ne 'BEGIN{$/=24};$b=md5($_);
read STDIN,$a,16;if ($a eq $b) {print "s"} else {print "c" . $_}' $dev1 |
perl -ne 'BEGIN{$/=} if ($_ eq"s") {$s++} else {if ($s) {
seek STDOUT,$s*1024,1; $s=0}; read ARGV,$buf,1024; print $buf}' 1<> $dev2
Até onde eu sei, ambos os scripts foram publicados pela primeira vez em lists.samba.org .
Essa é uma pergunta antiga, mas ninguém mencionou duas ferramentas muito úteis para sincronizar com eficiência dois dispositivos de bloco:
bdsync , que usa uma abordagem diff-transfer-and-patch;
blocksync (aqui você pode encontrar minha versão melhorada ), que usa uma abordagem de reconfiguração local.
Sugiro strongmente que você jogue com ambas ferramentas e selecione o que melhor se adaptar ao seu uso pretendido.
Houve algumas eficiências a serem feitas neste script:
ssh -i /root/.ssh/rsync_rsa $remote " perl -'MDigest::MD5 md5' -ne 'BEGIN{$|=1;\$/=2};print md5(\$)' $dev2 | lzop -c" | lzop -dc | perl -'MDigest::MD5 md5' -ne 'BEGIN{$|=1;$/=92};$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{\$/=} if (\$_ eq\"s\") {\$s++} else {if (\$s) { seek STDOUT,\$s*8192,1; \$s=0}; read ARGV,\$buf,8192; print \$buf}' 1<> $dev2"
Tags backup rsync lvm linux virtual-machines