Galera Cluster for MySQL
Tuning

Galera Cluster Logo 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.
Il disegno di una corretta configurazione di un Galera richiedono competenze ed esperienza sia sui motori delle basi dati utilizzate (MySQL e MariaDB) che su Galera Cluster. In questa pagina ho cercato di raccogliere i principali elementi utili per il tuning di Galera Cluster.

Questa semplice e pragmatica paginetta riporta quelli che sono i principali parametri di tuning di Galera Cluster evitando di riportare i parametri meno significativi poiche'... sono centinaia ed abbondantemente descritti nelle documentazioni ufficiali.

Nel seguito sono riportate le informazioni di interesse organizzate in paragrafi specifici: Introduzione, Il processo di tuning, Sizing, Tuning, Varie ed eventuali.

Le indicazioni che seguono sono per un pubblico DBA adulto, per i minori o junior consigliamo di approfondire la conoscenza su MySQL, MariaDB, replica MySQL, Galera Cluster, tuning MySQL 5.7, tuning MySQL 8.0, ... prima di leggere questa paginetta!

Introduzione

Galera Cluster for MySQL o MariaDB e' un cluster multimaster basato sulla replicazione sincrona tra nodi in configurazione shared nothing.

Architettura Galera Cluster per MySQL/MariaDB I client si collegano ad uno qualsiasi dei database esattamente come se fosse un nodo MySQL standalone ma i dati vengono replicati in modo sincrono su tutti i componenti del cluster; per bilanciare il carico e' possibile utilizzare un qualsiasi proxy o distribuire gli accessi dalle applicazioni.
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 registrazione dei nodi sul cluster, il trasferimento iniziale dei dati, le situazioni di split-brain, ... Mentre ciascun nodo si occupa localmente di gestire le connessioni con i client ed 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 con un rollback sul nodo dove e' stata richiesta e l'applicazione dovra' eseguirla nuovamente.
L'algorimo utilizzato da Galera e' di tipo ottimistico ed utilizza una tecnica di ordinamento delle transazioni per ridurre il numero di abort, deadlock e rollback.

I vantaggi di Galera sono:

La configurazione di Galera e' relativamente semplice e con in parametri di default e' gia' perfettamente funzionante.
Maggiori dettagli sulla configurazione, installazione ed utilizzo di Galera sono riportati su
questo documento.

Vi sono pero' anche alcuni limiti in Galera Cluster: non e' un'architettura adatta a tutte le applicazioni ed a tutti i carichi di lavoro.
L'utilizzo di Galera Cluster richiede a volte modifiche alle applicazioni che debbono soddisfare alcune regole per operare correttamente.
L'unico engine supportato e' InnoDB ed ogni tabella deve avere una chiave primaria. Le DDL vanno eseguite con attenzione vi sono limiti alle transazioni: la dimensione massima della trasazioni e' limitata ed in generale e' molto opportuno spezzare grandi transazioni in parti piu' piccole [NdA cosa che puo' portare a performances peggiori]. Non sono supportati: LOCK/UNLOCK table; funzioni di lock (eg. GET_LOCK); transazioni XA; ... Non sono supportati il query logging su tabella e la query cache. Le transazioni possono ricevere l'errore Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK) e debbono essere in grado di gestirlo (eg. risottomettendo la transazione).

Dal punto di vista delle prestazioni con un carico transazionale un cluster Galera non puo' mai essere veloce quanto un MySQL standalone o in replica semplice: la fase di certificazione delle transazioni richiede che ogni nodo confermi il commit e questo introduce un ritardo sensibile nella gestione dell'OLTP.

Concludendo se le applicazioni non richiedono funzionalita' particolari (eg. query cache, engine diversi da InnoDB, transazioni di grandi dimensioni, frequenti modifiche agli schema) ed hanno un carico transazionale non elevato l'utilizzo di Galera Cluster e' un'ottima soluzione per distribuire gli accessi e fornire un buon livello di alta affidabilita'.

Attivita' di tuning

Il tuning di una base dati e' un'attivita' che richiede competenza ed esperienza. Se non sapete a cosa serve un parametro... non modificatelo!

Tuning process cycle Il tuning si fa se e quanto... serve. Se una base dati e' di modeste dimensioni, le applicazioni consolidate, tutto funziona ed i sistemi sono correttamente dimensionati e' sufficiente un'impostazione iniziale ragionevole dei parametri e niente piu'. Quando invece si presentano problemi o si vuole ottenere il massimo da un'architettura complessa il tuning diventa un'attivita' impegnativa ed importante che puo' richiedere diversi cicli per ottenere gli obiettivi previsti.

Nessun tuning si sostituisce ad un disegno corretto della base dati e dell'SQL. Prima di qualsiasi altra attivita' vanno controllati evenuali statement di lunga durata e corretti quelli errati, vanno creati tutti gli indici necessari e, nei casi in cui opportuno, va utilizzato il partitioning e lo sharding.

Misurare, misurare, misurare! Misurare le prestazioni prima delle attivita' di tuning, misurare tutti i test eseguiti e continuare a misurare effettuata una modifica di parametri. Senza misure non si fa tuning. Quali misure? Tutte quelle che servono! In generale dipendono dall'applicazione e dall'utilizzo del database: TPS, MST, Hit Ratio, #utenti, active threads, MTBF (si purtroppo anche questo), ... e dai sistemi ospite: %CPU, %IOW, LA, ... senza dimenticare le due principali: lo spazio ed il tempo (che come e' noto sono fisicamente legati tra loro :).
Se non c'e' una misura prima e dopo la modifica di parametri non si sta eseguendo alcun tuning: se si e' fortunati si ha un effetto placebo, se si e' sfortunati si peggiora il funzionamento.

Tutto cio' premesso... il tuning di una base dati con un Galera Cluster e' rivolto sia alle componenti del cluster che ai parametri tipici di MySQL, nei prossimi capitoli li vedremo entrambe.

Architettura e dimensionamento

Come gia' anticipato con le impostazioni di default Galera Cluster funziona immediatamente ma ci sono alcuni importanti elementi sul sizing e sull'architettura di cui tenere conto.

Per creare un cluster Galera il numero minimo e' di tre nodi. Un cluster Galera risulta correttamente attivo quando viene raggiunto il numero di quorum di nodi connessi: con tre nodi il quorum e' due ed il cluster sopporta un nodo non funzionante. Tuttavia se la caduta/perdita di un nodo risulta frequente e richiede un SST deve essere scelto un nodo come donor e quindi tutto il carico viene rivolto al solo nodo rimanente. Percio' nel caso di un utilizzo significativo in produzione di Galera e' consigliabile utilizzare un cluster a cinque nodi.
In ogni caso non deve mai essere utilizzato un numero pari di nodi: e' una configurazione errata ed il rischio di split brain o di blocco del cluster diventano molto forti.

Poiche' la certificazione delle transazioni deve essere confermata da ogni nodo il cluster va alla velocita' del nodo piu' lento. E' quindi consigliabile utilizzare nodi identici o almeno con le stesse caratteristiche dal punto di vista prestazionale.
I nodi sovvradimensionati consentono di smaltire correttamente il carico richiesto dalle applicazioni anche in caso di situazione degradata, solo in questo modo l'alta affidabilita' puo' essere garantita.

L'aggiunta di piu' nodi in Galera permette di scalare linearmente sulle attivita' in lettura; le attivita' in scrittura non scalano perche' debbono essere eseguite comunque su tutti i nodi. Inoltre l'overhead imposto dal cluster per la certificazione delle transazioni lo rende comunque piu' lento di un nodo MySQL singolo e piu' soggetto alle prestazioni dell'I/O.

Galera Architecture usecase3 official image Un cluster Galera puo' essere installato su un solo datacenter ma anche su datacenter diversi con un numero variabile di nodi. L'importante e' che il numero di nodi sia sempre dispari. Se distribuito Galera e' su piu' datacenter il numero ideale minimo di segmenti e' tre, ma possibile aggiungere un nodo Arbitrator se sono presenti due soli datacenter.
Un cluster Galera puo' anche essere configurato come Master o come Slave con la normale replica MySQL e' quindi possibile creare architetture distribuite personalizzate a seconda delle esigenze.
Galera sopporta meglio di altri cluster una rete con una latenza variabile. Utilizza infatti diversi protocolli per la riformazione automatica del cluster ed i parametri di default sui tempi di riposta del nodi sono relativamente alti. Vi sono pero' casi in cui la latenza delle trasmissioni, in particolare nelle architetture distribuite in WAN, puo' generare problemi. In questi casi e' possibile agire sulla configurazione come vedremo nel seguito... Ma se a causa di una rete poco affidabile, nonostante il tuning specifico di Galera, il numero di fault risulta troppo elevato non vi e' altra soluzione che rinunciare al cluster ed utilizzare la replica MySQL asincrona.

Nella fase di certificazione possono presentarsi situazioni di deadlock dovute al fatto che la stessa riga e' modificata in modo indipendente su nodi diversi. Se la situazione e' troppo frequente e' possibile indirizzare le applicazioni su un solo nodo in modo che il deadlock venga evitato dai normali meccanismi di locking MySQL. Questo non cambia il sizing del cluster perche' in realta' il carico in scrittura non viene distribuito ma sempre replicato.

Ogni nodo del cluster Galera e' indipendente e gestisce il carico di tutte le sessioni connesse. Il cluster non fornisce alcuna modalita' di bilanciamento dei nodi ma e' possibile utilizzare qualsiasi proxy server o load balancer esterno compatibile con MySQL. In alternativa possono essere le applicazioni che si collegano ai nodi con un ordine stabilito oppure accedendo con priorita' ai nodi locali.
La gestione delle connessioni al DB e' una parte integrante e fondamentale nella definizione dell'architettura di un Galera Cluster.

Tuning

I principali parametri di tuning di Galera vengono impostati con una sola variabile di configurazione MySQL che contiene tutte le opzioni. Oltre a questi sono disponibili tutti i parametri di tuning MySQL / MariaDB.

Le opzioni di configurazione di Galera vengono impostati nella variabile WSREP_PROVIDER_OPTIONS. Le opzioni da cambiare debbono essere impostati nella stessa riga e quelle non definite mantengono il valore di default. Il formato delle opzioni e' gruppo.nome dove il gruppo corrisponde ad un modulo di Galera come: evs (Eviction Control), fc (Flow Control), ... Alcune opzioni sono dinamiche, altre richiedono il riavvio.
Ecco l'elenco delle opzioni e dei parametri Galera in ordine di importanza! Naturalmente secondo il mio fallace personale giudizio...

Ecco l'elenco dei parametri MySQL/MariaDB piu' utili per Galera in ordine di importanza! Naturalmente secondo il mio fallace personale giudizio...

Parametri da non utilizzare Oltre ai parametri utili e' importante ricordare che ci sono parametri spesso utilizzati per il tuning di MySQL/MariaDB ma che non vanno utilizzati con Galera. La Query Cache MySQL non va utilizzata: non e' supportata con Galera.
L'unico Engine supportato da Galera e' InnoDB [NdA InnoDB ed i suoi compatibili come Percona XtraDB], su un cluster non vanno utilizzate tabelle con Engine differenti e naturalmente tutti i parametri di configurazione e tuning relativi (eg. key_buffer_size) non sono da utilizzare.

Attivita' amministrative

L'amministrazione di una base dati con Galera Cluster e' simile a quella di un normale database MySQL. Vi sono pero' alcune importanti differenze da sottolineare.

Oltre ai normali comandi di controllo dello stato di MySQL (eg. SHOW PROCESSLIST; SHOW GLOBAL STATUS; SHOW VARIABLES; ...) e' possibile controllare la configurazione di Galera con:
  SHOW VARIABLES LIKE 'wsrep%' \G
Nello stato di MySQL vi sono tutti i dettagli per Galera pero' sono una cinquantina di valori... i piu' importanti a mio avviso sono:
  show status where variable_name in
   ('wsrep_cluster_size', 'wsrep_cluster_status', 'wsrep_flow_control_paused',
   'wsrep_ready', 'wsrep_connected', 'wsrep_local_state_comment');

Le modifiche alla struttura della base dati vanno eseguite con molta attenzione su un Galera Cluster.
La modalita' di default per l'esecuzione delle DDL e' quella piu' sicura perche' non genera inconsistenze sulle basi dati; viene chiamata TOI (Total Order Isolation). Il problema e' che con il TOI le DDL bloccano le attivita' di commit su tutto il cluster che deve attendere che l'operazione termini. Questo puo' essere un problema per le DDL di una certa durata come le ALTER TABLE. Se si e' certi che vengono eseguite DDL retro-compatibili e' possibile utilizzare la modalita' RSU (Rolling Schema Upgrade) lanciandole su un nodo alla volta come nell'esempio che segue:

SET wsrep_OSU_method='RSU'; OPTIMIZE TABLE bigtable; SET wsrep_OSU_method='TOI';

