Replicación Master Esclavo de MariaDB en Instancias Virtuales

Introducción

Una de las funciones principales de MariaDB es la replicación Master Esclavo. Como se explica en la documentación:

La replicación es una funcionalidad que permite que el contenido de uno o más servidores (llamados masters) sea duplicado en uno o más servidores (llamados esclavos).

Vamos a crear una Replicación Master Esclavo básica de dos nodos usando Virtual Machine Instances en la Google Cloud Platform.

Crear las Instancias de MariaDB

Usando nuestras Imagen y Plantilla para Instancia de MariaDB personalizadas, crear dos instancias.

Crear la instancia Master patomariadb desde la Cloud Console:
En Google Cloud Platform - Compute Engine - VM Instances - Create Instance - New VM Instance from template

  • Select template: patomariadb-template
  • Name: patomariadb
  • Networking
    • Hostname: patomariadb.databases

y para probar la opción de comando, crear la instancia Esclavo patomariarp usando el Cloud Shell:

$ gcloud compute instances create patomariarp --hostname patomariarp.databases --source-instance-template patomariadb-template

Created [https://www.googleapis.com/compute/v1/projects/databases-20202/zones/us-central1-f/instances/patomariarp].

Validar que ambas instancias están arriba y corriendo.

$ gcloud compute instances list
NAME         ZONE           MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
patomariadb  us-central1-f  f1-micro                   10.128.0.40  34.69.159.12   RUNNING
patomariarp  us-central1-f  f1-micro                   10.128.0.41  35.192.48.122  RUNNING

Replicación Master Esclavo

Configurar la Replicación en el Master

Accede via ssh a tu instancia Master y genera el archivo de configuración, definiendo el server_id único y el nombre y formato del binary log:

pato@patomariadb:~$ sudo nano /etc/mysql/conf.d/replication.cnf

# MariaDB Replication Configuration
[mariadb]
server_id=1
log_bin=master-bin
binlog-format=mixed
log_slave_updates=on

Conéctate a la base de datos y crea un usuario para la replicación

pato@patomariadb:~$ mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 38
Server version: 10.3.22-MariaDB-0ubuntu0.19.10.1 Ubuntu 19.10

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'replicador'@'%' IDENTIFIED BY '********';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.000 sec)

Finalmente reinicia la base de datos para que la configuración se cargue.

pato@patomariadb:~$ sudo systemctl restart mariadb

Configurar la Replicación en el Esclavo

Accede via ssh a tu instancia Esclavo y genera el archivo de configuración, definiendo el server_id único y el nombre y formato del binary log:

pato@patomariarp:~$ sudo nano /etc/mysql/conf.d/replication.cnf

# MariaDB Replication Configuration
[mariadb]
server_id=11
log_bin=slave-bin
binlog-format=mixed
log_slave_updates=on

Finalmente reinicia la base de datos para que la configuración se cargue.

pato@patomariarp:~$ sudo systemctl restart mariadb

Genera datos de prueba y objetos

Conéctate a la base de datos Master y genera una tabla e insértale un registro:

pato@patomariadb:~$ mysql

MariaDB [(none)]> create database taller ;
Query OK, 1 row affected (0.132 sec)

MariaDB [(none)]> use taller;
Database changed
MariaDB [taller]> create table r1 (i1 int auto_increment primary key, c1 varchar(20), d1 datetime) ;
Query OK, 0 rows affected (0.142 sec)

MariaDB [taller]> insert into r1 (c1,d1) values ('Before Master Slave',now());
Query OK, 1 row affected (0.012 sec)

MariaDB [taller]> commit ;
Query OK, 0 rows affected (0.000 sec)

MariaDB [taller]> select * from r1;
+----+---------------------+---------------------+
| i1 | c1                  | d1                  |
+----+---------------------+---------------------+
|  1 | Before Master Slave | 2020-05-04 18:15:49 |
+----+---------------------+---------------------+
1 row in set (0.000 sec)

Copia Inicial de Datos

Congela toda la actividad en la base de datos Master:

pato@patomariadb:~$ mysql

MariaDB [(none)]> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.048 sec)

Entonces respalda la base de datos Master:

pato@patomariadb:~$ mysqldump --all-databases > masterfull.sql
pato@patomariadb:~$

