Co­n­fi­gu­rar un clúster de MariaDB con Galera Cluster mejora la fia­bi­li­dad y facilita el escalado de tu base de datos. A co­n­ti­nua­ción, te mostramos cómo instalar un Galera Cluster en Ubuntu 20.04.

Galera Cluster MariaDB: re­qui­si­tos previos

Para instalar un Galera Cluster en MariaDB en Ubuntu 20.04, debes cumplir con los si­guie­n­tes re­qui­si­tos:

  • Varios se­r­vi­do­res: necesitas al menos tres se­r­vi­do­res o máquinas virtuales para crear un clúster. Todos los se­r­vi­do­res deben estar en la misma red.
  • Permisos de root: necesitas tener acceso root o al menos permisos de ad­mi­ni­s­tra­dor en los se­r­vi­do­res.

Guía paso a paso: co­n­fi­gu­rar un Galera Cluster MariaDB en Ubuntu 20.04

Un Galera Cluster de MariaDB es una solución de base de datos práctica que mejora la di­s­po­ni­bi­li­dad, la in­te­gri­dad de datos y la es­ca­la­bi­li­dad de cara a apli­ca­cio­nes exigentes. Te aco­m­pa­ña­mos en el proceso de co­n­fi­gu­ra­ción de un Galera Cluster de MariaDB en Ubuntu 20.04. Antes de empezar, asegúrate de que tienes al menos tres se­r­vi­do­res o máquinas virtuales di­s­po­ni­bles para co­n­fi­gu­rar el clúster.

Paso 1: actualiza los paquetes

Es esencial que primero ac­tua­li­ces tu sistema Ubuntu a su última versión para ase­gu­rar­te de que tienes paquetes y las ac­tua­li­za­cio­nes de seguridad más recientes.

Abre un terminal y ejecuta el siguiente comando para ac­tua­li­zar las fuentes de los paquetes:

sudo apt update
shell

Instala todas las ac­tua­li­za­cio­nes di­s­po­ni­bles:

sudo apt upgrade -y
shell

También es re­co­me­n­da­ble eliminar los paquetes obsoletos o no uti­li­za­dos para limpiar los se­r­vi­do­res:

sudo apt autoremove -y
shell

Paso 2: instala MariaDB en los se­r­vi­do­res

Ahora instala MariaDB en cada uno de tus se­r­vi­do­res. Desde la versión 10.1, los paquetes de Galera vienen incluidos en los se­r­vi­do­res MariaDB.

sudo apt install mariadb-server
shell

Después de la in­s­ta­la­ción, inicia el servicio MariaDB:

sudo systemctl start mariadb
shell

Ejecuta el siguiente comando para que MariaDB se active au­to­má­ti­ca­me­n­te cada vez que se reinicie el sistema:

sudo systemctl enable mariadb
shell

Comprueba si MariaDB se está eje­cu­ta­n­do:

sudo systemctl status mariadb
shell

Realiza algunos ajustes básicos de seguridad y configura la base de datos. Para ello, inicia el asistente de co­n­fi­gu­ra­ción:

sudo mysql_secure_installation
shell

El asistente te guiará a través de los pasos ne­ce­sa­rios, como definir una co­n­tra­se­ña root, eliminar usuarios anónimos o eliminar la base de datos de prueba.

Enter current password for root (enter for none): 
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] Y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
shell

El script pregunta primero por la co­n­tra­se­ña root actual. Si es la primera vez que instalas MariaDB en Ubuntu 20.04, si­m­ple­me­n­te pulsa la tecla Enter e introduce una nueva co­n­tra­se­ña.

Paso 3: configura los nodos del Galera Cluster en MariaDB

Crea un archivo cnf en el di­re­c­to­rio /etc/mysql/conf.d de cada nodo para definir la co­n­fi­gu­ra­ción es­pe­cí­fi­ca de Galera.

nano /etc/mysql/conf.d/galera.cnf
shell

El archivo contiene la co­n­fi­gu­ra­ción general de la base de datos, como el formato del protocolo binario y el motor de al­ma­ce­na­mie­n­to pre­de­te­r­mi­na­do. También contiene co­n­fi­gu­ra­cio­nes para el Galera Cluster, in­clu­ye­n­do el nombre del clúster y la dirección del clúster.

Introduce las si­guie­n­tes líneas en el primer nodo:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Configuración del proveedor de Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Configuración del Galera Cluster
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Configuración de sincronización de Galera
wsrep_sst_method=rsync
# Configuración del nodo de Galera
wsrep_node_address="node_1-ip-address"
wsrep_node_name="node_1"
shell
  • Co­n­fi­gu­ra­ción general de la base de datos: incluye co­n­fi­gu­ra­cio­nes como binlog_format=ROW para el formato de registro binario y default-storage-engine=innodb para el motor de al­ma­ce­na­mie­n­to pre­de­te­r­mi­na­do.
  • Co­n­fi­gu­ra­ción del proveedor de Galera: co­n­fi­gu­ra­cio­nes como wsrep_on=ON para activar la re­pli­ca­ción de Galera y wsrep_provider=/usr/lib/galera/libgalera_smm.so para es­pe­ci­fi­car la ruta a la bi­blio­te­ca de Galera.
  • Co­n­fi­gu­ra­ción del Galera Cluster: incluye el nombre del clúster (wsrep_cluster_name) y la dirección del clúster (wsrep_cluster_address), que contiene las di­re­c­cio­nes IP o los nombres de host de los nodos del clúster.
  • Co­n­fi­gu­ra­ción de si­n­cro­ni­za­ción de Galera: configura el método para la tra­n­s­fe­re­n­cia de in­s­ta­n­tá­neas de estado (State Snapshot Transfer, SST), por ejemplo wsrep_sst_method=rsync.
  • Co­n­fi­gu­ra­ción del nodo de Galera: define la dirección IP o el nombre de host del nodo actual (wsrep_node_address) y el nombre del nodo (wsrep_node_name).

