Logo

Database MySQL altamente disponibile e distribuito con MariaDB e Galera Cluster. Supporta il failover automatico.

1. Raccogli i tuoi host

Per avere una configurazione più flessibile, e non avere il bisogno di ricordare indirizzi IP, modifica /etc/hosts e inserisci le righe seguenti:

   Copia
100.0.1.10 db1
100.0.1.11 db2
100.0.1.12 db3

Modifica ogni indirizzo IP e hostname come meglio preferisci.

Info

È (ovviamente) possibile inserire indirizzi IPv6:

   Copia
fe80::1 db1
fe80::2 db2
fe80::2 db3

2. Installa MariaDB e Galera Cluster

  • Debian:
       Copia
    sudo apt install mariadb-server galera-4
  • Centos/Fedora/RHEL:
       Copia
    sudo dnf install mariadb-server mariadb-server-galera
  • Gentoo:
       Copia
    sudo emerge dev-db/mariadb sys-cluster/galera

3. Configura il primo nodo

Info

Modifica /etc/mysql/mariadb.cnf.d/50-server.cnf e assicurati che la seguente riga sia commentata:

   Copia
# bind-address = 0.0.0.0

Crea l'utente per la replicazione: (modifica i parametri in grassetto)

   Copia
mysql -u root -p
   Copia
CREATE USER 'replication' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'replication';
FLUSH PRIVILEGES;

Modifica /etc/mysql/mariadb.cnf.d/60-galera.cnf: (modifica i parametri in grassetto)

   Copia
# Debian: [galera]
# RHEL: [mysqld]

[galera]
binlog_format            = row
default-storage-engine   = innodb
innodb_autoinc_lock_mode = 2

# Galera Provider
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so

# Cluster
wsrep_cluster_name    = "MariaDB Galera Cluster"
wsrep_cluster_address = "gcomm://db1,db2,db3"
wsrep_sst_method      = rsync
wsrep_sst_auth        = replication:passwd

# This node's config
bind-address                = db1
wsrep_node_name             = "db1"
wsrep_node_address          = "db1"
wsrep_node_receive_address  = "db1"
wsrep_node_incoming_address = "db1"

Crea il cluster:

   Copia
systemctl stop mariadb
galera_new_cluster

4. Configurazione degli altri nodi

Ora che il cluster è stato configurato sul primo nodo, è sufficiente copiare il file di configurazione su tutti gli altri nodi, assicurandosi di modificare gli ultimi 5 parametri, che identificano univocamente il nodo.

Esempio: configurazione su un secondo nodo.

   Copia
# Debian: [galera]
# RHEL: [mysqld]

[galera]
binlog_format            = row
default-storage-engine   = innodb
innodb_autoinc_lock_mode = 2

# Galera Provider
wsrep_on = ON
wsrep_provider = /usr/lib/galera/libgalera_smm.so

# Cluster
wsrep_cluster_name    = "MariaDB Galera Cluster"
wsrep_cluster_address = "gcomm://db1,db2,db3"
wsrep_sst_method      = rsync
wsrep_sst_auth        = replication:passwd

# This node's config
bind-address                = db2
wsrep_node_name             = "db2"
wsrep_node_address          = "db2"
wsrep_node_receive_address  = "db2"
wsrep_node_incoming_address = "db2"

Dopo aver configurato ogni nodo, è possibile avviare MariaDB:

   Copia
systemctl start mariadb

5. Configura il firewall

Assicurati di aprire le seguenti porte:

  • 3306 (TCP):  MySQL Client Connections & State Snapshot Transfer (mysqldump)
  • 4567 (TCP/UDP):  Galera Cluster Replication
  • 4568 (TCP):  Incremental State Transfer
  • 4444 (TCP):  State Snapshot Transfers

CentOS/Fedora/RHEL (firewalld):

   Copia
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4567/udp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --reload

Debian (ufw):

   Copia
ufw allow 3306,4567,4568,4444/tcp
ufw allow 4567/udp
Attenzione

Questa è solo una configurazione di esempio. È vivamente consigliato che tu modifichi questa configurazione in modo tale che solo i tuoi nodi possano comunicare su queste porte.

6. Verifica configurazione

Verifica che il tuo cluster abbia il corretto numero di nodi con il seguente comando:

   Copia
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

In questo caso, dato che abbiamo configurato 3 nodi, il comando restituirà il seguente:

   Copia
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Per essere sicuri che la replicazione funziona correttamente, creiamo un DB e una tabella di prova su un nodo qualsiasi:

   Copia
mysql -u root -p
   Copia
CREATE DATABASE testdb;
CREATE TABLE testdb.msg (
    'id' INT NOT NULL AUTO_INCREMENT,
    'message' VARCHAR(255) NOT NULL,
    PRIMARY KEY ('id')
);
INSERT INTO testdb.msg ('id', 'message') VALUES (1, 'AAA');
INSERT INTO testdb.msg ('id', 'message') VALUES (2, 'BBB');
INSERT INTO testdb.msg ('id', 'message') VALUES (3, 'CCC');

Esegui questo comando su un altro nodo qualsiasi:

   Copia
mysql -e "SELECT * FROM testdb.msg"

7. Load balancer con nginx

È possibile usare nginx opzionalmente per distribuire i carichi di lavoro (load balancer) per il cluster. Modifica /etc/nginx/nginx.conf e aggiungi la configurazione seguente:

   Copia
stream {
	upstream cluster {
		zone tcp_servers 64k;
		server db1:3306;
		server db2:3306;
		server db3:3306;
	}

	# NOTE: change this port if you already have
	# mariadb/mysql running on this host
	server {
		# required: nginx >=1.25.5
		# https://nginx.org/en/docs/stream/ngx_stream_core_module.html#server_name
		# server_name db.internal.example.com;
		listen 3306;
		proxy_pass cluster;
		proxy_connect_timeout 3s;
	}
}
← Torna alla pagina principale