# 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](https://www.ionos.es/digitalguide/hosting/cuestiones-tecnicas/galera-cluster-para-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:

```shell
sudo apt update
```

Instala todas las actualizaciones disponibles:

```shell
sudo apt upgrade -y
```

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

```shell
sudo apt autoremove -y
```

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

```shell
sudo apt install mariadb-server
```

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

```shell
sudo systemctl start mariadb
```

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

```shell
sudo systemctl enable mariadb
```

Comprueba si MariaDB se está ejecutando:

```shell
sudo systemctl status mariadb
```

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

```shell
sudo mysql_secure_installation
```

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.

```shell
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
```

El script pregunta primero por la **contraseña root** actual. Si es la primera vez que [instalas MariaDB en Ubuntu 20.04](https://www.ionos.es/digitalguide/hosting/cuestiones-tecnicas/instalacion-de-mariadb-en-ubuntu-2004/), 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.

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

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:

```shell
[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"
```

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

```shell
[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"
```

Ahora haz lo mismo con el último nodo:

```shell
[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"
```

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

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

### Paso 5: inicia Galera Cluster en MariaDB

Detén el servicio MariaDB si ya se está ejecutando:

```shell
sudo systemctl stop mariadb
```

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

```shell
sudo galera_new_cluster
```

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

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

Deberías obtener el siguiente resultado:

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

El primer nodo se ha iniciado correctamente.

Activa el segundo nodo:

```shell
systemctl start mariadb
```

Comprueba si el número de nodos ha aumentado:

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

En la consola verás lo siguiente:

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

Ahora inicia el tercer nodo:

```shell
systemctl start mariadb
```

Comprueba que el nodo funciona correctamente:

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

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

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

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

```shell
mysql -u root -p
```

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

```sql
CREATE DATABASE test_db;
```

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

```sql
SHOW DATABASES;
```

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

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

Añade una nueva tabla de prueba (test\_table) a la base de datos de prueba (test\_db):

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

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

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

Comprueba en los otros nodos si la tabla de prueba y los datos introducidos se han replicado:

```sql
USE test_db;
SELECT * FROM test_table;
```

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

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

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

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

Intenta eliminar un registro de datos:

```sql
DELETE FROM test_table WHERE name = 'Juan';
```

Comprueba en los demás nodos si se han replicado las modificaciones y eliminaciones:

```sql
SELECT * FROM test_table;
```

Los cambios aparecen correctamente en cada nodo:

```sql
+----+------------+
| id | name     |
+----+-----------+
| 1  | David    |
| 3  | Carlos  |
+----+-----------+
```


This is a markdown version of: [https://www.ionos.es/digitalguide/hosting/cuestiones-tecnicas/galera-cluster-mariadb-en-ubuntu-2004/](https://www.ionos.es/digitalguide/hosting/cuestiones-tecnicas/galera-cluster-mariadb-en-ubuntu-2004/) for AI/LLM consumption.