# Galera Cluster: configurare un cluster MariaDB su Ubuntu 20.04

Configurare un cluster MariaDB con Galera Cluster consente di aumentare l’affidabilità e la scalabilità del database. In questo tutorial ti spieghiamo come installare Galera Cluster su Ubuntu 20.04.

## Galera Cluster di MariaDB: requisiti di sistema

Per poter installare un [Galera Cluster di MariaDB](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/mariadb-galera-cluster/) su **Ubuntu 20.04** sono necessari i seguenti requisiti di base:

- **Più server**: per creare un cluster sono necessari almeno tre server o macchine virtuali. Tutti i server devono far parte della stessa rete.
- **Permessi di root**: hai bisogno di un accesso root o di permessi admin ai server.

## Guida: Galera Cluster di MariaDB su Ubuntu 20.04

Un cluster MariaDB con Galera Cluster è una soluzione di database efficace e ad alta disponibilità che offre integrità dei dati e scalabilità per applicazioni complesse. In questa guida dettagliata ti spieghiamo come configurare un cluster MariaDB con Galera Cluster su Ubuntu 20.04. Prima di iniziare, assicurati di avere a disposizione almeno tre server o macchine virtuali su cui installare il cluster.

### Primo passaggio: aggiornare i pacchetti

Prima di tutto assicurati che il tuo sistema operativo Ubuntu sia aggiornato. Questo passaggio è fondamentale per poter aprire **i pacchetti attuali e gli aggiornamenti di sicurezza**.

Per aggiornare le fonti dei pacchetti apri il terminale e digita il seguente comando:

```shell
sudo apt update
```

Installa tutti gli aggiornamenti disponibili:

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

Per una migliore pulizia dei server, si consiglia di **eliminare i pacchetti obsoleti o non più in uso**:

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

### Secondo passaggio: installare MariaDB sui server

Ora puoi installare MariaDB sui singoli server. A partire dalla **versione 10.1**, oltre al server MariaDB i file contengono anche i pacchetti Galera.

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

Terminata l’installazione, puoi avviare MariaDB:

```shell
sudo systemctl start mariadb
```

Con il seguente comando fai in modo che MariaDB si attivi automaticamente a ogni riavvio del sistema:

```shell
sudo systemctl enable mariadb
```

Verifica se MariaDB funziona:

```shell
sudo systemctl status mariadb
```

Inoltre, dovrai implementare alcune impostazioni di sicurezza di base e configurare il database. A tal proposito avvia **l’assistente di configurazione**:

```shell
sudo mysql_secure_installation
```

L’assistente di configurazione guida l’utente attraverso i singoli passaggi, come impostare la password di root, rimuovere gli utenti anonimi ed eliminare il database di prova.

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

Ora lo script ti chiederà di digitare la **password di root**. Se stai [installando MariaDB su Ubuntu 20.04](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/installazione-di-mariadb-su-ubuntu-2004/) per la prima volta, premi Invio e inserisci una nuova password.

### Terzo passaggio: configurare i nodi Galera Cluster con MariaDB

Crea un file `cnf` nella directory `/etc/mysql/conf.d` di ogni nodo per definire le impostazioni specifiche di Galera.

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

Il file contiene le impostazioni generali del database quali il formato del protocollo binario e il **motore di archiviazione predefinito**. Include anche le configurazioni per Galera Cluster, tra cui il nome del cluster e gli indirizzi dei nodi.

Per il primo nodo digita le seguenti righe di comando:

```shell
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="node_1-ip-address"
wsrep_node_name="node_1"
```

- **Impostazioni generali del database**: qui sono incluse impostazioni quali `binlog_format=ROW` per il formato dei log binari e `default-storage-engine=innodb` per il motore di archiviazione predefinito.
- **Configurazione del provider Galera**: impostazioni come `wsrep_on=ON` servono ad attivare la replica Galera e a specificare il percorso alla libreria Galera `wsrep_provider=/usr/lib/galera/libgalera_smm.so`.
- **Configurazione di Galera Cluster**: comprende il nome del cluster (`wsrep_cluster_name`) e l’indirizzo del cluster (`wsrep_cluster_address`), che a sua volta contiene gli indirizzi IP o i nomi dell’host dei nodi nel cluster.
- **Sincronizzazione Galera**: configura il metodo per lo State Snapshot Transfer (SST), ad esempio `wsrep_sst_method=rsync`.
- **Configurazione dei nodi Galera**: definisce l’indirizzo IP o il nome dell’host del nodo attuale (`wsrep_node_address`) nonché il nome del nodo (`wsrep_node_name`).

