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
Deja un comentario: