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:
100.0.1.10 db1
100.0.1.11 db2
100.0.1.12 db3Modifica ogni indirizzo IP e hostname come meglio preferisci.
È (ovviamente) possibile inserire indirizzi IPv6:
fe80::1 db1
fe80::2 db2
fe80::2 db32. 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
Modifica /etc/mysql/mariadb.cnf.d/50-server.cnf e assicurati che la seguente riga sia commentata:
# bind-address = 0.0.0.0Crea l'utente per la replicazione: (modifica i parametri in grassetto)
mysql -u root -pCREATE 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)
# 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:
systemctl stop mariadb
galera_new_cluster4. 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.
# 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:
systemctl start mariadb5. Configura il firewall
Assicurati di aprire le seguenti porte:
3306(TCP): MySQL Client Connections & State Snapshot Transfer (mysqldump)4567(TCP/UDP): Galera Cluster Replication4568(TCP): Incremental State Transfer4444(TCP): State Snapshot Transfers
CentOS/Fedora/RHEL (firewalld):
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 --reloadDebian (ufw):
ufw allow 3306,4567,4568,4444/tcp
ufw allow 4567/udpQuesta è 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:
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size'"In questo caso, dato che abbiamo configurato 3 nodi, il comando restituirà il seguente:
+--------------------+-------+
| 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:
mysql -u root -pCREATE 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:
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:
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;
}
}
