MySQL InnoDB Cluster in Sandbox

InnoDB Cluster fornisce una soluzione completa per rendere disponibile un database MySQL in alta affidabilita' sfruttando la tecnica della replica virtualmente sincrona.

Tra le diverse modalita' di configurazione disponibili l'installazione in Sandbox, descritta in questo documento, ha una modalita' di installazione semplificata molta adatta per provare tale nuova tecnologia.

La configurazione in Sandbox non e' adatta ad un ambiente di produzione ma e' utile per creare ambienti di laboratorio o di test.

InnoDB Cluster

InnoDB Cluster InnoDB Cluster si basa su tre componenti: il database MySQL configurato in Group Replication che mantiene i dati accessibili via SQL, il componente MySQL Router che si occupa di indirizzare le connessioni applicative e l'interfaccia di amministrazione MySQL Shell.

Per amministrare il cluster si utilizza MySQL Shell ed in particolare le AdminAPI che consentono di creare e gestire il cluster con semplici comandi JavaScript.

Il numero dei nodi e' dinamico: puo' variare in caso di fault, per attivita' amministrative, durante gli upgrade, quando si inseriscono nuove istanze nel cluster, ... Anche lo stato delle istanze e' variabile: nella configurazione Single-Primary solo un nodo e' accessibile in scrittura (R/W) mentre gli altri sono attivi in super-read-only (R/O); nella configurazione Multi-Primary tutti i nodi sono accessibili in scrittura (R/W). Lo stato puo' cambiare in caso di fault, quando un'istanza si connette al cluster deve recuperare le transazioni dagli altri nodi e benche' attiva potrebbe non essere allineata, ...

Per accedere al cluster le applicazioni utilizzano MySQL Router che le indirizza sempre al DB corretto. Da MySQL Router sono rese disponibili due differenti porte: una per le connessioni in RW (lettura/scrittura) e l'altra per le connessioni in RO (Read Only). Le applicazioni si collegano alla porta fornita da MySQL Router come se si trattasse di un normale DB MySQL e vengono connesse in modo trasparente al nodo corretto del cluster. Nel caso di caduta di un nodo il cluster si occupa di ogni attivita' senza che sia necessario l'intervento manuale di un DBA.

In una configurazione tradizionale le istanze che compongono il cluster sono ospitate su nodi differenti in configurazione share nothing. Con una configurazione in Sandbox le istanze sono ospitate sullo stesso sistema, condividono il software di base ma utilizzano porte e data-directory differenti.

Configurazione in Sandbox

Per creare istanze sandbox di MySQL ed un cluster sul sistema locale si utilizza la MySQL Shell. Ecco i semplici comandi da eseguire:

$ mysqlsh var dbPass = shell.prompt('Inserire la password di root MySQL: ', {type:"password"}); dba.deploySandboxInstance(3310, {password: dbPass}); dba.deploySandboxInstance(3320, {password: dbPass}); dba.deploySandboxInstance(3330, {password: dbPass}); shell.connect('root@localhost:3310', dbPass); var cluster = dba.createCluster("myCluster"); cluster.addInstance({user: "root", host: "localhost", port: 3320, password: dbPass}); cluster.addInstance({user: "root", host: "localhost", port: 3330, password: dbPass});

E' ora necessario configurare MySQL Router. Basta un comando:
  mysqlrouter --bootstrap root:xxx@localhost:3310 --user=mysqlrouter

Quando viene attivato il router con:
  nohup mysqlrouter &
vengono rese disponibili alle applicazioni/utenti due porte per la connessione al database: 6446 (R/W) e 6447 (R/O).

La configurazione di default e' Single-Primary ma e' possibile anche creare il cluster in modalita' Multi-Primary o utilizzare configurazioni custom.
I tre database MySQL vengono mantenuti sincronizzati con i GTID della Group Replication e si comportano come tre nodi distinti, il Router si occupa di instradare gli accessi alle istanze attive.

Naturalmente poiche' viene mantenuto tutto sullo stesso server la configurazione in Sandbox non ha funzioni di HA (High Availability).
Come gia' riportato la configurazione in sandbox non e' adatta per un deploy in produzione.

Utilizzo di MySQL InnoDB Cluster Sandbox

MySQL InnoDB Cluster Sandbox Architecture Per collegarsi al cluster basta utilizzare una delle porte fornite dal router e si viene reindirizzati sull'istanza corretta:

$ mysql --user=root -p --host=127.0.0.1 --port=6446 mysql> select @@hostname, @@port; +------------------------+--------+ | @@hostname | @@port | +------------------------+--------+ | xeniadb01.xenialab.it | 3310 | +------------------------+--------+

E' facile creare, cancellare, attivare, ... le istanze locali della sandbox. Sono comandi molto utili per giocare con il cluster:

dba.deploySandboxInstance(3333) dba.killSandboxInstance(3310) dba.startSandboxInstance(3310) dba.stopSandboxInstance(3320) dba.deleteSandboxInstance(3320)

Naturalmente la parte interessante e' variare lo stato del cluster e controllare cosa succede collegandosi sulla porta del MySQL Router o sulle istanze MySQL.

Come funzionano le sandbox? TL;DR!

Le istanze in sandbox sono realizzate in modo semplice.

Nella home directory dell'utente che ha creato la sandbox (che non e' necessariamente l'utente mysql) viene creata la directory mysql-sandboxes ed una sottodirectory con il numero della porta scelta nella creazione dell'istanza.
All'interno di tale directory si trovano gli script start.sh e stop.sh (dall'ovvio significato), il file my.cnf, la data directory dell'istanza ed una directory con gli eseguibili.
La struttura della data directory di un'istanza in sandbox e' standard: una directory per ogni database, error.log, ...

Quando si esegue il comando dba.startSandboxInstance oppure si lancia lo script start.sh viene avviato il relativo processo:

demo 6969 1 0 Nov01 ? 00:15:53 /home/demo/mysql-sandboxes/3310/mysqld --defaults-file=/home/demo/mysql-sandboxes/3310/my.cnf

In questo modo e' possibile avere piu' istanze attive sullo stesso sistema che rispondono a porte diverse, ciascuna con un propria configurazione ed un proprio insieme di dati.

Varie ed eventuali

Questo documento contiene maggiori informazioni sul MySQL InnoDB Cluster.
Altre configurazioni alternative con le sandbox sono riportate in questo documento [NdA in inglese].

La documentazione ufficiale su InnoDB Cluster e' disponibile sul sito MySQL che contiene anche i dettagli sulla configurazione in Sandbox.


Titolo: MySQL InnoDB Cluster in Sandobox
Livello: Medio (2/5)
Data: 12 Aprile 2017
Versione: 1.0.1 - 1 Novembre 2017
Autore: mail [AT] meo.bogliolo.name