En esta entrada documento como configurar una réplica de una base de datos MariaDB que se ejecuta sobre Debian tanto el servidor maestro como la réplica.

Para los ejemplos supondré que los servidores se llaman vps1 el correspondiente al maestro y vps2 el servidor de respaldo y réplica.

Asumo que en ambos servidores se instala el servicio de bases de datos MariaDB con su instalación a partir de los paquetes oficiales. En el caso del servidor de réplica vps2 significa que esta configuración es la más sencilla si sólo hacemos la réplica de un servidor (vps1) y no necesitamos un servicio MariaDB en el propio servidor.

En caso contrario, y una solución que utilizo en otros casos, es ejecutar un binario con la misma versión que el servidor bajo un usuario nuevo en el servidor de réplica. De esa manera se puede tener un servidor de réplicas que sirvan a diferentes servidores maestros.

Procedimiento

Servidor maestro vps1

Preparamos el servidor vps1 para la replicación activando el log binario y creando un usuario que utilizaremos para el esclavo de replicación.

Nuevo fichero /etc/mysql/conf.d/binlog.cnf:

[mysqld]
log-bin
server_id=1

Creación del usuario de replicación en vps1:

CREATE USER 'slave-vps2'@'vps2' IDENTIFIED BY 'slavepass';

Reiniciamos el servicio en vps1 para que se produzca la activación del log binario de manera efectiva.

Ahora ya podemos exportar todos los datos existentes junto a las coordenadas de replicación.

Ejecutar en vps1:

mysqldump --gtid --master-data --all-databases -u root -p > master.sql

Servidor esclavo vps2

Pasamos a trabajar en el servidor vps2. Lo primero es instalar el servicio MariaDB y ajustar la configuración para trabajar como esclavo.

Instalación de MariaDB en vps2:

aptitude install mariadb-server

Comentar bind-address en my.cnf para que escuche en todas las interfaces de red.

Añadir la configuración específica como esclavo en un nuevo fichero /etc/mysql/conf.d/esclavo.cnf:

[mysqld]
server_id=2
report_host=192.168.x.x
report_port=3306

La parte de report_host y report-port es opcional pero yo la utilizo para poder luego ejectuar una comprobación remotamente de la consistencia de la réplica utilizando la aplicación pt-table-checksum.

Actualización de la contraseña del usuario de sistema operativo

Un breve comentario sobre un detalle importante a tener en cuenta acerca de este procedimiento. El sistema operativo Debian al instalar un paquete de base de datos genera y guarda un usuario específico utilizado por el sistema operativo para diversas tareas, como simplemente, por ejemplo, parar el servicio de manera ordenada.

Dicho usuario se almacena en el fichero /etc/mysql/debian.cnf en cada servidor. Siguiendo los pasos de este procedimiento estamos creando una réplica completa de vps1 a vps2 incluyendo todos los usuarios de la base de datos. Eso significa que al cargar los datos en vps2 estamos cargando los usuarios de vps1 incluyendo este usuario de sistema operativo.

La recomendación, pues, es copiar la contraseña de este usuario especial de vps1 a vps2 o realizar una replica excluyendo la base de datos mysql.

Carga de datos e inicio de la réplica

Cargamos los datos iniciales:

vps1$ scp master.sql vps2:
vps2$ mysql -u root -p < master.sql

Iniciamos la réplica:

CHANGE MASTER TO
  MASTER_HOST='192.168.xxxx',
  MASTER_USER='slave-vps2',
  MASTER_PASSWORD='slavepass',
  MASTER_PORT=3306,
  MASTER_CONNECT_RETRY=10;

START SLAVE;

SHOW SLAVE STATUS\G