Resetear un Slave en Replicación MySQL

12 febrero 2013 at 22:02 by Adrián Pérez

resetHoy toca escribir sobre otra situación que se puede dar en entornos MySQL con Replicación. Este ejemplo está sacado de un entorno Percona 5.5 con un master y tres slaves, pero debería servir para MySQL 5.5.

Es posible que nos encontremos con la necesidad de reiniciar por completo el estado de los slaves (de todos o de alguno de ellos), incluyendo el substituir la base de datos por una más actual del master. Ésta es una situación bastante drástica, pero afortunadamente existen métodos que nos permite realizar este proceso sin detener el servicio y sin que impacte de forma drástica en el rendimiento.

El proceso está sacado de la web de Percona, y es el siguiente:

Redirigir las lecturas

El servidor Master es el server más crítico. Seguramente esté en producción, y no querremos afectar a la aplicación que esté usando esta base de datos. Lo que tendremos que hacer es modificar nuestra aplicación para que las lecturas que antes iban a los slaves, pasen al master de forma temporal, antes de iniciar este proceso.

Reiniciar los slaves

Pararemos la replicación en los slaves y reiniciaremos el estado de los mismos.

mysql> stop slave;
mysql> RESET SLAVE;
slave$ /etc/init.d/mysqld stop

Full Backup en el Master

Acto seguido, podremos iniciar un proceso de copia de seguridad del Master, con una de las herramientas de Percona,XtraBackup. XtraBackup nos permitirá realizar un backup en caliente de nuestras bases de datos (InnoDB) sin prácticamente afectar al rendimiento del server. Además, es bastante rápido.

Si no disponemos de la herramienta, podremos instalarla siguiendo las instrucciones descritas en éste otro Post, referentes a la instalación del repositorio de Percona. Una vez tengamos el repositorio, podremos instalar con yum el paquete "percona-xtrabackup" para a continuación, iniciar el backup en el Master.

master$ innobackupex --user=yourDBuser --password=MaGiCdB1 /backups/FULL/
master$ innobackupex --user=yourDBuser --password=MaGiCdB1 --apply-log /backups/FULL/2013-02-05_16-16-16/
master$ rsync -avprP -e ssh /backups/FULL/2013-02-05_16-16-16/ TheSlave:/tmp/FULLBackup

Como se puede observar, la primera instrucción nos creará un FULL backup en un directorio con el timestamp del backup, dentro del path que le pasemos (en el ejemplo "/path/to/backupdir"). La segunda instrucción servirá para preparar el backup, aplicando todas las instrucciones que hayan quedado colgadas desde el mismo. Finalmente, con la tercera, nos encargaremos de transferir el backup a cada uno de los slaves, en el ejemplo, al directorio /tmp/FULLBackup.

Reiniciar el estado en los slaves

Una vez transferido el backup del master a los slaves, deberemos realizar el siguiente proceso en cada slave que queremos resetear:

  • Primero haremos un backup del directorio dbpath actual (por defecto /var/lib/mysql), símplemente renombrando el directorio con un "mv".

slave$ cd /var/lib
slave$ mv mysql mysql_BKP

  • A continuación moveremos directamente el backup transferido desde el Master a lo que es el dbpath del slave (vacío tras haberlo renombrado en el paso anterior), y le daremos los correspondientes permisos.

slave$ cd /tmp
slave$ mv FULLBackup /var/lib/
slave$ mv FULLBackup mysql
slave$ chown mysql:mysql mysql -R

  • Iniciaremos de nuevo mysql en los slaves

slave$ /etc/init.d/mysql start

Iniciar replicación en los Slaves

Una vez iniciados los slaves que acabamos de restaurar, deberemos iniciar la replicación, justo en el punto exacto. Para ello, en el dbpath de cada slave restaurado, habrá un fichero con la información de dicha posición, parecido al siguiente:

 slave$ cat /var/lib/mysql/xtrabackup_binlog_info
TheMaster-bin.000001 481

Este fichero nos indicará el nombre del fichero desde el cual empezar a replicar ("TheMaster-bin.000001" en el ejemplo) y la posición dentro de dicho fichero ("481" en el ejemplo). Así pues, entraremos en el mysql de los slaves que estamos restaurando y ejecutaremos la sentencia CHANGE MASTER TO con los parámetros correspondientes a nuestro master y nuestra posición en el binlog:

TheSlave|mysql> CHANGE MASTER TO
MASTER_HOST='$masterip',
MASTER_USER='repl',
MASTER_PASSWORD='$slavepass',
MASTER_LOG_FILE='TheMaster-bin.000001',
MASTER_LOG_POS=481;

Finalmente, podremos iniciar los slaves y corroborar si todo está correcto:

TheSlave|mysql> START SLAVE;
TheSlave|mysql> SHOW SLAVE STATUS\G;

Fuente: http://www.percona.com/doc/percona-xtrabackup/howtos/setting_up_replication.html

Flickr!Foto por tillwe