Galera Cluster EE ha introdotto una terza modalita' chiamata NBO (Non Blocking Operations), simile alla TOI ma con un minore impatto.
[NdE Galera Cluster Enterprise Edition e' disponibile dal 2022-05 e consiste in Enhanced Galera Server (NBO, supporto XA, TDE per la GCache), Galera Manager e Galera Load Balancer]

Quando vi sono transazioni di lunga durata che non possono realizzate altrimenti o quando le transazioni modificano le stesse righe (e quindi andrebbero in conflitto) e' possibile "spezzare" la transazione in parti inviate sul cluster e certificate singolarmente. Questa modalita', disponibile da Galera 4, e' chiamata Streaming Replication e va usata con attenzione perche' introduce un carico superiore su tutti i nodi del cluster. Tipicamente la streaming replication si utilizza solo per una specifica transazione o per parti di essa:

START TRANSACTION; SET SESSION wsrep_trx_fragment_unit='statements'; SET SESSION wsrep_trx_fragment_size=1; ... HEAVY WORK or UPDATE of hot records SET SESSION wsrep_trx_fragment_size=0; ... Other parts of the transaction COMMIT;

Riassumendo molto... l'amministrazione di una base dati con Galera Cluster e' analoga a quella di un normale DB con MySQL ma richiede una particolare attenzione nel monitoraggio, nella gestione delle DDL e nel trattare transazioni di lunga durata.

Varie ed eventuali

Manca qualcosa? No: abbiamo gia' descritto tutti i parametri utili!

In generale le configurazioni di default presenti sono gia' ottimali...
innodb_flush_method: non cambiatelo! la scelta del metodo di flush puo' essere importante per le prestazioni in alcuni casi ma per valutare se cambiare rispetto al default fsync (eg. impostandolo a O_DIRECT che evita il double buffering) e' opportuno un benchmark specifico sui dischi ed una conoscenza esatta del comportamento dello storage e del sistema operativo, alcune impostazioni sono corrette su versioni e file system specifici (eg. O_DIRECT_NO_FSYNC 8.0.25+)... insomma io non lo cambio o ne sapete piu' di me o non cambiatelo; innodb_buffer_pool_instances: indica il numero di regioni in cui il buffer pool e' diviso per ridurre le contese dei latch. E' un'ottimizzazione significativa... ma il valore di default e' gia' adatto alla maggioranza dei casi; innodb_doublewrite: non cambiatelo! a meno che non stiate eseguendo un benchmark non e' il caso di rischiare la corruzione del DB; ALTER INSTANCE DISABLE INNODB REDO_LOG: non eseguitelo! e' utile solo per un caricamento iniziale, se si ha un errore il DB va creato da zero; performance_schema: e' vero che ha un peso per le prestazioni, ma non e' consigliabile impostarlo ad OFF su un ambiente di produzione a meno che non siate certi della buona qualita' dell'SQL di tutte le applicazioni ospitate [NdA non sono tutti di questa opinione: su MariaDB per default e' disabilitato e lo stesso avviene con MySQL su Amazon RDS; al contrario Percona, benchmark alla mano, lo ritiene poco invasivo]; spesso sono presenti attese su lock che attendono fino a innodb_lock_wait_timeout, anche se e' possibile monitorarle con INNODB_ROW_LOCK_TIME, INNODB_ROW_LOCK_WAITS, INNODB_ROW_LOCK_CURRENT_WAITS, ... tipicamente non si puo' fare molto dal punto di vista del tuning ma solo agire sull'applicazione; max_allowed_packet: e' un parametro che spesso si modifica, ma non e' un parametro prestazionale; ...
Infine vm.swappiness: da impostare sempre a 1 su un DB server, ma e' un parametro del sistema operativo!


Manca qualcosa? Sicuramente si!

Sarebbe un grave errore pensare di poter riassumere tutto in una paginetta. I parametri MySQL, MariaDB e Galera sono centinaia e sono tutti importanti per sfruttare le funzionalita' ed ottenere le massime performance con un Galera Cluster.

MariaDB Cluster e Percona XtraDB Cluster sono distribuzioni dei noti fork MySQL con il plugin di Galera Cluster; quanto descritto in questa pagina vale anche per tali software.


Titolo: Galera Cluster Tuning
Livello: Esperto (4/5)
Data: 14 Febbraio 2020
Versione: 1.0.2 - 31 Ottobre 2022
Autore: mail [AT] meo.bogliolo.name