Creación de Slave de MySQL con innobackupex

Hola a todos, hoy queríamos compartir con vosotros la creación un slave de una máquina MySQL en Linux con la utilidad innobackupex de Percona sin utilizar almacenamiento local. También vamos a realizar el backup online, sin parada en origen y luego pondremos el slave a sincronizar desde el punto en el que comenzó el backup de los datos.

Con esta forma de realizar el backup mandamos los ficheros directamente al directorio /var/lib/mysql de la máquina de destino (slave1) desde la máquina de origen (master1) y nos ahorramos el tener almacenamiento en la máquina de origen y luego tener que moverlo a la de destino.

Para esta operativa necesitamos tener instalado el paquete de Xtrabackup de Percona y el comando nc (también llamado netcat) que nos permite abrir un puerto en la máquina de destino y mandar la información de un comando directamente a otra máquina y procesarla.

Suena bien, ¿no?, pues vamos a ver como lo podemos hacer.

Creación de Slave de Mysql con innobackupex

Empecemos con la creación de un slave de MySQL

Lo primero es abrir en la máquina de destino el puerto por el que vamos a mandar el backup, eso lo hacemos con el comando:

slave1# nc -l -p 2222 | xbstream -x -C /var/lib/mysql

La primera parte de comando indica que vamos a escuchar en el puerto 2222 (-l indica que está en modo escucha y –p el puerto).

El comando xbstream es el que se encarga de leer los datos que llegan desde la máquina de origen con innobackupex y dejarlos en el directorio /var/lib/mysql directamente.

El comando que lanzamos desde la máquina en la que tenemos el MySQL que queremos copiar es:

master1# innobackupex --user=root --password=temporal --stream=xbstream --parallel=4 /tmp | nc -w 2 slave1 2222

El comando que realiza el backup es innobackupex y le indicamos que lo mande en formato stream, con 4 hilos en paralelo y la ruta sería /tmp si no fuera por la segunda parte del comando. Al concatenar nc –w 2 le decimos que la salida la redirija a una máquina y puerto en modo escritura (w) con un timeout de 2 segundos (suficiente para un backup online).

Antes de lanzar el comando tenemos que asegurarnos que el puerto está abierto entre las dos máquinas y que no tengamos un firewall que corte la conexión.

Cuando tenemos todo listo y lanzamos el backup vemos que los ficheros se escriben directamente en destino y a muy buena velocidad. Hemos copiados una instancia de 2Tb en unas 3 horas y media, todo lo que daba la red entre los dos nodos.

Aplicar los logs en destino tras copiar los datos

Una vez que tenemos los datos copiados no podemos levantar directamente la instancia MySQL, hay que aplicar todos los logs a los ficheros copiados. Para ello lanzamos en destino:

slave1# innobackupex --use-memory=3G --apply-log /var/lib/mysql

El comando tardará más o menos dependiendo del número de logs a aplicar, en nuestro caso han sido unos 10 minutos. Una vez terminado este proceso, revisamos los permisos de los ficheros copiados, en nuestro caso hemos lanzado los comandos como root por lo que tenemos que cambiar los permisos de los ficheros:

slave1# chown -R mysql:mysql /var/lib/mysql

Antes de levantar el servicio mysql, lo que hacemos es copiar el fichero my.cnf de origen. Tenemos que tener cuidado de cambiar el parámetro server-id y poner un identificador distinto al de origen o la réplica no funcionará bien.

Cuando veamos que está todo bien levantamos el servicio mysql.

slave1# service mysqld start

Configurar la réplica del master al slave

Como último paso nos queda configurar la réplica del master al slave. Para ello, ejecutamos:

slave1# cat /var/lib/mysql/xtrabackup_binlog_info
mysql-bin.082107        6342621

Los valores que se guardan en este fichero nos indica el punto desde el que tenemos que poner a sincronizar nuestra nueva réplica. Para ellos nos conectamos a la instancia MySQL como usuario root (la password será la misma que en origen) y lanzamos:

mysql>CHANGE MASTER TO
     MASTER_HOST='master1',
     MASTER_USER='repl',
     MASTER_PASSWORD='replicpass',
     MASTER_LOG_FILE='mysql-bin.082107',
     MASTER_LOG_POS=6342621;

mysql>start slave;

Y después de esto ya tenemos nuestro nuevo slave replicando del master en poco tiempo y sin utilizar almacenamiento extra.

Esperamos que os sea de utilidad, y hayáis conseguido la creación de un slave de MySQL. Si no quieres perderte nuestras entradas. Apúntate a nuestra newsletter mensual, para estar al día de todas nuestras publicaciones. Solo recibirás un email al mes.

Un saludo.

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.

Sígue a GPS en LinkedIn