MySQL Proxy

MySQL Proxy
software
GenereSoftware per basi di dati
SviluppatoreMySQL AB
Ultima versione0.6.0 (6 settembre 2007)
Sistema operativoMultipiattaforma
LinguaggioC
LicenzaGNU GPL
(licenza libera)
Sito webdev.mysql.com

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:

Funzioni

MySQL Proxy ha due classi di funzioni:

  1. Indirizzamento del traffico a una lista predefinita di server di back-end, che possono essere a sola lettura o a piena funzionalità.
  2. 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.

-- simple.lua
function read_query(packet)
  if packet:byte() ~= proxy.COM_QUERY then
    return
  end
  local query = packet:sub(2)
  if query:lower() == 'select 1' then
    query = 'SELECT 100'
    proxy.queries:append(1, string.char(proxy.COM_QUERY) .. query)
    return proxy.PROXY_SEND_QUERY
  end
end

Uso

Per usare questo script, si lancia il Proxy con l'apposita opzione

mysql_proxy—proxy-lua-script=simple.lua

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)

$ mysql -u UTENTE -pPASSWORD -h 127.0.0.1 -P 4040
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 609
Server version: 5.0.45-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql > SELECT 1;
+-----+
| 100 |
+-----+
| 100 |
+-----+
1 row in set (0.00 sec)

Potenzialità

Usando una combinazione di read_query e read_query_result, il Proxy può effettuare una o più delle seguenti operazioni:

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:

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.

$ mysql -u UTENTE -pPASSWORD -h 127.0.0.1 -P 4041
mysql> select * from help;
+---------------------------------+--------------------------------------------+
| command                         | description                                |
+---------------------------------+--------------------------------------------+
| select * from proxy_connections | show information about proxy connections   |
| select * from proxy_config      | show information about proxy configuration |
| select * from help              | show the available commands                |
+---------------------------------+--------------------------------------------+
3 rows in set (0.00 sec)
mysql> select * from proxy_connections;
+------+--------+-------+------+
| id   | type   | state | db   |
+------+--------+-------+------+
|    0 | server | 0     |      |
|    1 | proxy  | 0     |      |
|    2 | server | 10    |      |
|    3 | proxy  | 10    |      |
|    4 | proxy  | 10    |      |
+------+--------+-------+------+
5 rows in set (0.00 sec)
mysql> select * from proxy_config;
+----------------------------+----------------+
| option                     | value          |
+----------------------------+----------------+
| admin.address              | :4041          |
| proxy.address              | :4040          |
| proxy.lua_script           | logs.lua       |
| proxy.backend_addresses[0] | 127.0.0.1:3306 |
| proxy.fix_bug_25371        | 0              |
| proxy.profiling            | 1              |
+----------------------------+----------------+
6 rows in set (0.00 sec)

L'interfaccia di amministrazione non riconosce altri comandi.

mysql> select * from mia_tabella;
ERROR 1105 (07000): booh

Voci correlate

Collegamenti esterni

  Portale Software libero: accedi alle voci di Wikipedia che trattano di Software libero