systemadmin.es » Backup » Backups de MySQL usando snapshots con múltiples volumenes LVM

Backups de MySQL usando snapshots con múltiples volumenes LVM

Para repartir la carga de I/O en un MySQL se pueden usar dos discos con controladoras independientes para permitir un acceso paralelo a los datos. Vamos a ver como hacer backups del MySQL completo con un simple script.

Anteriormente ya vimos como hacer backups en caliente usando snpashots con mylvmbackup. La limitación de dicho programa es que no soporta que los datos estén repartidos en mas de un disco, esta limitación se puede solucionar simplemente ejecutándolo dos veces con cada volumen a hacer backup o usando el siguiente script:

#!/bin/bash

VG1=datos
LV1=mysql1

VG2=local2
LV2=mysql2

SNAPSIZE=7G

if [ -n "$(echo "show processlist;" | mysql -uroot -p$(cat /var/mysql/.mysql.root.pass) | grep -i optimize)" ];
then
        echo "OPTIMIZE in progress..." | mail -s "snapshots $(hostname)" sistemas@systemadmin.es
        exit 0
fi

mkdir -p /var/tmp/mylvmbackup/backup
mkdir -p /var/tmp/mylvmbackup/mnt

CURRENTSNAP=$(/bin/date +"%H")

/bin/touch /tmp/snap.in.progress

/bin/unlink /dev/bacula.snap1
/bin/unlink /dev/bacula.snap2

/usr/sbin/lvremove -f /dev/$VG1/snap.$LV1.${CURRENTSNAP}
/usr/sbin/lvremove -f /dev/$VG2/snap.$LV2.${CURRENTSNAP}

echo "pre FLUSH"
date

echo "FLUSH TABLES;" | mysql -uroot -p$(cat /var/mysql/.mysql.root.pass)

echo "pre FLUSH READLOCK"
date

echo "FLUSH TABLES WITH READ LOCK;" | mysql -uroot -p$(cat /var/mysql/.mysql.root.pass)

echo "pre SNAP"
date

#$ lvcreate -L$SNAPSIZE -s -n mysql.snap /dev/local/mysql
/usr/sbin/lvcreate -L$SNAPSIZE -s -n snap.$LV1.${CURRENTSNAP} /dev/$VG1/$LV1
/usr/sbin/lvcreate -L$SNAPSIZE -s -n snap.$LV2.${CURRENTSNAP} /dev/$VG2/$LV2

echo "pre UNLOCK"
date

echo "UNLOCK TABLES;" | mysql -uroot -p$(cat /var/mysql/.mysql.root.pass)

echo "post mksnap"
date

/bin/ln -s /dev/$VG1/snap.$LV1.${CURRENTSNAP} /dev/bacula.snap1
/bin/ln -s /dev/$VG2/snap.$LV2.${CURRENTSNAP} /dev/bacula.snap2

/bin/rm -f /tmp/snap.in.progress

Dicho script usa el fichero temporal /tmp/snap.in.progress como marcador que el snapshot se esta realizando, por lo que se puede aprovechar para indicar al sistema de backup que se espere mientras se realizan las operaciones.

Podemos usar el siguiente script con bacula para indicar que espere la liberación del bloqueo i el montaje del snapshot:

#!/bin/bash

active=/tmp/snap.in.progress
error=600

snap1=/dev/bacula.snap1
mnt1=/mnt/bacula1

snap2=/dev/bacula.snap2
mnt2=/mnt/bacula2

mkdir -p $mnt1
mkdir -p $mnt2

snap1bdev=$(ls  -l $snap1 | awk '{ print $NF }')
snap2bdev=$(ls  -l $snap2 | awk '{ print $NF }')

for i in $(seq 1 $error)
do

        if [ ! -e $active ];
        then
                /bin/mount $snap1bdev $mnt1
                /bin/mount $snap2bdev $mnt2
                exit 0
        else
                sleep 1
        fi
done

exit 1

Para el desmontaje del snpashot podemos usar el siguiente script:

#!/bin/bash

mnt1=/mnt/bacula1
mnt2=/mnt/bacula2

/bin/umount $mnt1 > /dev/null 2>&1

if [ $? -ne 0 ]; then
  exit 1
fi

/bin/umount $mnt2 > /dev/null 2>&1

if [ $? -ne 0 ]; then
  exit 1
fi

exit 0

Con el cron y este conjunto de scripts podremos crear copias de seguridad periódicas:

#snapshots
0 */4 * * * /usr/local/bin/mksnap

Resulta evidente que mantener snapshots de la base de datos cada 4 horas supone un impacto en el rendimiento, pero hace falta valorar los beneficios en cuanto a seguridad de los datos frente a la caída del rendimiento por los snapshots.

Relacionados

Imprimir Imprimir

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>