Dopo aver salvato il primo file, puoi crearne un altro per il secondo nodo:

```shell
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="node_2-ip-address"
wsrep_node_name="node_2"
```

Ora prosegui con l’ultimo nodo:

```shell
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://node_1-ip-address,node_2-ip-address,node_3-ip-address"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="node_3-ip-address"
wsrep_node_name="node_3"
```

### Quarto passaggio: modificare il firewall sui server

Poiché i nodi comunicano fra loro attraverso porte specifiche, dovrai modificare le **impostazioni del firewall** di conseguenza.

Apri la seguente **porta** nel firewall:

- **Porta 3306**: questa è la porta standard di MariaDB, che viene usata per la comunicazione e le richieste al database.
- **Porte Galera**: oltre alla porta standard 3306, Galera usa anche altre porte per la comunicazione interna tra i nodi. L’intervallo predefinito per le porte Galera è solitamente 4567, 4568 e 4444 per lo State Snapshot Transfer (SST).

È possibile specificare le impostazioni del firewall sul server Ubuntu tramite il seguente comando:

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

### Quinto passaggio: avviare Galera Cluster in MariaDB

Se MariaDB è in uso, termina il processo.

```shell
sudo systemctl stop mariadb
```

Questo comando avvia il *server MariaDB*\* e avvia un nuovo Galera Cluster sul primo nodo:

```shell
sudo galera_new_cluster
```

Verifica il numero dei nodi nel cluster:

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

Dovresti ottenere questo output

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

Il primo nodo è stato avviato con successo.

Ora attiva il secondo:

```shell
systemctl start mariadb
```

Verifica se il numero dei nodi è aumentato:

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

Nel terminale compare:

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

Ora avvia il terzo nodo:

```shell
systemctl start mariadb
```

Controlla se il nodo funziona come previsto:

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

Ora il Cluster dovrebbe contenere tre nodi:

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

### Sesto passaggio: testare la replica

Verifica di poterti connettere a ogni nodo del cluster. Usa il **client MariaDB** per poter accedere come utente root o un altro utente con i permessi adeguati.

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

Crea un nuovo database su un nodo del cluster:

```sql
CREATE DATABASE test_db;
```

Accedi agli altri nodi e verifica se il database di prova è presente:

```sql
SHOW DATABASES;
```

Il database di prova dovrebbe comparire nella lista dei database:

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

Aggiungi una nuova tabella di prova nel database di prova

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

Inserisci alcuni dati nella colonna `name` della tabella di prova:

```sql
INSERT INTO test_table (name) VALUES ('Alice'), ('Giulio'), ('Marco');
```

Controlla se la tabella di prova e i dati inseriti sono stati trasferiti correttamente:

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

L’output mostra la lista delle persone con il loro nome e ID:

```sql
+----+-----------+
| id | name    |
+----+-----------+
| 1  | Alice     |
| 2  | Giulio   |
| 3  | Marco |
+----+----------+
```

Con questo comando puoi aggiornare un record di dati nella tabella di prova:

```sql
UPDATE test_table SET name = 'Davide' WHERE name = 'Alice';
```

Ora prova a cancellare un record di dati:

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

Verifica sugli altri nodi se gli aggiornamenti e le eliminazioni sono stati replicati correttamente:

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

Le modifiche sono visibili su ogni nodo:

```sql
+----+------------+
| id | name     |
+----+-----------+
| 1  | Davide  |
| 3  | Marco   |
+----+-----------+
```


This is a markdown version of: [https://www.ionos.it/digitalguide/hosting/tecniche-hosting/galera-cluster-di-mariadb-su-ubuntu-2004/](https://www.ionos.it/digitalguide/hosting/tecniche-hosting/galera-cluster-di-mariadb-su-ubuntu-2004/) for AI/LLM consumption.