Con­fi­gu­ra­re un cluster MariaDB con Galera Cluster consente di aumentare l’af­fi­da­bi­li­tà e la sca­la­bi­li­tà del database. In questo tutorial ti spie­ghia­mo come in­stal­la­re Galera Cluster su Ubuntu 20.04.

Galera Cluster di MariaDB: requisiti di sistema

Per poter in­stal­la­re un Galera Cluster di MariaDB 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 di­spo­ni­bi­li­tà che offre integrità dei dati e sca­la­bi­li­tà per ap­pli­ca­zio­ni complesse. In questa guida det­ta­glia­ta ti spie­ghia­mo come con­fi­gu­ra­re un cluster MariaDB con Galera Cluster su Ubuntu 20.04. Prima di iniziare, as­si­cu­ra­ti di avere a di­spo­si­zio­ne almeno tre server o macchine virtuali su cui in­stal­la­re il cluster.

Primo passaggio: ag­gior­na­re i pacchetti

Prima di tutto as­si­cu­ra­ti che il tuo sistema operativo Ubuntu sia ag­gior­na­to. Questo passaggio è fon­da­men­ta­le per poter aprire i pacchetti attuali e gli ag­gior­na­men­ti di sicurezza.

Per ag­gior­na­re le fonti dei pacchetti apri il terminale e digita il seguente comando:

sudo apt update
shell

Installa tutti gli ag­gior­na­men­ti di­spo­ni­bi­li:

sudo apt upgrade -y
shell

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

sudo apt autoremove -y
shell

Secondo passaggio: in­stal­la­re MariaDB sui server

Ora puoi in­stal­la­re MariaDB sui singoli server. A partire dalla versione 10.1, oltre al server MariaDB i file con­ten­go­no anche i pacchetti Galera.

sudo apt install mariadb-server
shell

Terminata l’in­stal­la­zio­ne, puoi avviare MariaDB:

sudo systemctl start mariadb
shell

Con il seguente comando fai in modo che MariaDB si attivi au­to­ma­ti­ca­men­te a ogni riavvio del sistema:

sudo systemctl enable mariadb
shell

Verifica se MariaDB funziona:

sudo systemctl status mariadb
shell

Inoltre, dovrai im­ple­men­ta­re alcune im­po­sta­zio­ni di sicurezza di base e con­fi­gu­ra­re il database. A tal proposito avvia l’as­si­sten­te di con­fi­gu­ra­zio­ne:

sudo mysql_secure_installation
shell

L’as­si­sten­te di con­fi­gu­ra­zio­ne guida l’utente at­tra­ver­so i singoli passaggi, come impostare la password di root, rimuovere gli utenti anonimi ed eliminare il database di prova.

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

Ora lo script ti chiederà di digitare la password di root. Se stai in­stal­lan­do MariaDB su Ubuntu 20.04 per la prima volta, premi Invio e inserisci una nuova password.

Terzo passaggio: con­fi­gu­ra­re i nodi Galera Cluster con MariaDB

Crea un file cnf nella directory /etc/mysql/conf.d di ogni nodo per definire le im­po­sta­zio­ni spe­ci­fi­che di Galera.

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

Il file contiene le im­po­sta­zio­ni generali del database quali il formato del pro­to­col­lo binario e il motore di ar­chi­via­zio­ne pre­de­fi­ni­to. Include anche le con­fi­gu­ra­zio­ni per Galera Cluster, tra cui il nome del cluster e gli indirizzi dei nodi.

Per il primo nodo digita le seguenti righe di comando:

[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"
shell
  • Im­po­sta­zio­ni generali del database: qui sono incluse im­po­sta­zio­ni quali binlog_format=ROW per il formato dei log binari e default-storage-engine=innodb per il motore di ar­chi­via­zio­ne pre­de­fi­ni­to.
  • Con­fi­gu­ra­zio­ne del provider Galera: im­po­sta­zio­ni come wsrep_on=ON servono ad attivare la replica Galera e a spe­ci­fi­ca­re il percorso alla libreria Galera wsrep_provider=/usr/lib/galera/libgalera_smm.so.
  • Con­fi­gu­ra­zio­ne 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.
  • Sin­cro­niz­za­zio­ne Galera: configura il metodo per lo State Snapshot Transfer (SST), ad esempio wsrep_sst_method=rsync.
  • Con­fi­gu­ra­zio­ne 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:

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

Ora prosegui con l’ultimo nodo:

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

Quarto passaggio: mo­di­fi­ca­re il firewall sui server

Poiché i nodi co­mu­ni­ca­no fra loro at­tra­ver­so porte spe­ci­fi­che, dovrai mo­di­fi­ca­re le im­po­sta­zio­ni del firewall di con­se­guen­za.

Apri la seguente porta nel firewall:

  • Porta 3306: questa è la porta standard di MariaDB, che viene usata per la co­mu­ni­ca­zio­ne e le richieste al database.
  • Porte Galera: oltre alla porta standard 3306, Galera usa anche altre porte per la co­mu­ni­ca­zio­ne interna tra i nodi. L’in­ter­val­lo pre­de­fi­ni­to per le porte Galera è so­li­ta­men­te 4567, 4568 e 4444 per lo State Snapshot Transfer (SST).

È possibile spe­ci­fi­ca­re le im­po­sta­zio­ni del firewall sul server Ubuntu tramite il seguente comando:

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

Quinto passaggio: avviare Galera Cluster in MariaDB

Se MariaDB è in uso, termina il processo.

sudo systemctl stop mariadb
shell

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

sudo galera_new_cluster
shell

Verifica il numero dei nodi nel cluster:

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

Dovresti ottenere questo output

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

Il primo nodo è stato avviato con successo.

Ora attiva il secondo:

systemctl start mariadb
shell

Verifica se il numero dei nodi è aumentato:

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

Nel terminale compare:

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

Ora avvia il terzo nodo:

systemctl start mariadb
shell

Controlla se il nodo funziona come previsto:

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

Ora il Cluster dovrebbe contenere tre nodi:

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

Sesto passaggio: testare la replica

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

mysql -u root -p
shell

Crea un nuovo database su un nodo del cluster:

CREATE DATABASE test_db;
sql

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

SHOW DATABASES;
sql

Il database di prova dovrebbe comparire nella lista dei database:

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

Aggiungi una nuova tabella di prova nel database di prova

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

Inserisci alcuni dati nella colonna name della tabella di prova:

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

Controlla se la tabella di prova e i dati inseriti sono stati tra­sfe­ri­ti cor­ret­ta­men­te:

USE test_db;
SELECT * FROM test_table;
sql

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

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

Con questo comando puoi ag­gior­na­re un record di dati nella tabella di prova:

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

Ora prova a can­cel­la­re un record di dati:

DELETE FROM test_table WHERE name = 'Giulio';
sql

Verifica sugli altri nodi se gli ag­gior­na­men­ti e le eli­mi­na­zio­ni sono stati replicati cor­ret­ta­men­te:

SELECT * FROM test_table;
sql

Le modifiche sono visibili su ogni nodo:

+----+------------+
| id | name     |
+----+-----------+
| 1  | Davide  |
| 3  | Marco   |
+----+-----------+
sql
Vai al menu prin­ci­pa­le