Ci sono diversi motivi per aggiungere un sistema di bilanciamento del carico tra la tua applicazione e il tuo database. Se hai un traffico elevato (e vuoi bilanciare il traffico tra diversi nodi del database) o vuoi utilizzare il sistema di bilanciamento del carico come un singolo endpoint (quindi in caso di failover, questo sistema di bilanciamento del carico affronterà questo problema inviando il traffico al disponibile/integro.) Potrebbe anche essere che tu voglia usare porte diverse per scrivere e leggere i dati dal tuo database.
In tutti questi casi, un sistema di bilanciamento del carico ti sarà utile e, se disponi di un cluster MariaDB, un'opzione per questo è l'utilizzo di MaxScale, che è un proxy di database per i database MariaDB.
In questo blog, ti mostreremo come installarlo e configurarlo manualmente e come ClusterControl può aiutarti in questa attività. Per questo esempio, utilizzeremo un cluster di replica MariaDB con 1 nodo master e 1 slave e CentOS8 come sistema operativo.
Come installare MaxScale
Supponiamo che tu abbia il tuo database MariaDB attivo e funzionante, e anche una macchina (virtuale o fisica) per installare MaxScale. Ti consigliamo di utilizzare un host diverso, quindi in caso di errore del master, MaxScale può eseguire il failover sul nodo slave, altrimenti MaxScale non può eseguire alcuna azione se il server su cui è in esecuzione si interrompe.
Ci sono diversi modi per installare MaxScale, in questo caso useremo i repository MariaDB. Per aggiungerlo al server MaxScale, devi eseguire:
$ curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
[info] Repository file successfully written to /etc/yum.repos.d/mariadb.repo
[info] Adding trusted package signing keys...
[info] Successfully added trusted package signing keys
Ora, installa il pacchetto MaxScale:
$ yum install maxscale
Ora hai installato il tuo nodo MaxScale, prima di iniziare devi configurarlo.
Come configurare MaxScale
Poiché MaxScale esegue attività come autenticazione, monitoraggio e altro, è necessario creare un utente del database con alcuni privilegi specifici:
MariaDB [(none)]> CREATE USER 'maxscaleuser'@'%' IDENTIFIED BY 'maxscalepassword';
MariaDB [(none)]> GRANT SELECT ON mysql.user TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SELECT ON mysql.db TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SELECT ON mysql.tables_priv TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SELECT ON mysql.roles_mapping TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT SHOW DATABASES ON *.* TO 'maxscaleuser'@'%';
MariaDB [(none)]> GRANT REPLICATION CLIENT on *.* to 'maxscaleuser'@'%';
Tieni presente che le versioni di MariaDB da 10.2.2 a 10.2.10 richiedono anche:
MariaDB [(none)]> GRANT SELECT ON mysql.* TO 'maxscaleuser'@'%';
Ora hai pronto l'utente del database, vediamo i file di configurazione. Quando installi MaxScale, il file maxscale.cnf verrà creato in /etc/. Esistono diverse variabili e diversi modi per configurarlo, quindi vediamo un esempio:
$ cat /etc/maxscale.cnf
# Global parameters
[maxscale]
threads = auto
log_augmentation = 1
ms_timestamp = 1
syslog = 1
# Server definitions
[server1]
type=server
address=192.168.100.126
port=3306
protocol=MariaDBBackend
[server2]
type=server
address=192.168.100.127
port=3306
protocol=MariaDBBackend
# Monitor for the servers
[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2
user=maxscaleuser
password=maxscalepassword
monitor_interval=2000
# Service definitions
[Read-Only-Service]
type=service
router=readconnroute
servers=server2
user=maxscaleuser
password=maxscalepassword
router_options=slave
[Read-Write-Service]
type=service
router=readwritesplit
servers=server1
user=maxscaleuser
password=maxscalepassword
# Listener definitions for the services
[Read-Only-Listener]
type=listener
service=Read-Only-Service
protocol=MariaDBClient
port=4008
[Read-Write-Listener]
type=listener
service=Read-Write-Service
protocol=MariaDBClient
port=4006
In questa configurazione abbiamo 2 nodi database, 192.168.100.126 (Master) e 192.168.100.127 (Slave), come puoi vedere nella sezione Definizione Server.
Abbiamo anche 2 diversi servizi, uno di sola lettura, dove c'è il nodo slave, e un altro di lettura-scrittura dove c'è il nodo master.
Infine, abbiamo 2 ascoltatori, uno per ogni servizio. Il listener di sola lettura, in ascolto sulla porta 4008, e quello di lettura-scrittura, in ascolto sulla porta 4006.
Questo è un file di configurazione di base. Se hai bisogno di qualcosa di più specifico puoi seguire la documentazione ufficiale di MariaDB.
Ora sei pronto per avviarlo, quindi esegui:
$ systemctl start maxscale.service
E controlla:
$ maxctrl list services
ff $ maxctrl list servers
Puoi trovare un elenco di comandi maxctrl qui, oppure puoi anche usare maxadmin per gestirlo.
Ora testiamo la connessione. Per questo, puoi provare ad accedere al tuo database usando l'indirizzo IP MaxScale e la porta che vuoi testare. Nel nostro caso, il traffico sulla porta 4006 dovrebbe essere inviato al server1 e il traffico sulla porta 4008 al server2.
$ mysql -h 192.168.100.128 -umaxscaleuser -pmaxscalepassword -P4006 -e 'SELECT @@hostname;'
+------------+
| @@hostname |
+------------+
| server1 |
+------------+
$ mysql -h 192.168.100.128 -umaxscaleuser -pmaxscalepassword -P4008 -e 'SELECT @@hostname;'
+------------+
| @@hostname |
+------------+
| server2 |
+------------+
Funziona!
Come distribuire MaxScale con ClusterControl
Vediamo ora come utilizzare ClusterControl per semplificare questa attività. Per questo, assumeremo che il tuo cluster MariaDB sia stato aggiunto a ClusterControl.
Vai a ClusterControl -> Seleziona il cluster MariaDB -> Azioni cluster -> Aggiungi Load Balancer -> MaxScale.
Qui puoi distribuire un nuovo nodo MaxScale o importarne uno esistente uno. Se lo stai distribuendo, devi aggiungere l'indirizzo IP o il nome host, le credenziali dell'amministratore e dell'utente MaxScale, la quantità di thread e le porte (scrittura e sola lettura). Puoi anche specificare quale nodo di database vuoi aggiungere alla configurazione di MaxScale.
Puoi monitorare l'attività nella sezione Attività ClusterControl. Al termine, avrai un nuovo nodo MaxScale nel tuo cluster MariaDB.
Ed eseguire i comandi MaxScale dall'interfaccia utente di ClusterControl senza dover accedere al server tramite SSH.
Sembra più facile che distribuirlo manualmente, giusto?
Conclusione
Avere un Load Balancer è una buona soluzione se vuoi bilanciare o dividere il tuo traffico, o anche per azioni di failover, e MaxScale, come prodotto MariaDB, è una buona opzione per i database MariaDB.
L'installazione è semplice, ma la configurazione e l'utilizzo potrebbero essere difficili se si tratta di qualcosa di nuovo per te. In tal caso, puoi utilizzare ClusterControl per distribuirlo, configurarlo e gestirlo in modo più semplice.