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.