La replicación de datos es muy importante cuando se trata de proteger y garantizar la alta disponibilidad de los datos y la facilidad de acceso durante un error inesperado como la caída del sistema, hardware o error basado en software, etc.

Con MariaDB se puede configurar la replicación de datos y puede tener lugar varios mecanismos que incluyen el master-slave, master-master, etc.

Cómo funciona la replicación en MariaDB

Con MariaDB se pueden replicar todas las bases de datos o seleccionar una base de datos concreta. La replicación de MariaDB utiliza una enorme configuración esclava y habilita el binlog en el nodo primario. Este servidor maestro utiliza un ID de transacción global para escribir cada transacción en el registro binario.

Con el ID de transacción global, puedes determinar sin esfuerzo el mismo binlog en nodos separados que se replican entre sí. El registro binario tiene todos los registros relativos a los cambios realizados en la base de datos tanto en los datos como en la estructura. También se encarga del tiempo que se tarda en ejecutar cada sentencia.

Además, los nodos secundarios leen este registro binario del nodo primario cuando se requiere la replicación de datos. Todo ello hace de MariaDB un excelente software de replicación de datos.

Pasos previos

Para este tutorial hemos utilizado dos servidores con Ubuntu 22.04 y en ambos servidores tenemos instalado MariaDB.

Para instalar MariaDB podemos hacerlo de la siguiente forma:

Instalar MariaDB en Ubuntu 22.04
MariaDB es un sistema de gestión de bases de datos derivado de MySQL con licencia GPL (General Public License). Es desarrollado por Michael (Monty) Widenius —fundador de MySQL—, la fundación MariaDB y la comunidad de desarrolladores de software libre.

Configuración del Nodo Primario

El servidor MariaDB utiliza un archivo de registro binario para realizar la replicación. Por defecto, el registro binario está deshabilitado en la configuración por defecto de MariaDB.

Así que tendremos que editar el archivo de configuración de MariaDB y habilitar el registro binario.

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Primero modificamos este parámetro:

bind-address            = 0.0.0.0
📢
Con la opción 0.0.0.0 estamos habilitando acceso a todo el mundo. Por lo que si tu proveedor permite configurar una red interna, lo ideal sería configurar acceso únicamente desde la red interna o incluso desde la IP del servidor que hace de slave.

Luego añadimos o descomentamos lo siguiente:

server-id              = 1
log_bin                = /var/log/mysql/mysql-bin.log
max_binlog_size        = 100M
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index

Tras guardar esta configuración, reiniciamos el servicio:

systemctl restart mariadb

Comprobamos que la configuración se ha aplicado correctamente con:

ss -antpl | grep -E 'mysql|mariadbd'

Y obtenemos el siguiente resultado:

Netid  State   Recv-Q  Send-Q   Local Address:Port  Address:Port  Process  
tcp    LISTEN  0       80       0.0.0.0:3306        0.0.0.0:*     users:(("mariadbd",pid=15253,fd=22))

Configuración del usuario para la replicación

A continuación, tendremos que crear un usuario de replicación en el nodo Maestro. El nodo secundario utilizará este usuario para conectarse al servidor Maestro y solicitar registros binarios.

Nos conectamos al servidor de MariaDB:

mysql -u root -p

Creamos el usuario de replicación de la siguiente forma:

> CREATE USER 'replication'@'%' identified by 'contraseñasegura';
> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
> FLUSH PRIVILEGES;

Finalmente, comprobamos el estado del nodo primario:

> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      786 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.001 sec)
🚨
Del resultado del estado del nodo primario, nos quedaremos con el valor que hay en el parámetro File y Position para configurar luego en el nodo secundario los mismos valores.

Preparación del Nodo Secundario

Ahora toca configurar el nodo secundario, para ello realizaremos una configuración similar pero con matices:

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Primero modificamos este parámetro:

bind-address            = 0.0.0.0
📢
Con la opción 0.0.0.0 estamos habilitando acceso a todo el mundo. Por lo que si tu proveedor permite configurar una red interna, lo ideal sería configurar acceso únicamente desde la red interna o incluso desde la IP del servidor que hace de slave.

Luego añadimos o descomentamos lo siguiente:

server-id              = 2
log_bin                = /var/log/mysql/mysql-bin.log
max_binlog_size        = 100M
relay_log = /var/log/mysql/mysql-relay-bin
relay_log_index = /var/log/mysql/mysql-relay-bin.index

Tras guardar esta configuración, reiniciamos el servicio:

systemctl restart mariadb

Configuración de la replicación en el nodo secundario

