Replicación nativa en MySQL con xtrabackup
Uno de los trabajos que hemos realizado esta semana ha sido la puesta en marcha de una replicación nativa activo-pasivo de MySQL de uno de los servidores que contiene las bases de datos de las herramientas que usamos en el día a día. En este caso, nos gustaría compartir uno de los métodos que solemos utilizar para ello teniendo en cuenta que no hay parada de servicio.
Antes de entrar en materia, queremos aclarar que alguna de las imágenes que exponemos ocultan partes ya que al tratarse de un caso real, las imágenes contienen información sensible que no es posible mostrar por seguridad.
Comenzaremos dando un poco de contexto, explicando los servicios y herramientas que se han usado.
- Contamos con 2 servidores con Percona Server 8.0 que los llamaremos nodo1 (activo) y nodo2 (pasivo).
- nodo1. Es el servidor que está dando servicio y contiene las bases de datos de nuestras herramientas. Tiene los logs binarios activos ya que serán necesarios para establecer la replicación.
- nodo2. Es el servidor de respaldo que estará replicando los datos del nodo1.
- En este caso, el volumen de datos es inferior a los 5G, pero se puede utilizar para casos con un mayor volumen de datos. La única diferencia será los tiempos de ejecución de cada paso.
- Dado que la base de datos está dando servicio y no podemos bloquear las escrituras, vamos a utilizar una herramienta de Percona que se llama xtrabackup. Esta herramienta nos permite generar un backup íntegro de las bases de datos sin interrumpir el servicio, manteniendo la posición para después restablecer la replicación.
Teniendo claro el escenario vamos a explicar paso a paso la puesta en marcha.
Para poder generar la replicación tienen que tener comunicación nodo1 y nodo2 en el puerto de MySQL, y disponer de un usuario con permisos suficientes para poder replicar. Podemos crear el usuario con la siguiente sentencia:
mysql> GRANT REPLICATION SLAVE ON *.* TO '<userrep>'@'<nodo2>' IDENTIFIED BY 'xxxxxxxxxxxxxxxxxx';
También necesitamos tener instalado en el nodo1 percona-xtrabackup, en nuestro caso ya lo tenemos instalado, pero tienen la guía de instalación en la documentación de Percona.
Ahora generamos el backup completo de las bases de datos que luego cargaremos en el nodo2. Dado que es un backup binario, la ocupación será similar a lo que ocupe en nuestro sistema de ficheros, es decir, si la totalidad de los datos de nuestro MySQL ocupan 5G, nuestro backup ocupará 5G. Tenedlo en cuenta para generarlo en un volumen de datos con espacio suficiente.
Para generar el backup usaremos el siguiente comando:
xtrabackup -u root -p --backup --datadir=/var/lib/mysql/data/ --target-dir=/backupstr/xtrabackup/
NOTA: Tendremos que utilizar un usuario con permisos suficientes para generar el backup.
Comenzará a generarse el backup y nos irá mostrando por pantalla el proceso del mismo. Sabremos que ha finalizado cuando nos muestre una traza similar a la siguiente:
Ahora tendremos que preparar los datos para que puedan ser cargados. Usaremos el siguiente comando:
xtrabackup --prepare --target-dir=/backupstr/xtrabackup/
Tenemos los datos del propio MySQL con nuestras bases de datos y además, los ficheros xtrabackup_* que tienen la información necesaria para cargar los datos y poder iniciar la replicación en el nodo2.
En el fichero xtrabackup_binlog_info tendremos la información que luego tendremos que usar para poner en marcha la replicación. El contenido debería ser similar a esto:
Muestra el nombre del log binario del nodo1 y la posición.
El siguiente paso será copiar remotamente al segundo servidor y bajo el directorio de datos de MySQL el backup que acabamos de realizar. Para ello podemos usar rsync por ejemplo:
rsync -azv /backupstr/xtrabackup/ root@nodo2:/var/lib/mysql/data/
Ahora tendremos que asegurarnos que los ficheros y directorios copiados en el nodo2 tienen los permisos necesarios para el usuario de MySQL, si no, tenemos que agregarlos:
chown -R mysql:mysql /var/lib/mysql/data/
Ya podemos levantar el servicio de MySQL en el nodo2 y asegurarnos que inicia sin errores.
systemctl start mysql
Con esto ya tenemos la primera parte que es la puesta en marcha del nodo2 con los datos del nodo1. Ahora tenemos que establecer la replicación.
Tendremos que usar la siguiente sentencia de MySQL con los datos que hemos ido obteniendo en los pasos anteriores:
Nos aseguramos que en el nodo2 no hay ninguna replicación activa:
mysql> reset replica;
mysql> show replica status\G
Ahora iniciamos la replicación con la siguiente sentencia:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='<nodo1>', SOURCE_USER='<userrep>', SOURCE_PASSWORD='xxxxxxxxxxxxxx', SOURCE_LOG_FILE='mysql-bin.XXXX', SOURCE_LOG_POS=xxxx;
NOTA: Se deberán sustituir la información con la de vuestro caso.
Si todo ha ido bien ya tendremos nuestra replicación configurada.
Para iniciar la replicación usaremos el siguiente comando:
mysql> start replica;
Con esto ya tendremos la replicación en funcionamiento.
Este es uno de los métodos que solemos utilizar, ya que nos permite generar el backup con la posibilidad de configurar la replicación más tarde, sin necesidad de parar el servicio.
Esperemos que resulte de utilidad ;)