MySQL Router

MySQL Router e' il tool che sostituisce funzionalmente MySQL Proxy che, come il nome suggerisce, era un proxy di un server MySQL ora non piu' supportato.
MySQL Router non ha un linguaggio di programmazione come MySQL Proxy ma utilizza semplici direttive contenute in file di configurazione ed e' facilmente utilizzabile per indirizzare gli accessi verso un database MySQL in replica.

MySQL Router e' uno dei componenti dell'architettura dell'InnoDB Cluster.

Il documento e' aggiornato alla versione 2.1.3, versione disponibile al momento del rilascio in GA di InnoDB Cluster [NdE 12 Aprile 2017].

Nel seguito sono riportate alcune informazioni di interesse organizzate in paragrafi specifici: Introduzione, Configurazione, Avvio, Utilizzo, ...

Introduzione

MySQL Router con InnoDB Cluster MySQL Router e' un tool che opera come proxy di un server MySQL.
In pratica un utente o un'applicazione si collegano a MySQL Router come se dovessero connettersi ad server MySQL e vengono rediretti ai server MySQL definiti nel file di configurazione di MySQL Router.

E' possibile installare MySQL Router su qualsiasi sistema ma la configurazione consigliata, per diminuire la latenza e fornire il massimo dell'affidabilita', e' quella di installarlo sugli Application Server.

Sono disponibili diverse modalita' di routing adatte alle connessioni in scrittura/lettura o in sola lettura come spesso avviene nelle configurazioni di MySQL in replica.

Configurazione

Effettuata l'installazione, che generalmente viene svolta copiando i binari relativi alla piattaforma utilizzata o utilizzando i repository scaricati dal sito ufficiale, e' necessario effettuare la configurazione. Il file di configurazione di default e' /etc/mysqlrouter/mysqlrouter.conf [NdA era .ini fino alla versione 2.0] e contiene le semplici direttive di impostazione di SQL Router.
Ecco la configurazione per effettuare una redirect:

[DEFAULT]
logging_folder=/opt/routers/myrouter/log
runtime_folder=/opt/routers/myrouter/run
data_folder=/opt/routers/myrouter/data
keyring_path=/opt/routers/router/data/keyring
master_key_path=/opt/routers/myrouter/mysqlrouter.key

[logger]
level = INFO

[routing:basic_redirect]
bind_address = 0.0.0.0
bind_port = 3307
mode = read-write
destinations = db1:3306,db3:3306,db3:3306

Con questa configurazione MySQL Router risulta in ascolto sulla porta 3307 e ridirige verso 3 diversi nodi che ospitano un database MySQL attivo sulla porta 3306.

Per ottenere un livello maggiore di logging e' possibile impostare il relativo parametro level = DEBUG. Il parametro mode determina la schedulazione: nel caso read-only viene utilizzato il round-robin mentre con il valore read-write viene utilizzato il first-availabile. Quando il parametro bind_address e' impostato a 0.0.0.0 il proxy e' in ascolto su tutti gli indirizzi; per accettare connessioni solo da un IP o da localhost basta indicare l'IP desiderato.

Piu' complessa e' la configurazione necessaria per operare con MySQL InnoDB Cluster ma in questo caso si utilizza il comando di bootstrap [NdA funzionalita' introdotta dalla versione 2.1] per far generare automaticamente la configurazione:

mysqlrouter --bootstrap root:xxx@db1.xenialab.it:3306 --user=mysqlrouter Bootstrapping system MySQL Router instance... ... Classic MySQL protocol connections to cluster 'myCluster': - Read/Write Connections: localhost:6446 - Read/Only Connections: localhost:6447 X protocol connections to cluster 'myCluster': - Read/Write Connections: localhost:64460 - Read/Only Connections: localhost:64470

La configurazione creata e' la seguente:

# File automatically generated during MySQL Router bootstrap
[DEFAULT]
name=system
user=mysqlrouter
logging_folder=/opt/routers/myrouter/log
runtime_folder=/opt/routers/myrouter/run
data_folder=/opt/routers/myrouter/data
keyring_path=/opt/routers/router/data/keyring
master_key_path=/opt/routers/myrouter/mysqlrouter.key

[logger]
level = DEBUG

[metadata_cache:myCluster]
router_id=3
bootstrap_server_addresses=mysql://db01.xenialab.it:3306,mysql://db02.xenialab.it:3306,mysql://db03.xenialab.it:3306
user=mysql_router3_xxxxxxxxxxxx
metadata_cluster=myCluster
ttl=300

[routing:myCluster_default_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://myCluster/default?role=PRIMARY
mode=read-write
protocol=classic

[routing:myCluster_default_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://myCluster/default?role=SECONDARY
mode=read-only
protocol=classic

[routing:myCluster_default_rr]
bind_address=0.0.0.0
bind_port=6448
destinations=metadata-cache://myCluster/default?role=ALL
mode=read-only
protocol=classic

[routing:myCluster_default_x_rw]
bind_address=0.0.0.0
bind_port=64460
destinations=metadata-cache://myCluster/default?role=PRIMARY
mode=read-write
protocol=x

[routing:myCluster_default_x_ro]
bind_address=0.0.0.0
bind_port=64470
destinations=metadata-cache://myCluster/default?role=SECONDARY
mode=read-only
protocol=x

La configurazione generata dal comando di boostrap e' completa e puo' essere utilizzata senza variazioni semplicemente attivando il proxy con:
 nohup mysqlrouter &

Nel caso di configurazione Multi Primary la configurazione ricavata e' leggermente piu' semplice: sono presenti solo le sezioni di routing read-write.

E' possibile utilizzare il parametro --directory in fase di bootstrap e --config (ed anche --extra-config) i fase di esecuzione per definire piu' configurazioni ed istanze di MySQL Router.

Attivazione MySQL Router

Anche se e' possibile attivare manualmente MySQL Router e' consigliabile attivarlo come servizio. Su RH/OL/CentOS 7.x i comandi sono:

systemctl enable mysqlrouter systemctl start mysqlrouter

Utilizzo

Connettersi ad un database MySQL utilizzando MySQL Router e' banale:

mysql --user=root -p --host=127.0.0.1 --port=6446

Per determinare su quale DB si e' stati indirizzati e' possibile utilizzare questa semplice query:

select @@hostname, @@port;

Varie ed eventuali

Il sito ufficiale MySQL contiene tutta la relativa documentazione; e' utile anche la documentazione relativa alla mysqlsh.


Titolo: MySQL Router
Livello: Avanzato (3/5)
Data: 1 Aprile 2016
Versione: 1.0.1 - 12 Aprile 2017
Autore: mail [AT] meo.bogliolo.name