Ahora toca realizar la configuración, para ello nos conectamos al servidor de MariaDB:

mysql -u root -p

Y configuraremos el nodo secundario:

> STOP SLAVE;

Conectamos el nodo secundario con el nodo primario:

> CHANGE MASTER TO MASTER_HOST = '[IP_NODO_PRIMARIO]', MASTER_USER = 'replication', MASTER_PASSWORD = '[CONTRASEÑA_SEGURA]', MASTER_LOG_FILE = '[NOMBRE_DEL_FICHERO]', MASTER_LOG_POS = [POSICION];
  • [IP_NODO_PRIMARIO] es la dirección IP del nodo primario.
  • replication es el usuario de replicación.
  • [CONTRASEÑA_SEGURA] es la contraseña del usuario de replicación.
  • [NOMBRE_DEL_FICHERO] es el nombre del fichero de registro binario. El en ejemplo de antes se llamaba mysql-bin.000001.
  • [POSICION] es la posición del archivo de registro binario. En el ejemplo de antes era 786.

Una vez configurado esto, activamos de nuevo el nodo secundario:

> START SLAVE;

Verificación de la replicación

Para hacer la prueba de replicación, lo que haremos es crear una base de datos con una tabla y datos. Y tras crearlo en el nodo primario se deberá de replicar los datos en el nodo secundario.

Lo primero, accedemos al MySQL del nodo primario:

mysql -u root -p

Y creamos la base de datos con la tabla y datos:

MariaDB [(none)]> CREATE DATABASE tienda;
MariaDB [(none)]> USE tienda;
MariaDB [schooldb]> CREATE TABLE productos (id int, name varchar(20), description varchar(20));
MariaDB [schooldb]> INSERT INTO productos VALUES (1,"Pan","Pan Gallego");
MariaDB [schooldb]> INSERT INTO productos VALUES (2,"Agua","Agua mineral");

Tras la creación, listamos los valores que hay en la tabla:

MariaDB [tienda]> SELECT * FROM productos;
+------+------+--------------+
| id   | name | description  |
+------+------+--------------+
|    1 | Pan  | Pan Gallego  |
|    2 | Agua | Agua mineral |
+------+------+--------------+
2 rows in set (0.000 sec)

Ahora en el nodo secundario, lo que haremos será revisar el estado de la sincronización:

MariaDB [(none)]> SHOW SLAVE STATUS \G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 46.183.XXX.XXX
                   Master_User: replication
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000002
           Read_Master_Log_Pos: 1229
                Relay_Log_File: mysql-relay-bin.000002
                 Relay_Log_Pos: 1399
         Relay_Master_Log_File: mysql-bin.000002
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB: 
           Replicate_Ignore_DB: 
            Replicate_Do_Table: 
        Replicate_Ignore_Table: 
       Replicate_Wild_Do_Table: 
   Replicate_Wild_Ignore_Table: 
                    Last_Errno: 0
                    Last_Error: 
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 1229
               Relay_Log_Space: 1708
               Until_Condition: None
                Until_Log_File: 
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File: 
            Master_SSL_CA_Path: 
               Master_SSL_Cert: 
             Master_SSL_Cipher: 
                Master_SSL_Key: 
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error: 
                Last_SQL_Errno: 0
                Last_SQL_Error: 
   Replicate_Ignore_Server_Ids: 
              Master_Server_Id: 1
                Master_SSL_Crl: 
            Master_SSL_Crlpath: 
                    Using_Gtid: No
                   Gtid_IO_Pos: 
       Replicate_Do_Domain_Ids: 
   Replicate_Ignore_Domain_Ids: 
                 Parallel_Mode: optimistic
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
              Slave_DDL_Groups: 3
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 2
1 row in set (0.001 sec)

Ahora si listamos las bases de datos del nodo, veremos que tenemos la base de datos tienda:

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| tienda             |
+--------------------+
6 rows in set (0.001 sec)

Si mostramos el contenido de la tabla:

MariaDB [(none)]> use tienda;

Database changed
MariaDB [tienda]> select * from productos;
+------+------+--------------+
| id   | name | description  |
+------+------+--------------+
|    1 | Pan  | Pan Gallego  |
|    2 | Agua | Agua mineral |
+------+------+--------------+
2 rows in set (0.001 sec)

Conclusión

Ahora ya puedes implementar esta configuración en un entorno de producción para simplificar la recuperación ante fallas de uno de los nodos principales. La replicación de MariaDB es la mejor solución de respaldo para respaldar una base de datos desde un servidor de bases de datos principal a uno o más nodos secundarios.

Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación