Galera Cluster: configurar un clúster de MariaDB en Ubuntu 20.04

Configurar un clúster de MariaDB con Galera Cluster mejora la fiabilidad y facilita el escalado de tu base de datos. A continuación, te mostramos cómo instalar un Galera Cluster en Ubuntu 20.04.

Galera Cluster MariaDB: requisitos previos

Para instalar un Galera Cluster en MariaDB en Ubuntu 20.04, debes cumplir con los siguientes requisitos:

  • Varios servidores: necesitas al menos tres servidores o máquinas virtuales para crear un clúster. Todos los servidores deben estar en la misma red.
  • Permisos de root: necesitas tener acceso root o al menos permisos de administrador en los servidores.

Guía paso a paso: configurar 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 disponibilidad, la integridad de datos y la escalabilidad de cara a aplicaciones exigentes. Te acompañamos en el proceso de configuración de un Galera Cluster de MariaDB en Ubuntu 20.04. Antes de empezar, asegúrate de que tienes al menos tres servidores o máquinas virtuales disponibles para configurar el clúster.

Paso 1: actualiza los paquetes

Es esencial que primero actualices tu sistema Ubuntu a su última versión para asegurarte de que tienes paquetes y las actualizaciones de seguridad más recientes.

Abre un terminal y ejecuta el siguiente comando para actualizar las fuentes de los paquetes:

sudo apt update
shell

Instala todas las actualizaciones disponibles:

sudo apt upgrade -y
shell

También es recomendable eliminar los paquetes obsoletos o no utilizados para limpiar los servidores:

sudo apt autoremove -y
shell

Paso 2: instala MariaDB en los servidores

Ahora instala MariaDB en cada uno de tus servidores. Desde la versión 10.1, los paquetes de Galera vienen incluidos en los servidores MariaDB.

sudo apt install mariadb-server
shell

Después de la instalación, inicia el servicio MariaDB:

sudo systemctl start mariadb
shell

Ejecuta el siguiente comando para que MariaDB se active automáticamente cada vez que se reinicie el sistema:

sudo systemctl enable mariadb
shell

Comprueba si MariaDB se está ejecutando:

sudo systemctl status mariadb
shell

Realiza algunos ajustes básicos de seguridad y configura la base de datos. Para ello, inicia el asistente de configuración:

sudo mysql_secure_installation
shell

El asistente te guiará a través de los pasos necesarios, como definir una contraseñ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 contraseña root actual. Si es la primera vez que instalas MariaDB en Ubuntu 20.04, simplemente pulsa la tecla Enter e introduce una nueva contraseña.

Paso 3: configura los nodos del Galera Cluster en MariaDB

Crea un archivo cnf en el directorio /etc/mysql/conf.d de cada nodo para definir la configuración específica de Galera.

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

El archivo contiene la configuración general de la base de datos, como el formato del protocolo binario y el motor de almacenamiento predeterminado. También contiene configuraciones para el Galera Cluster, incluyendo el nombre del clúster y la dirección del clúster.

Introduce las siguientes 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
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
  • Configuración general de la base de datos: incluye configuraciones como binlog_format=ROW para el formato de registro binario y default-storage-engine=innodb para el motor de almacenamiento predeterminado.
  • Configuración del proveedor de Galera: configuraciones como wsrep_on=ON para activar la replicación de Galera y wsrep_provider=/usr/lib/galera/libgalera_smm.so para especificar la ruta a la biblioteca de Galera.
  • Configuració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 direcciones IP o los nombres de host de los nodos del clúster.
  • Configuración de sincronización de Galera: configura el método para la transferencia de instantáneas de estado (State Snapshot Transfer, SST), por ejemplo wsrep_sst_method=rsync.
  • Configuració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 servidores

Dado que los nodos se comunican entre sí a través de ciertos puertos, debes ajustar la configuración del firewall.

Abre los siguientes puertos en tu firewall:

  • Puerto 3306: es el puerto predeterminado de MariaDB. Se utiliza para comunicarse con la base de datos y realizar peticiones.
  • Puertos de Galera: además del puerto predeterminado 3306, Galera también utiliza otros puertos para la comunicación interna entre los nodos. Los puertos predeterminados de Galera suelen ser 4567, 4568 y 4444 para la transferencia de instantá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á ejecutando:

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 correctamente.

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 correctamente:

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 replicación

Asegúrate de que puedes conectarte 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 suficientes 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 introducidos 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 modificaciones y eliminaciones:

SELECT * FROM test_table;
sql

Los cambios aparecen correctamente en cada nodo:

+----+------------+
| id | name     |
+----+-----------+
| 1  | David    |
| 3  | Carlos  |
+----+-----------+
sql
¿Le ha resultado útil este artículo?
Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación. Si continua navegando, consideramos que acepta su uso. Puede obtener más información, o bien conocer cómo cambiar la configuración de su navegador en nuestra. Política de Cookies.
Page top