Imagenes y snapshots: Respaldo de servidores

Mi propósito era crear imágenes de todos los servidores del datacenter para que, en caso de cualquier contingencia, levantar un nuevo servidor identico simplemente traspasando la imágen de respaldo hacia ese servidor. Los sistemas estaban instalados usando volumenes lógicos (LVM) por lo que sería mucho más fácil crear imágenes y snapshots de respaldos. En un prinicpio pensé hacer directamente dd sobre los volumenes lógicos pero la imágen se corrompía y en muchos casos no podía volver a recuperarla. Existe la posibilidad de montar el volumen lógico en un directorio y respaldar, usando tar, bzip y esas cosas, sólo los archivos, pero no era mi propósito, ya que para restaurar solamente los archivos, debía tener una partición ya preparada, con el sistma de ficheros, sistema instalado, etc etc. En cambio, con la imágen simplemente hacia un dd para restaurarla, sin tener el sistema de archivos creado, etc.

Por twitter me recomendaron varias opciones. @Apostols me recomendó las herramientas “puppet” y “rlbackup”, mientras que @ssugasti “mondorescue”, pero yo seguia con mi idea de usar directamente “dd”. Debía hacer el mismo procedimiento en mas de 40 servidores, por lo que usar una aplicación “cliente->servidor” no era mi solución. Usar aplicaciones que requieran modo grafico o que requieran mucha interacción con el usuario tampoco me servian, yo necesitaba algo automatizado que pueda dejar corriendo de noche y volver al otro día y encontrar el trabajo hecho.

Leyendo el manual de LVM, especialmente el de lvcreate, encontré la opción “snapshot” que básicamente le toma una “foto” al volumen lógico de origen y crea un nuevo volumen con ese preciso instante en que se hizo el snapshot, de ésta forma la partición original podrá ser actualizara mientras que el snapshot se respalda sin problemas. Luego de eso, el snapshot se elimina y se guarda la imágen. La rutína sería mas o menos asi:

# lvcreate --snapshot /dev/Vol00/var --name var-snap -L100k
# dd if=/dev/Vol00/var-snap of=/backup/var.img
# lvremove -f /dev/Vol00/var-snap

De esta forma, creamos un snapshot llamado “var-snap” en base a la partición (o volumen) /dev/Vol00/var, luego, usando dd, creamos la imágen de dicha partición y la guardamos en /backup. Finalmente eliminamos el snapshot.
Para tener aún más certesa de que todo funcionaría, tambien decidí empaquetar, comprimir y guardar los ficheros, por lo que antes de eliminarla (lvremove) la debo montar y hacer un tar. La rutina quedaría así:

# lvcreate --snapshot /dev/Vol00/var --name var-snap -L100k
# dd if=/dev/Vol00/var-snap of=/backup/var.img
# mount /dev/Vol00/var-snap /mnt
# tar cfjv /bakcup/var.tbz2 /mnt
# umount /mnt
# lvremove -f /dev/Vol00/var-snap

En mi caso, /backup corresponde a un punto de montaje de red NFS.
Mi misión era realizar ésta misma rutina en más de 40 servidores, por lo que necesitaba hacer un script que se paseara por todos los servidores y ejecutara estos comandos.

#!/bin/bash

IDENTITYFILE=$HOME/.ssh/id_rsa
MACHINES=servidores.list
DATE=$(date +%d%m%Y)
NFS=/mnt/imagenes/servers/
DIR_SNAPSHOT=/mnt/snapshot

for server in $(cat servidores.list);
do
        echo "Respaldando $server ..."
        ssh -i $IDENTITYFILE $server "lvdisplay" >/tmp/lvdisplay_temp
        lvdisplay=$(awk '
                /LV Name/ { name = $3 } 
                /VG Name/ { print name","$3 } ' /tmp/lvdisplay_temp)
        for _logicalv in $lvdisplay;
        do
                lvname=$(echo $_logicalv |cut -f1 -d ","|cut -f4 -d "/")
                logicalv=$(echo $_logicalv |cut -f2 -d ",")
                echo -e "\tVolumen Logico: $lvname"
                ssh $server "lvcreate --size 100m --snapshot --name $lvname-snap /dev/$logicalv/$lvname"
                ssh $server "mount /dev/$logicalv/$lvname-snap $DIR_SNAPSHOT"
                ssh $server "mkdir $NFS$server"
                ssh $server "tar cfj $NFS$server/snapshot_$lvname-$DATE.tar.bz2 $DIR_SNAPSHOT"
                ssh $server "umount $DIR_SNAPSHOT"
                ssh $server "dd if=/dev/$logicalv/$lvname-snap of=$NFS$server/image_$lvname-$DATE.img"
                ssh $server "lvremove -f /dev/$logicalv/$lvname-snap"
                echo -e "\tArchivo imagen: $NFS$server/image_$lvname-$DATE.img"
                echo -e "\tArchivo tarball: $NFS$server/snapshot_$lvname-$DATE.tar.bz2"
        done
done
scp /tmp/lvdisplay_temp $server:$NFS$server/lvdisplay

El script trabaja con la salida del comando lvdisplay que entrega una salida con los detalles de cada volumen lógico. Lee un fichero llamado servidores.list y hace un recorrido línea por línea, conectándose a cada servidor y ejecutando las instrucciones necesarias. Para hacer el proceso más eficiente y automatizado es necesario, previamente, copiar todas las claves públicas a cada servidor, para evitar la autentificación.

11 comentarios

  1. Interesante!

    Saludos Zerial

  2. Muy buena idea para hacer backups.
    Lo que veo de malo es que esos backups no serían incrementales, así que necesitas mucho espacio.

  3. Zerial

    febrero 23, 2010 a las 2:40 pm

    Asi es, no es un respaldo incremental por lo que no es recomendable hacerlo muy seguido.

  4. Hola compadre tambien podrias hacer una imagen para tenerla de respaldo con

    clonzilla que es como el ghost pero esta basado en Linux y es gratis

    Saludos

  5. Zerial

    marzo 9, 2010 a las 2:32 pm

    @R4C3 F4C3: Hola! Clonezilla necesita reiniciar el servidor, por lo que el servidor dejaria de estar en produccion al momento de crea la imagen

  6. Hola, muy buena pero podrias escribir la manera como se restablece la imagen…
    gracias de antemano.

  7. Zerial

    abril 20, 2010 a las 10:31 pm

    @cris: Puedes probar restablecer la imagen usando “dd”. Creas el nuevo volumen logico y cuanto este creado, haces dd desde el respaldo hacia el nuevo volumen.

  8. usa el http://www.dirvish.org/.. creo snap y luego entras a copiar con dirvish que tiene copias diferenciales.. llevo años usandolo y es lo mejor que hay en copias de seguridad.

    Suerte

  9. Zerial

    abril 27, 2010 a las 8:40 pm

    @Miki: Gracias por el aporte!

  10. ocupa rsnapshot, es para realizar backups completos por medio de rsnapshot y rsync copia todo sin tener problemas, es incremental.

  11. Hola, esta super interesante el tema, por favor me puedes confirmar que herramienta utilizaste para codificar la shell que muestras en el post, yo utilizo notepad ++ pero no veo la opción para agregar numeración a las filas.

    Gracias de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.