Galera Cluster for MySQL
e' un cluster multimaster basato
sulla replicazione sincrona.
Per la sua efficienza e scalabilita' sta trovando una sempre maggior diffusione.
Gli utilizzi piu' comuni sono per l'implementazione di soluzioni in alta affidabilita'
e nelle configurazioni in Cloud.
Nel seguito sono riportate alcune informazioni di interesse organizzate in paragrafi specifici: Introduzione, Architettura, Installazione e configurazione, Avvertenze per l'uso, Amministrazione (FAQ), Galera vs NDB, Galera vs Replication, Galera vs Group Replication, ...
Il contenuto di questo documento e' tecnico. E' opportuna una conoscenza dell'architettura MySQL, degli storage Engine e della Replication.
Galera Cluster for MySQL e' un cluster multimaster basato sulla replicazione sincrona tra nodi in configurazione shared nothing.
I client si collegano ai database MySQL esattamente come se fossero nodi standalone.
I nodi di un cluster Galera sono connessi tra loro in configurazione N-N
e dialogano mediante l'API wsrep (write set replication API).
Vengono gestiti dal cluster i tipici eventi di ingresso/uscita dei nodi dal
cluster, il trasferimento iniziale dei dati, le situazioni di split-brain, ...
Mentre ciascun nodo si occupa localmente di gestire le connessioni con i client,
eseguire le query SQL in modo efficiente, ...
I nodi vengono mantenuti sempre sincronizzati tra loro
replicando le transazioni al momento del commit.
La fase di verifica della transazione viene chiamata certification test.
Se il risultato e' positivo la transazione viene trasferita (writeset)
ed eseguita su tutti i nodi del cluster nello stesso ordine.
Se il certification test fallisce la transazione viene abortita
e l'applicazione dovra' risottometterla.
L'algorimo utilizzato da Galera e' di tipo ottimistico ed utilizza
una tecnica di ordinamento delle transazioni per ridurre il numero di abort.
I vantaggi di Galera sono:
Le applicazioni client si collegano ad uno qualsiasi dei nodi del cluster che si comporta come un database standalone. Le attivita' di lettura vengono eseguite localmente e cosi' avviene per le istruzioni di DML fino al momento del commit. In fase di commit il cluster verifica (certification test) se l'operazione puo' essere eseguita senza conflitti. Per fare questo la transazione viene impacchettata (write-set), inviata su tutti i nodi, confermata (certification-test) ed eseguita (commit). Le transazioni vengono effettuate nello stesso ordine su tutti i nodi che risultano quindi sincronizzati. Questo approccio e' definito virtually synchronous replication nel senso che i nodi applicano gli stessi write-set nello stesso ordine ma in realta' le scritture e le commit sono demandate ai DB locali ed avvengono in modo asincrono.
Per mantenere l'allineamento dei dati i nodi comunicano tra loro;
oltre alla porta 3306, che e' il default di accesso ai database,
i nodi utilizzano la porta 4567 per il traffico di replica (TCP per l'unicast, TCP ed UDP per il multicast),
la porta 4568 per l'IST e la porta 4444 per l'SST.
Anche se le API wsrep (write set replication API)
sono teoricamente implementabili su un qualsiasi RDBMS,
l'implementazione disponibile di Galera
e' quella per l'Engine InnoDB di MySQL.
Solo le attivita' sull'Engine InnoDB vengono replicate, gli altri Engine
operano localmente ed e' in generale opportuno evitarne l'utilizzo.
Le applicazioni non debbono subire particolari modifiche ma solo trattare
l'eventuale errore sulla commit.
Infatti se la transazione non puo' essere eseguita il client riceve l'errore
1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK) e viene effettuato il rollback
di tutti i dati.
Dal punto di vista tecnico Galera Cluster for MySQL e' costituito da una versione MySQL con una patch che utilizza le API wsrep e dal provider Galera che e' implementato come demone garbd.
Questa pagina fa riferimento all'installazione di MySQL 5.6.21 con la patch wsrep 25.9 e Galera 3-25.3.9 su CentOS 6.x ma quanto riportato vale anche con poche differenze anche per le altre versioni.
L'installazione richiede il download di due componenti:
La configurazione in cluster richiede l'impostazione del parametro wsrep_cluster_address che prende forma di URL gcomm://[IP]. Anche se e' possibile effettuare l'impostazione su file di configurazione e' piu' comodo utilizzare la linea di comando. Il primo nodo che definisce il cluster utilizzera' il comando:
Come su ogni DB MySQL il tuning dei parametri si effettua agendo sul file my.cnf. Ecco un esempio:
# /etc/my.cnf.d/server.cnf query_cache_size=0 binlog_format=ROW default_storage_engine=innodb innodb_autoinc_lock_mode=2 innodb_doublewrite=1 wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address=gcomm://10.0.0.20,10.0.0.30 wsrep_cluster_name='XeClu01' wsrep_node_address='10.0.0.10' wsrep_node_name='db01' wsrep_sst_method=rsync wsrep_sst_auth=root:password
Nelle versioni piu' rececenti del cluster viene utilizzato il comando gm-installer, da eseguire come utente root su un linux box senza pacchetti aggiuntivi.
L'utilizzo di Galera Cluster puo' richiedere alcune modifiche alle applicazioni che debbono soddisfare alcune regole.
Dal punto di vista del DBA non sono molte le differenze...
ma dal punto di vista pratico si tratta di DB da gestire "con attenzione".
L'unico engine supportato e' InnoDB.
Gli statement DDL vengono replicati come statement
ma e' molto opportuno eseguirli sui singoli nodi "in isolamento"
[NdA sono disponibili due modalita': Total Order Isolation (TOI) e Rolling Schema Upgrade (RSU)].
L'uso diretto delle tabelle del data dictionary non e' supportato:
un UPDATE mysql.user SET... non viene eseguito ma viene correttamente replicato un SET PASSWORD...
Non sono supportati il query logging su tabella e la query cache.
Le versioni disponibili e certificate vanno scelte con cura
[NdA galera cluster NON e' disponibile per la versione 5.7 di MySQL]
[NdE Galera Cluster ora e' disponibili anche per la versione 5.7 ed 8.0 di MySQL
e viene distribuito con tutte le versioni di MariaDB],
le configurazioni in replica asincrona non sono tutte utilizzabili.
Dal punto di vista del tuning le prestazioni di Galera sono molto influenzate dal valore
dei parametri di durability: innodb_flush_log_at_trx_commit e sync_binlog.
Purtroppo i valori piu' conservativi sono anche quelli che forniscono le prestazioni inferiori...
Sul sito ufficiale e' disponibile un'ampia e dettagliata documentazione sulle differenze di Galera cluster con uno Stand-Alone MySQL Server.
La gestione di Galera Cluster richiede un impegno limitato
da parte del DBA. Ma qualcosa bisogna comunque fare...
Cosa si deve controllare e
come e' possibile agire quando si verificano dei problemi?
In questo capitolo vengono riportate le indicazioni
relative ai casi piu' comuni.
SHOW GLOBAL STATUS LIKE 'wsrep_cluster_status'; Deve essere Primary SHOW GLOBAL STATUS LIKE 'wsrep_cluster_size'; Deve riportare il numero totale di nodi del cluster SHOW STATUS LIKE 'wsrep_local_state_comment'; In una situazione normale tutti i nodi debbono restituire Synced Gli stati possibili sono: Initialized, Joining, Waiting on SST, Joined, Donor, Synced.
Per maggiori dettagli si puo' far riferimento alla documentazione ufficiale.
Nel caso in cui un nodo vada in down e venga riagganciato non e' necessaria alcuna operativa poiche' con Galera questo avviene automaticamente (con le impostazioni di default).
Nel caso pero' in cui venga perso il quorum e' necessario il bootstrap manuale del cluster.
In questo capitolo descriviamo i passi necessari
[NdA utilizzando i comandi su MariaDB che e' un fork di MySQL piu' utilizzati con Galera].
Il primo passo e' determinare il nodo piu' aggiornato:
mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_last_committed'"
A questo punto e' necessario effettuare lo shutdown di tutti i DB tirando giu' per ultimo
quello piu' aggiornato (eg. systemctl stop mariadb).
Ora va riavviato per primo il nodo piu' aggiornato con:
galera_new_cluster
Il cluster e' ora nuovamente attivo anche se con un solo nodo. I nodi successivi si agganceranno automaticamente lanciando
systemctl start mariadb
Non dovrebbe servire mai... ma nel caso in cui non partano i DB controllare il file /var/lib/mysql/grastate.dat eventualmente impostando safe_to_bootstrap=1.
MySQL puo' essere utilizzato in configurazione di cluster NDB con cui i dati vengono partizionati e distribuiti su piu' sistemi permettendo di disporre continuamente delle informazione anche in caso di caduta di un server.
Il cluster e' costituito da nodi che svolgono tra differenti funzioni:
Gli Storage Node mantengono i dati allineati tra loro utilizzando un'ampia cache in memoria e dialogando sulla porta 1186 con il nodo di Management. I dati vengono distribuiti in sharding tra i nodi mantenendo un numero stabilito di repliche. Ogni nodo mantiene in memoria l'intero DB che gli e' stato assegnato. L'occupazione per ogni singolo nodo e' pari alla dimensione del DB per il numero di repliche (due di default) diviso il numero di storage node.
Il cluster NDB e' utilizzato con applicazioni che richiedono un'elevata affidabilita', uno SLA 7x24 ed una logica applicativa semplice (eg. applicazioni telefoniche). Puo' essere utile confrontare le caratteristiche di Galera Cluster con NDB.
Win:
La replicazione standard di MySQL e' asincrona e, generalmente, statement based.
Nella replicazione MySQL il Master registra su file (bin-log)
tutti gli statement che vengono eseguiti sulla base dati
e che operano una qualche modifica ai dati (DML e DDL).
Lo Slave si collega con un thread al Master, raccoglie
il contenuto dei bin-log, lo trasferisce in locale e quindi
si occupa di applicarlo alla base dati.
La replicazione di MySQL e' molto diffusa perche' efficiente e semplice da configurare e mantenere. Puo' essere utile confrontare le caratteristiche di Galera Cluster con la Replication MySQL.
Win:
Nel valutare i punti riportati sopra e' opportuno ricordare che Galera usa la replication e che sono possibili configurazione miste (eg. un cluster galera in LAN replicato in WAN su un sito di DR).
La Group Replication e' stata introdotta di recente come Plugin nell'ultima versione di MySQL [NdE 5.7.17]. L'architettura di Galera Cluster e della Group Replication e' analoga e la tecnologia utilizzata e' simile.
Win:
Nel valutare i punti riportati sopra e' opportuno ricordare che la Group Replication e' stata appena introdotta come versione di produzione e quindi le valutazioni riportate sono provvisorie.
Ancora piu' recente [NdE 12 Aprile 2017] e' l'introduzione di InnoDB Cluster che completa l'architettura della Group Replication utilizzando il proxy MySQL-Router e il tool MySQL-Shell... quindi i confronto e' appena iniziato.
Galera Cluster for MySQL e' disponibile per Oracle MySQL Community, MariaDB, and Percona.
Un'indicazione sommaria delle release di Galera e' riportata nello schema seguente [NdE la versione aggiornata e' mantenuta in You Server Stinks per MySQL e Galera]:
(Sources: Galera Cluster, Git Hub Launchpad (old) MariaDB )
|
|
|
|
|
|
|
4 | Production |
Huge transaction support with streaming replication,
new system tables to help monitoring, backup locks, ... First release for MariaDB 10.4 only
Planned: non blocking DDL, ...
(2020-05): available on MySQL 8.0.19 too | 4-26.4.13 | 2019-06 | 2022-11 | Suggested |
3 | Production |
Support for MySQL 5.6, Wan optimizations, MySQL 5.6 GTID support,
Async compatibility, new write set key format;
(2017-02) MySQL 5.7 support (5.7.17). Desupport: MySQL 5.1.
(wsrep patch 25.25): last for MySQL 5.5 (5.5.62)
(wsrep patch 25.33): last for MySQL 5.6 (5.6.51)
Latest (2022-10): Galera 3 for MySQL 5.7.39 with wsrep Patch Version 25.31; last release for: MySQL 5.6.51 with wsrep Patch Version 25.33; MySQL 5.5.62 with wsrep Patch Version 25.25 | 3-25.3.37 | 2013-11 | 2022-10 | Suggested |
2 | Production | Incremental state transfer (IST). Schema upgrades: Total Order Isolation (TOI) or Rolling Schema Upgrade (RSU). | 2-25.2.9 | 2012-10 | 2014-03 | |
1 | Production | Foreign keys. Writeset cache. | 1. | 2011-10 | 2012-02 | |
0 | Production | (0.7): DDL Support. (0.8): SST Scripts. | 0.8.2 | 2009 | 2011-09 |
Titolo: MySQL Galera Cluster
Livello: Avanzato
Data:
14 Febbraio 2015 ❤️
Versione: 1.0.6 - 31 Ottobre 2020 🎃
Autore: mail [AT] meo.bogliolo.name