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í?

Respuestas:



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='root@backup.company.co.za';

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

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.


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.


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


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"


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


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 .


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.


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.


-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 "

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.