Después de guardar el archivo, crea uno para el segundo nodo:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Configuración del proveedor de Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Configuración del Galera Cluster
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Configuración de sincronización de Galera
wsrep_sst_method=rsync
# Configuración del nodo de Galera
wsrep_node_address="node_2-ip-address"
wsrep_node_name="node_2"
shell

Ahora haz lo mismo con el último nodo:

[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Configuración del proveedor de Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Configuración del Galera Cluster
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Configuración de sincronización de Galera
wsrep_sst_method=rsync
# Configuración del nodo de Galera
wsrep_node_address="node_3-ip-address"
wsrep_node_name="node_3"
shell

Paso 4: modifica el firewall en los se­r­vi­do­res

Dado que los nodos se comunican entre sí a través de ciertos puertos, debes ajustar la co­n­fi­gu­ra­ción del firewall.

Abre los si­guie­n­tes puertos en tu firewall:

  • Puerto 3306: es el puerto pre­de­te­r­mi­na­do de MariaDB. Se utiliza para co­mu­ni­car­se con la base de datos y realizar pe­ti­cio­nes.
  • Puertos de Galera: además del puerto pre­de­te­r­mi­na­do 3306, Galera también utiliza otros puertos para la co­mu­ni­ca­ción interna entre los nodos. Los puertos pre­de­te­r­mi­na­dos de Galera suelen ser 4567, 4568 y 4444 para la tra­n­s­fe­re­n­cia de in­s­ta­n­tá­neas de estado (State Snapshot Transfer, SST).

Configura las reglas del firewall en tu servidor Ubuntu con el siguiente comando:

sudo ufw allow 3306,4567,4568,4444/tcp
sudo ufw allow 4567/udp
shell

Paso 5: inicia Galera Cluster en MariaDB

Detén el servicio MariaDB si ya se está eje­cu­ta­n­do:

sudo systemctl stop mariadb
shell

El siguiente comando inicia el servidor MariaDB y crea un nuevo Galera Cluster en el primer nodo:

sudo galera_new_cluster
shell

Comprueba el número de nodos en el clúster:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
shell

Deberías obtener el siguiente resultado:

+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 1              |
+--------------------------+------------ -+
shell

El primer nodo se ha iniciado co­rre­c­ta­me­n­te.

Activa el segundo nodo:

systemctl start mariadb
shell

Comprueba si el número de nodos ha aumentado:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
shell

En la consola verás lo siguiente:

+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 2               |
+--------------------------+--------------+
shell

Ahora inicia el tercer nodo:

systemctl start mariadb
shell

Comprueba que el nodo funciona co­rre­c­ta­me­n­te:

mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
shell

Ahora debería haber tres nodos en el clúster:

+---------------------------+-------------+
| Variable_name        | Value       |
+--------------------------+--------------+
| wsrep_cluster_size | 3              |
+--------------------------+------------ -+
shell

Paso 6: prueba la re­pli­ca­ción

Asegúrate de que puedes co­ne­c­tar­te a cada uno de los nodos del clúster. Utiliza el cliente de MariaDB para iniciar sesión como usuario root o como otro usuario con su­fi­cie­n­tes permisos.

mysql -u root -p
shell

Crea una nueva base de datos de prueba (test_db) en uno de los nodos del clúster:

CREATE DATABASE test_db;
sql

Inicia sesión en los otros nodos y comprueba que la base de datos de prueba existe:

SHOW DATABASES;
sql

La base de datos de prueba debería aparecer en la lista de bases de datos:

+-------------------------------+
| Database                        |
+-------------------------------+
| information_schema   |
| mysql                              |
| performance_schema |
| test_db                          | 
| sys                                  |
+------------------------------+
sql

Añade una nueva tabla de prueba (test_table) a la base de datos de prueba (test_db):

USE test_db;
CREATE TABLE test_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50)
);
sql

Introduce algunos datos de prueba en la columna name de la tabla de prueba:

INSERT INTO test_table (name) VALUES ('Alicia'), ('Juan'), ('Carlos');
sql

Comprueba en los otros nodos si la tabla de prueba y los datos in­tro­du­ci­dos se han replicado:

USE test_db;
SELECT * FROM test_table;
sql

El resultado muestra la lista de personas con sus nombres e ID:

+----+-----------+
| id | name    |
+----+-----------+
| 1  | Alicia     |
| 2  | Juan       |
| 3  | Carlos |
+----+----------+
sql

Así puedes modificar un registro de datos en la tabla de prueba:

UPDATE test_table SET name = 'David' WHERE name = 'Alicia';
sql

Intenta eliminar un registro de datos:

DELETE FROM test_table WHERE name = 'Juan';
sql

Comprueba en los demás nodos si se han replicado las mo­di­fi­ca­cio­nes y eli­mi­na­cio­nes:

SELECT * FROM test_table;
sql

Los cambios aparecen co­rre­c­ta­me­n­te en cada nodo:

+----+------------+
| id | name     |
+----+-----------+
| 1  | David    |
| 3  | Carlos  |
+----+-----------+
sql
Ir al menú principal