Sincronizar os instantâneos do LVM com o servidor de backup

20

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?

    
por David Hicks 17.06.2009 / 18:14

10 respostas

11

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 Depois de aplicar e recompilar, você pode rsyncar dispositivos com a opção --copy-devices.

    
por 24.06.2009 / 18:29
16

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
    
por 07.08.2010 / 07:57
9

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.

    
por 29.10.2011 / 05:33
6

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.

    
por 17.06.2009 / 18:42
2

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 ).

    
por 04.11.2011 / 00:44
1

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"

    
por 24.06.2009 / 19:37
1

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

    
por 24.06.2009 / 19:00
0

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 .

    
por 28.08.2013 / 08:07
0

Essa é uma pergunta antiga, mas ninguém mencionou duas ferramentas muito úteis para sincronizar com eficiência dois dispositivos de bloco:

Sugiro strongmente que você jogue com ambas ferramentas e selecione o que melhor se adaptar ao seu uso pretendido.

    
por 03.08.2018 / 22:56
-1

Houve algumas eficiências a serem feitas neste script:

  1. Pelo menos no meu sistema, as leituras de buffer perl são 8k, portanto use o tamanho de bloco 8192.
  2. autoflush para que a extremidade local não bloqueie até que o buffer de saída remota esteja 'cheio', já que estamos alimentando o lzop, o buffer parece sem sentido.

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"

    
por 11.12.2014 / 02:37