Backups en caliente de MySQL usando snapshots LVM y bacula
Anteriormente ya se habló de los backups en caliente de MySQL usando snapshots LVM. En este caso vamos a ver cómo configurar el script para usar-lo conjuntamente con bacula.
Tal como se comentó anteriormente, mediante mylvmbackup se pueden hacer backups en caliente de MySQL. Después se podría configurar el bacula para recoger el backup que quedaría en: /var/tmp/mylvmbackup/backup/ y el snapshot se quitaría.
Con esta configuración tenemos el problema que el bacula comprime el archivo que ya tenemos comprimido, y aúnque no se comprimiera necesitariamos espacio para tener el archivo que el bacula tendría que llevarse.
Este mismo script permite hacer solamente el snapshot. Su configuración es la siguiente:
[mysql] user=root password=password host=localhost port=3306 socket= mycnf=/etc/my.cnf [lvm] vgname=datos lvname=mysql backuplv=snap.backup lvsize=25G [fs] xfs=0 mountdir=/var/tmp/mylvmbackup/mnt/ backupdir=/var/tmp/mylvmbackup/backup/ relpath= [tools] lvcreate=/usr/sbin/lvcreate lvremove=/usr/sbin/lvremove lvs=/usr/sbin/lvs mount=/bin/mount tar=/bin/tar rsync=/usr/bin/rsync rsnap=/usr/bin/rsnap umount=/bin/umount [misc] backuptype=none prefix=backup suffix=_mysql tararg=cvf tarsuffixarg= tarfilesuffix=.tar.gz compressarg=--stdout --verbose --best rsyncarg=-avWP rsnaparg=7 datefmt=%Y%m%d_%H%M%S innodb_recover=0 pidfile=/var/tmp/mylvmbackup_recoverserver.pid skip_flush_tables=0 extra_flush_tables=0 skip_mycnf=0 hooksdir=/usr/share/mylvmbackup skip_hooks=0 keep_snapshot=1 quiet=0 [logging] log_method=console syslog_socktype=native syslog_facility= syslog_remotehost=
De esta configuración los parámetros importantes són:
backuptype=none keep_snapshot=1 lvsize=25G
Vemos que es cada uno:
- backuptype: Se indica que no realize ningun tipo de backup, sólo realia el snapshot.
- keep_snapshot: El snapshot por defecto se elimina, con keep_snapshot indicamos que se mantenga
- lvsize: Indica el tamaño reservado para el snapshot, si queremos mantenerlo duranto cierto tiempo tiene que ser suficiente para mantener los cambios que ocurran en el sistema de ficheros durante ese tiempo. Evidentemente depende mucho del tipo de acceso que tenga el MySQL.
Así, el snapshot queda en el sistema, por lo que el bacula sólo hace falta que haga el mount, realize la cópia del contenido y eliminie el backup.
También se le puede dar una vuelta de tuerca más manteniendo los snapshots en la máquina ciertas horas para recuperar los datos rápidamente en caso de borrado accidental. Ésto se puede hacer mediante un script tant sencillo como éste:
#!/bin/bash CURRENTSNAP=$(date +"%H") touch /tmp/snap.in.progress unlink /dev/bacula.snap lvremove -f /dev/datos/snap.${CURRENTSNAP} mylvmbackup lvrename /dev/datos/snap.backup /dev/datos/snap.${CURRENTSNAP} ln -s /dev/datos/snap.${CURRENTSNAP} /dev/bacula.snap rm -f /tmp/snap.in.progress
Éste script crea un fichero en /tmp llamado snap.in.progress para indicar que esta realizando operaciones. Lo que hace es crear snapshots mediante mylvmbackup y renombrarlos con la hora que han sido lanzados, borrando si existe otro con el mismo nombre.
Así, configurando en el cron cada 4 horas este script se mantienen en el sistema 6 snapshots del MySQL enlazando el último con un soft-link llamado /dev/bacula.snap
Evidentemente el tiempo de cópia tiene que ser menor que el tiempo que se mantendrá vivo el snapshot, en este caso 24 horas.
Deja un comentario: