# MySQL Proxy

MySQL Proxy è un programma che si interpone fra un client e un server MySQL, per consentire di effettuare operazioni sul traffico di dati, in maniera trasparente per l'utente. MySQL Proxy usa il protocollo client/server esteso di MySQL, introdotto con la versione 4.1.

## Generalità

MySQL Proxy è un'applicazione molto leggera (200 KB in compilazione dinamica, 1.5 MB in compilazione statica con le librerie), che è stata disegnata per interporsi fra un client e un server MySQL ed eseguire operazioni sui pacchetti inviati e ricevuti. Il programma ha poche opzioni di configurazione. La caratteristica che lo rende interessante e funzionale è un interprete Lua integrato, grazie al quale è possibile analizzare ed eventualmente modificare i pacchetti passati fra client e server. Il client non si accorge del Proxy, che agisce da man in the middle. Il client si connette con le solite credenziali. Il Proxy intercetta la richiesta e si collega al server. Da quel momento, ogni query inviata dal client e i relativi risultati restituiti dal server passano attraverso il Proxy.
Si noti che MySQL Proxy non è un'applicazione di malware, anche se la definizione resa sopra, con la sua possibilità di intercettazione, potrebbe farlo credere. L'uso del Proxy è trasparente per il client, in materia di protocollo, ovvero il client usa il server tramite il Proxy senza avvertire differenze (tranne quando usa funzioni esplicitamente create per il Proxy). Ma il Proxy usa una porta diversa dal server, e pertanto, anche se l'uso è trasparente per l'applicazione, l'amministratore è conscio della sua esistenza. L'uso del Proxy senza consenso di una delle due parti non è possibile. Il Proxy può essere usato dall'amministratore, per ampliare le funzionalità del server, o dall'utente, per lo stesso motivo. Nel primo caso, il Proxy sarà visibile a tutti gli utenti. Nel secondo caso solo l'utente che l'ha installato nella sua macchina è al corrente delle funzioni estese.
Nella sua forma essenziale, MySQL Proxy è uno strumento di ridirezione, che passa un pacchetto di richiesta dal client al server, prende dal server i risultati, e li passa al client. Nel passaggio di dati, il Proxy può intervenire, ed effettuare operazioni sulla query prima che venga inviata, o sui risultati, prima che vengano restituiti. Le modifiche vengono effettuate tramite script in Lua, che usano funzioni predefinite per alterare lo stato dei pacchetti. Le funzioni sono le seguenti:
* connect_server in cui si può agire al momento della connessione al server;
* read_handshake che avviene immediatamente dopo la connessione;
* read_auth in cui si passano al server le credenziali di accesso;
* read_auth_result dove viene ricevuto il risultato dell'operazione precedente;
* read_query che si attiva per ogni query inviata al server;
* read_query_result che viene richiamata quando il Proxy riceve il risultato di una query modificata;
* disconnect_client che si attiva quando un client viene disconnesso.

## Funzioni

MySQL Proxy ha due classi di funzioni:
* Indirizzamento del traffico a una lista predefinita di server di back-end, che possono essere a sola lettura o a piena funzionalità.
* Modifica, aggiunta, o sostituzione della query inviata dal client, e dei risultati restituiti dal server.
Nel primo caso, il Proxy ha delle funzioni predefinite per gestire la caduta del server primario, e ridirigerla al server successivo nella lista. Può anche effettuare il bilanciamento di carico, la separazione fra query di lettura e scrittura fra vari server (per esempio master e slave in replicazione) e può anche gestire un pool di connessioni. Questa funzione richiede pochissima attività di manutenzione nella sua forma base. Per gestire i casi critici, è possibile intervenire con uno script Lua. Si tratta, peraltro, di un'applicazione ancora immatura (Settembre 2007), e pertanto da usare con cautela.

### Un esempio

Il secondo caso è differente. Per modificare la query in uscita o i risultati in entrata, è necessario scrivere un programma in Lua e lanciare il Proxy con un'opzione che lo fa caricare. Per esempio, questo script intercetta la query SELECT 1 e la riscrive come SELECT 100.

### Uso

Per usare questo script, si lancia il Proxy con l'apposita opzione
In questo esempio, se la query è SELECT 1, il Proxy inserisce la query modificata nella coda interna (proxy.queries) e la esegue.
Per usare il server tramite il Proxy, bisogna collegare il client alla porta del proxy (default: 4040)

### Potenzialità

Usando una combinazione di read_query e read_query_result, il Proxy può effettuare una o più delle seguenti operazioni:
* Passare la query al server senza modifiche (default);
* Modificare la query e passarla al server;
* Eseguire una o più query prima o dopo la query originale;
* Non eseguire la query e restituire un risultato (falso) coerente con la query. Per esempio, dopo un INSERT, viene restituito il numero di record modificati, anche se non è stato modificato alcun record;
* Non eseguire la query e restituire un risultato diverso da quello richiesto (per esempio, dopo un INSERT, restituire uno o più record);
* Non eseguire la query e restituire un messaggio di errore;
* Modificare il risultato originale inviato dal server;
* Sostituire il risultato del server con uno creato.
La lista qui sopra fa capire che il Proxy è uno strumento molto potente, con cui è possibile definire estensioni del linguaggio, filtrare query indesiderate, rendere l'applicazione sicura con il monitoraggio delle operazioni, e così via.

### Interfaccia di amministrazione

Quando MySQL Proxy è attivo, ci sono due porte disponibili:
* 4040 con le funzioni di proxy viste sopra.
* 4041 con le funzioni di amministrazione.
Entrambe le porte sono configurabili tramite opzioni di avvio.
Collegando il client alla porta 4041 si può richiedere lo stato delle connessioni e del Proxy.
L'interfaccia di amministrazione non riconosce altri comandi.