Obtén las coordenadas del binary log para el punto de comienzo de la replicación:

MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000001 |      898 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

Descongela la actividad en el Master:

MariaDB [(none)]> UNLOCK TABLES;
Query OK, 0 rows affected (0.000 sec)

Transfiere el respaldo del nodo Master al nodo Esclavo:

pato@patomariadb:~$ gcloud compute scp masterfull.sql patomariarp:/home/pato
masterfull.sql                                100%  469KB  45.9MB/s   00:00

Restaura el respaldo en el Esclavo:

pato@patomariarp:~$ mysql < masterfull.sql
pato@patomariarp:~$

Iniciar la Replicación

Configura la base de datos Esclavo con la posición del binlog master-bin.000001 - 898 de la copia inicial y luego modifica la replicación para usar la posición GTID:

pato@patomariarp:~$ mysql

MariaDB [(none)]> CHANGE MASTER TO
    ->    MASTER_HOST='patomariadb',
    ->    MASTER_USER='replicador',
    ->    MASTER_PASSWORD='********',
    ->    MASTER_PORT=3306,
    ->    MASTER_LOG_FILE='master-bin.000001',
    ->    MASTER_LOG_POS=898,
    ->    MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.040 sec)

MariaDB [(none)]> CHANGE MASTER TO MASTER_USE_GTID = slave_pos ;
Query OK, 0 rows affected (0.011 sec)

Inicia el Esclavo y valida su estatus:

MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.012 sec)

MariaDB [(none)]> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: patomariadb
                   Master_User: replicador
                   Master_Port: 3306
                 Connect_Retry: 10
               Master_Log_File: master-bin.000001
           Read_Master_Log_Pos: 898
                Relay_Log_File: mysqld-relay-bin.000002
                 Relay_Log_Pos: 1198
         Relay_Master_Log_File: master-bin.000001
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
...
                    Using_Gtid: Slave_Pos
                   Gtid_IO_Pos: 0-1-3
...
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
...
1 row in set (0.000 sec)

¡Perfecto, nuestra replicación Master Esclavo está configurada y corriendo!

Probar la Replicación Master Esclavo

Con el fin de validar que la replicación está funcionando vamos a crear una tabla más e insertar datos:

pato@patomariadb:~$ mysql

MariaDB [(none)]> use taller
Database changed

MariaDB [taller]> create table r2 (i2 int auto_increment primary key, c2 varchar(20), d2 datetime) ;
Query OK, 0 rows affected (0.095 sec)

MariaDB [taller]> insert into r2 (c2,d2) values ('After Master Slave',now());
Query OK, 1 row affected (0.004 sec)

MariaDB [taller]> commit;
Query OK, 0 rows affected (0.000 sec)

MariaDB [taller]> select * from r2;
+----+--------------------+---------------------+
| i2 | c2                 | d2                  |
+----+--------------------+---------------------+
|  1 | After Master Slave | 2020-05-04 18:40:46 |
+----+--------------------+---------------------+
1 row in set (0.000 sec)

Verifica que los datos y objetos se replicaron desde el Master hacia el Esclavo, tanto los que vienen de la copia inicial table r1 - Before Master Slave como aquellos que vienen de la replicación table r2 - After Master Slave:

pato@patomariarp:~$ mysql

MariaDB [(none)]> use taller
Database changed

MariaDB [taller]> select * from r1;
+----+---------------------+---------------------+
| i1 | c1                  | d1                  |
+----+---------------------+---------------------+
|  1 | Before Master Slave | 2020-05-04 18:15:49 |
+----+---------------------+---------------------+
1 row in set (0.001 sec)

MariaDB [taller]> select * from r2;
+----+--------------------+---------------------+
| i2 | c2                 | d2                  |
+----+--------------------+---------------------+
|  1 | After Master Slave | 2020-05-04 18:40:46 |
+----+--------------------+---------------------+
1 row in set (0.001 sec)

¡Los datos y la tabla fueron replicados desde el Master hacia el Esclavo!

Conclusión

Hemos generado y configurado un cluster de Replicación Master Esclavo en Virtual Machine Instances de la Google Cloud y validado que estén funcionando.
Como puedes notar la configuración básica es bastante sencilla. Después de esto puedes intentar más funcionalidades como el filtrado de tablas, failover y switchover, así como múltiples esclavos.