Configurazione di un cluster di database ad alta disponibilità utilizzando MariaDB Galera, ProxySQL, Keepalived e Debian 13.
Introduzione
Man mano che le tue applicazioni crescono in scala e importanza, garantire una disponibilità continua diventa fondamentale. I tempi di inattività del database possono portare a perdite di entrate, utenti frustrati e danni alla tua reputazione. Questa guida dimostra come costruire un cluster MariaDB altamente disponibile (HA) sfruttando la replica Galera, ProxySQL per l'instradamento intelligente delle query e Keepalived per la gestione degli IP virtuali su Debian.
Questa architettura combina i punti di forza di ciascuna tecnologia per offrire un ambiente di database robusto e resiliente. MariaDB Galera fornisce una replica multi-master sincrona, garantendo la coerenza dei dati su più nodi. ProxySQL funge da router di query e bilanciatore di carico, fornendo una gestione intelligente del traffico e scaricando i server di database. Keepalived gestisce un indirizzo IP virtuale, fornendo un unico punto di accesso al cluster e automatizzando il failover in caso di guasti ai nodi.
Questa guida presuppone un'esperienza nell'amministrazione di sistemi Linux, concetti di rete di base (TCP/IP, DNS) e familiarità con l'amministrazione di database. Ci concentreremo sulla configurazione e integrazione di queste tecnologie in un ambiente Debian.
Vantaggi chiave di questa architettura:
- Alta Disponibilità: Il failover automatico garantisce tempi di inattività minimi.
- Coerenza dei Dati: La replica sincrona garantisce la coerenza dei dati su tutti i nodi.
- Prestazioni Migliorate: ProxySQL ottimizza l'instradamento delle query e riduce il carico sui server di database.
- Gestione Semplificata: Un singolo indirizzo IP virtuale semplifica la configurazione e l'accesso delle applicazioni.
Di cosa avrai bisogno:
- Tre VPS o server Debian 13.
- Accesso root o sudo a tutti i server.
- Familiarità con l'interfaccia della riga di comando.
- Una comprensione di base del networking TCP/IP e DNS.
Prerequisiti
Interconnessione dei nodi
Una corretta risoluzione dei nomi host è essenziale affinché il cluster funzioni correttamente. Ogni server deve essere in grado di trovare gli altri server per nome. Stiamo usando i nomi host per semplificare la gestione. Gli indirizzi IP dei nodi devono essere nella stessa subnet.
Mappatura dei Nomi Host e Indirizzi IP
- galera0 (nodo master): 192.168.10.10
- galera1 (nodo slave): 192.168.10.11
- galera2 (nodo slave): 192.168.10.12
Puoi ottenere la risoluzione dei nomi host utilizzando /etc/hosts o DNS.
- Utilizzando
/etc/hosts(Configurazione Semplificata): Questo è adatto per ambienti di test e sviluppo. Su ogni server, aggiungi voci che mappano il nome host del server al suo indirizzo IP statico nel file/etc/hosts. - Utilizzando DNS (Consigliato per la Produzione): Per ambienti più grandi o complessi, configura record DNS (record A) che mappano i nomi host dei server ai rispettivi indirizzi IP.
Verifica
Dopo aver configurato la risoluzione dei nomi host, verifica che ogni server possa risolvere i nomi host degli altri server utilizzando il comando ping. Ad esempio, da galera0, esegui ping galera1. Dovresti ricevere una risposta.
Installazione dei Pacchetti Richiesti
Prima di poter configurare il cluster Galera, dovrai installare i pacchetti MariaDB necessari su ciascun nodo. Questa sezione descrive i passaggi richiesti per i sistemi basati su Debian.
Aggiungi i repository richiesti
Aggiungi i repository richiesti utilizzando i seguenti comandi:
apt-get update && apt-get install -y --no-install-recommends lsb-release wget apt-transport-https ca-certificates
wget -nv -O /usr/share/keyrings/proxysql-3.0.x-keyring.gpg 'https://repo.proxysql.com/ProxySQL/proxysql-3.0.x/repo_pub_key.gpg'
echo "deb [signed-by=/usr/share/keyrings/proxysql-3.0.x-keyring.gpg] https://repo.proxysql.com/ProxySQL/proxysql-3.0.x/bookworm/ ./" | tee /etc/apt/sources.list.d/proxysql.list
Aggiornamento del sistema
Per prima cosa, aggiorna le liste dei pacchetti e i pacchetti. Esegui il comando successivo come root su ciascun nodo:
apt update && apt upgrade -y
Installa i pacchetti
Installa i pacchetti richiesti su ciascun nodo utilizzando questo comando:
apt install rsync mariadb-server mariadb-client galera-4 proxysql keepalived -y
Proteggi l'installazione di MariaDB
Esegui lo script di sicurezza su ciascun nodo:
sudo mariadb-secure-installation
Questo script esegue due passaggi cruciali: ti chiederà di impostare una password root forte per il server MariaDB e rimuoverà eventuali configurazioni predefinite non sicure. Segui le istruzioni sullo schermo per completare questo processo.
Abilita l'accesso remoto a MariaDB
Esegui questi comandi per abilitare l'accesso remoto su ciascun nodo:
sed -i "s/.*bind-address.*/bind-address = 0.0.0.0/" /etc/mysql/mariadb.conf.d/50-server.cnf
systemctl restart mariadb
Galera
Galera fornisce la replica sincrona dei dati su tutti i nodi del cluster. Ciò significa che ogni modifica apportata al database su un nodo viene automaticamente e simultaneamente propagata a tutti gli altri nodi. Vantaggi chiave di Galera in questa configurazione:
- Alta Disponibilità: Se un nodo fallisce, gli altri nodi continuano a servire i dati senza interruzioni. Il cluster promuove automaticamente un nodo sopravvissuto a diventare il primario.
- Coerenza dei Dati: Grazie alla replica sincrona, i dati sono sempre coerenti su tutti i nodi. Questo elimina il rischio di letture obsolete: stai sempre leggendo la versione più aggiornata dei dati.
- Scalabilità della Lettura: Poiché i dati sono replicati su più nodi, puoi distribuire le query di lettura su tutto il cluster per aumentare le prestazioni di lettura.
In sostanza, Galera garantisce che il tuo database MariaDB rimanga altamente disponibile, coerente e scalabile: requisiti cruciali per molte applicazioni.
Configurazione
Crea un file di configurazione /etc/mysql/conf.d/galera.cnf su ciascun nodo. Il contenuto sarà identico, ad eccezione del nome e dell'indirizzo di ciascun nodo. Incolla questo modello:
[mysqld] # Impostazioni di base di MariaDB binlog_format=ROW default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # Configurazione del Provider Galera wsrep_on=ON wsrep_provider=/usr/lib/galera/libgalera_smm.so # Configurazione del Cluster Galera wsrep_cluster_name="my_galera_cluster" wsrep_cluster_address="gcomm://galera0,galera1,galera2" # Configurazione specifica di questo nodo wsrep_node_name="<node_name>" wsrep_node_address="<node_address>"
Cambia <node_name> e <node_address> su ciascun nodo. Usa galera0 per il primo nodo e così via.
Importante: wsrep_cluster_address — elenca i nomi host di tutti i nodi del cluster su ogni nodo. wsrep_node_name — deve essere unico per ciascun nodo (ad es., galera0, galera1, galera2). wsrep_node_address — impostato sul nome host del nodo che stai configurando.
Avvia il cluster
Avvia il cluster sul primo nodo utilizzando questo comando:
sudo systemctl stop mariadb && sudo galera_new_cluster
Riavvia MariaDB sugli altri nodi:
sudo systemctl restart mariadb
Verifica della configurazione
Controlla la dimensione del cluster
Connettiti a MariaDB su qualsiasi nodo e controlla lo stato del cluster. Connettiti al database:
sudo mariadb -u root -p
Controlla lo stato dei nodi del cluster nella shell di MariaDB:
SHOW STATUS LIKE 'wsrep_cluster_size';
wsrep_cluster_size dovrebbe essere uguale al numero dei nostri nodi.
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+ 1 row in set (0.001 sec)
Test della Replica
Crea un database di test su qualsiasi nodo e inserisci un messaggio di test. Esegui i seguenti comandi dalla shell di MariaDB:
CREATE DATABASE galtest;
USE galtest;
CREATE TABLE messages (id INT AUTO_INCREMENT PRIMARY KEY, text VARCHAR(255));
INSERT INTO messages (text) VALUES ('Test from galera0!');
Quindi verifica i dati sugli altri nodi utilizzando la seguente query SQL tramite la shell di MariaDB:
USE galtest;
SELECT * FROM messages;
Il messaggio di test dovrebbe apparire:
+----+--------------------+ | id | text | +----+--------------------+ | 7 | Test from galera0! | +----+--------------------+ 1 row in set (0.001 sec)
ProxySQL
ProxySQL all'interno di questa configurazione di cluster è più di un semplice intermediario; migliora notevolmente le prestazioni, l'affidabilità e la gestibilità del tuo database. ProxySQL si posiziona come un livello cruciale tra la tua applicazione e il tuo cluster Galera. I suoi scopi principali sono:
- Caching delle Query: ProxySQL memorizza in modo aggressivo le query eseguite frequentemente. Invece di interrogare ripetutamente il cluster Galera per gli stessi dati, serve il risultato memorizzato nella cache, riducendo significativamente il carico del database e migliorando i tempi di risposta. Questo è particolarmente vantaggioso per le applicazioni con molte letture.
- Pooling delle Connessioni: ProxySQL mantiene un pool di connessioni persistenti al cluster Galera. Stabilire una connessione al database è un'operazione che richiede molte risorse. Il pooling delle connessioni evita questo sovraccarico riutilizzando le connessioni esistenti, migliorando ulteriormente le prestazioni.
- Bilanciamento del Carico & Instradamento delle Query: ProxySQL può instradare in modo intelligente le query a diversi nodi nel tuo cluster Galera in base a fattori come il carico del server, il tipo di query o l'affinità dei dati. Questo ti consente di distribuire il carico di lavoro e massimizzare le prestazioni del tuo cluster.
- Ottimizzazione delle Query: ProxySQL può riscrivere le query per essere più efficienti, potenzialmente sfruttando le capacità di Galera per un'esecuzione ottimale.
- Rilevamento dei Guasti & Instradamento: ProxySQL monitora continuamente la salute dei tuoi nodi Galera. Se un nodo fallisce, ProxySQL reindirizza automaticamente le query ai nodi sani, garantendo un servizio ininterrotto.
In sostanza, ProxySQL agisce come un gestore del traffico intelligente e un ottimizzatore delle prestazioni per il tuo cluster Galera, migliorandone significativamente l'efficienza e la resilienza.
Precauzioni
I login e le password di seguito sono solo a scopo educativo. Usa password forti per la configurazione in produzione.
Configurazione degli Utenti
Utente monitor
L'utente monitor all'interno di ProxySQL è un account di database dedicato esclusivamente agli strumenti di monitoraggio per accedere in modo sicuro alle statistiche e metriche interne. È configurato con permessi minimi – solo accesso SELECT – garantendo l'integrità e la sicurezza dei tuoi dati pur consentendo un monitoraggio completo delle prestazioni.
Esegui questa query nella shell di MariaDB sul nodo master per aggiungere l'utente monitor:
CREATE USER 'monitor'@'%' IDENTIFIED BY 'monitor';
GRANT SELECT ON *.* TO 'monitor'@'%';
FLUSH PRIVILEGES;
Utente applicazione
L'utente applicazione all'interno di ProxySQL è un account di database standard utilizzato dalle tue applicazioni per connettersi ed eseguire query contro il cluster Galera sottostante. È attraverso questo utente che la tua applicazione interagisce direttamente con il database, recuperando e manipolando i dati.
Esegui questa query nella shell di MariaDB sul nodo master per aggiungere l'utente applicazione:
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY 'test' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Verifica
Verifica la creazione degli utenti su tutti i nodi utilizzando questo comando:
mariadb -u root -e "SELECT user, host FROM mysql.user;"
Configurazione
Crea un file di configurazione /etc/proxysql.cnf su ciascun nodo e incolla il seguente contenuto:
datadir="/var/lib/proxysql" admin_variables={ admin_credentials="admin:admin" mysql_ifaces="127.0.0.1:6032" } mysql_variables={ threads=4 max_connections=2048 monitor_username="monitor" monitor_password="monitor" } mysql_servers=( { address="galera0" , port=3306 , hostgroup=0 }, { address="galera1" , port=3306 , hostgroup=0 }, { address="galera2" , port=3306 , hostgroup=0 }) mysql_users=( { username = "test" , password = "test" , default_hostgroup = 0 , active = 1 }) mysql_query_rules=( { rule_id=2 active=1 match_pattern="^SELECT.*" destination_hostgroup=0 apply=1 })
Abilita e avvia ProxySQL utilizzando questi comandi:
sudo systemctl start proxysql
sudo systemctl enable proxysql
sudo proxysql --reload
Controlla la tua configurazione di ProxySQL utilizzando questo comando:
mysql -u admin -padmin -h 127.0.0.1 -P6032 -e "SELECT hostname,status FROM mysql_servers;"
Tutti i nodi devono essere online:
+----------+--------+ | hostname | status | +----------+--------+ | galera0 | ONLINE | | galera1 | ONLINE | | galera2 | ONLINE | +----------+--------+
Keepalived
Keepalived gestisce un indirizzo IP virtuale, fornendo un unico punto di accesso al cluster e automatizzando il failover in caso di guasti ai nodi. Monitora la salute dei nodi MariaDB e reindirizza il traffico a un nodo sano se si verifica un guasto, mantenendo un'alta disponibilità. La configurazione definisce l'ID del Router Virtuale 51 e utilizza l'interfaccia eth0. Sul nodo master, lo state è impostato su MASTER con una priorità di 100. I nodi di backup sono configurati con uno state di BACKUP, con priorità rispettivamente di 90 e 80. L'virtual_ipaddress è impostato su 192.168.10.50 su tutti i nodi. VIP e nodi devono essere nella stessa subnet. L'hosting deve supportare VIP per VPS. L'autenticazione è abilitata con una password condivisa di 1234. L'impostazione advert_int definisce la frequenza con cui il nodo master invia annunci VRRP. Un valore più basso significa annunci più frequenti, potenzialmente accelerando il rilevamento del failover; un valore più alto significa annunci meno frequenti, potenzialmente ritardando il failover ma riducendo il sovraccarico della rete.
Configurazione
Crea un file di configurazione /etc/keepalived/keepalived.conf su ciascun nodo e incolla il seguente contenuto:
vrrp_instance VI_1 { state <NODE_STATE> interface eth0 virtual_router_id 51 priority <NODE_PRIORITY> advert_int 1 authentication { auth_type PASS auth_pass 1234 } virtual_ipaddress { 192.168.10.50/24 } }
Cambia <NODE_STATE> e <NODE_PRIORITY> come descritto sopra. Abilita e avvia il servizio keepalived:
sudo systemctl enable keepalived && sudo systemctl start keepalived
Verifica
Per verificare la configurazione, utilizza il VIP configurato tramite Keepalived e la porta configurata tramite ProxySQL. Controlla la dimensione del cluster per esempio:
mariadb -u test -ptest -h 192.168.10.50 -P6033 -D galtest -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
La risposta attesa deve corrispondere alla verifica di Galera:
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+
Ora puoi riavviare i nodi a caso, controllare la dimensione del cluster e la disponibilità dei dati.

Conclusione
Questa guida ha dimostrato come costruire un cluster MariaDB altamente disponibile utilizzando la replica Galera, ProxySQL per l'instradamento delle query e Keepalived per la gestione degli IP virtuali su Debian. Questa architettura offre diversi vantaggi chiave, tra cui alta disponibilità con failover automatico, coerenza dei dati tramite replica sincrona e prestazioni migliorate tramite ProxySQL. Combinando queste tecnologie, puoi costruire un ambiente di database robusto e resiliente in grado di gestire carichi di lavoro aumentati e minimizzare i tempi di inattività.