Sincronizar instantáneas LVM con el servidor de respaldo

22

Tengo varias máquinas virtuales Xen que se ejecutan en varios servidores Linux. Estas máquinas virtuales almacenan sus imágenes de disco en volúmenes Linux LVM con nombres de dispositivos en la línea de / dev / xenVG / SERVER001OS y así sucesivamente. Me gustaría realizar copias de seguridad periódicas de esas imágenes de disco para poder restaurar las máquinas virtuales en caso de que lo necesitemos (los dispositivos LVM ya están reflejados con DRBD entre dos máquinas físicas cada uno, solo estoy siendo más paranoico aquí).

¿Cómo hago esto? Obviamente, el primer paso es tomar una instantánea del dispositivo LVM, pero ¿cómo transfiero los datos a un servidor de respaldo de la manera más eficiente posible? Simplemente podría copiar todo el dispositivo, algo como:

dd if=/dev/xenVG/SERVER001OS | ssh administrator@backupserver "dd of=/mnt/largeDisk/SERVER001OS.img"

... pero eso requeriría mucho ancho de banda. ¿Existe una herramienta similar a rsync para sincronizar contenidos de bloques de disco enteros entre servidores remotos? Algo como:

rsync /dev/xenVG/SERVER001OS backupServer:/mnt/largeDisk/SERVER001OS.img

Si entiendo la página de manual de rsync correctamente, el comando anterior no funcionará realmente (¿verdad?), Pero muestra lo que estoy buscando. Entiendo que la opción --devices rsync es copiar los dispositivos ellos mismos, no el contenido de esos dispositivos. Hacer una copia local de la imagen de VM antes de sincronizarlo con el servidor remoto no es una opción, ya que no hay espacio en disco.

¿Existe alguna utilidad útil que pueda sincronizarse entre dispositivos de bloque y un archivo de respaldo en un servidor remoto? Puedo escribir uno si es necesario, pero una solución existente sería mejor. ¿Me he perdido una opción rsync que hace esto por mí?

David Hicks
fuente

Respuestas:

12

A rsync estándar le falta esta función, pero hay un parche en el tarball rsync-parches (copy-devices.diff) que se puede descargar desde http://rsync.samba.org/ftp/rsync/ Después de aplicar y recompilar , puede rsync dispositivos con la opción --copy-devices.

Balázs Pozsár
fuente
si su objetivo es un dispositivo, el parche se encuentra aquí: bugzilla.redhat.com/show_bug.cgi?id=1193654
Jason Pyeron
16

Aunque hay parches de 'dispositivo de escritura' y 'dispositivo de copia' para RSync, solo funcionan bien en imágenes pequeñas (1-2GB). RSync pasará años buscando bloques coincidentes en imágenes más grandes y es casi inútil con dispositivos / archivos de 40 GB o más.

Usamos lo siguiente para realizar una comparación de suma de verificación por 1MB y luego simplemente copiamos el contenido si no coincide. Usamos esto para respaldar servidores en un host virtual en los EE. UU. En un sistema de respaldo en el Reino Unido, a través de Internet público. Muy poca actividad de la CPU y el impacto en el rendimiento de la instantánea es solo después de horas:

Crear instantánea:

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]';

Siembra inicial:

dd if=$dev1 bs=100M | gzip -c -9 | ssh -i /root/.ssh/rsync_rsa $remote "gzip -dc | dd of=$dev2"

Copia de seguridad nocturna incremental (solo envía bloques modificados):

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"

Eliminar instantánea:

lvremove -f company-exchange-snap1
sysadmin1138
fuente
Al principio tenía miedo, pero luego lo probé y realmente funciona.
Martin
¿Por qué en read ARGV,$buf,1024lugar de read STDIN,$buf,1024@ sysadmin1138? (Estoy tratando de responder a stackoverflow.com/q/22693823/2987828 y no entiendo ARGV aquí). Uso todos los días la variante en la pregunta stackoverflow.com/q/22693823/2987828 y funciona bien.
user2987828
1
vea perlmonks.org/bare/?node_id=492858 que dice que ARGV y STDIN son similares a menos que se proporcione un nombre de archivo como argumento.
user2987828
9

A las personas interesadas en hacer esto específicamente con instantáneas LVM les puede gustar mi herramienta lvmsync , que lee la lista de bloques modificados en una instantánea y envía solo esos cambios.

womble
fuente
6

Eche un vistazo a Zumastor Linux Storage Project , implementa una copia de seguridad de "instantánea" utilizando "rsync" binario a través de la herramienta ddsnap .

Desde la página del manual:

ddsnap proporciona la replicación de dispositivos de bloque dada una instalación de instantáneas a nivel de bloque capaz de almacenar múltiples instantáneas simultáneas de manera eficiente. ddsnap puede generar una lista de fragmentos de instantáneas que difieren entre dos instantáneas y luego enviar esa diferencia por cable. En un servidor posterior, escriba los datos actualizados en un dispositivo de bloque capturado.

rkthkr
fuente
Ah, parece exactamente el tipo de cosas que estaba buscando, gracias.
David Hicks
El enlace al proyecto Zumastor está desactualizado, creo que este es el correcto: shapor.com/zumastor.org
Martin
2

Hay un script de Python llamado blocksync, que es una manera simple de sincronizar dos dispositivos de bloque a través de una red a través de ssh, solo transfiriendo los cambios.

  • Copie blocksync.py al directorio de inicio en el host remoto
  • Asegúrese de que su usuario remoto pueda sudo o sea root
  • Asegúrese de que su usuario local (root?) Pueda leer el dispositivo fuente y ssh en el host remoto
  • Invocar: python blocksync.py /dev/source user@remotehost /dev/dest

Recientemente lo pirateé para limpiarlo y cambiarlo para usar el mismo algoritmo de suma de comprobación rápida que rsync ( Adler-32 ).

rcoup
fuente
1
Lo estoy usando, funciona bien. Tenga en cuenta que hay una versión modificada que corrige una posible fuente de corrupción y utiliza un hash más confiable.
cmc
1

Si está tratando de minimizar la cantidad de espacio vacío que enviaría a través del cable con un plano dd, ¿no podría simplemente conectarlo a gzip antes de conectarlo a ssh?

por ejemplo, dd if = / dev / xenVG / SERVER001OS | gzip | administrador ssh @ servidor de respaldo "dd of = / mnt / largeDisk / SERVER001OS.img.gz"

Ofidiana
fuente
Reduciría un poco el ancho de banda necesario, pero tenemos algunas imágenes de disco de 60 y 100 GB e incluso con gzip tomaría demasiado tiempo.
David Hicks
@ Ofidiano, debes saber que SSH maneja la compresión internamente, hay una opción.
poige
1

Solo tenga en cuenta que el rendimiento de un sistema que tiene instantáneas LVM es proporcional al número de instantáneas.

Por ejemplo, rendimiento Mysql con instantáneas lvm

James
fuente
De hecho, mi solución inicial consistió simplemente en configurar una instantánea diaria y luego hacer una diferencia con la instantánea del día anterior y llevarla al servidor de respaldo. Me molestó mucho descubrir que no sería tan simple.
David Hicks
Eso puede no ser cierto con las instantáneas delgadas LVM que se implementan de manera muy diferente
Alex F
0

Además de la respuesta de David Herselman, el siguiente script se sincronizará con un dispositivo local:

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

Hasta donde yo sé, ambos scripts se publicaron por primera vez en lists.samba.org .

Martín
fuente
0

Esta es una vieja pregunta, pero nadie mencionó dos herramientas muy útiles para sincronizar eficientemente dos dispositivos de bloque:

  • bdsync , que utiliza un enfoque de transferencia y parche de diferencias;

  • blocksync (aquí puede encontrar mi versión mejorada ), que utiliza un enfoque de reescritura en el lugar.

Recomiendo jugar con ambas herramientas y seleccionar la que mejor se adapte a su uso previsto.

shodanshok
fuente
0

Después de buscar durante varios años, recientemente creé una herramienta para sincronizar instantáneas LVM entre servidores. Está diseñado para usar un IO mínimo y permitir que los sistemas se ejecuten mientras se produce la sincronización.

Es similar al envío / recepción de ZFS, ya que sincroniza las diferencias entre las instantáneas LVM y utiliza el aprovisionamiento delgado para que el impacto en el rendimiento sea mínimo.

Me gustaría recibir comentarios, así que por favor eche un vistazo.

David B
fuente
-1

Hubo algunas eficiencias que se hicieron a este script:

  1. Al menos en mi sistema, las lecturas del búfer perl son de 8k, así que use el tamaño de bloque 8192.
  2. Autoflush para que el extremo local no se bloquee hasta que el búfer de salida remoto esté 'lleno', ya que estamos alimentando a lzop, el búfer parece inútil.

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 ($ ); lea 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) {busque STDOUT, \ $ s * 8192,1; \ $ s = 0}; lea ARGV, \ $ buf, 8192; print \ $ buf} '1 <> $ dev2 "

Mike Mestnik
fuente