Nel precedente post del blog, abbiamo trattato 4 componenti di gestione di base utilizzando il client della riga di comando MaxCtrl. In questo post del blog, tratteremo la parte rimanente dei componenti MaxScale che sono comunemente usati in un cluster MariaDB:
- Gestione filtri
- Gestione MaxScale
- Gestione della registrazione
Tutti i comandi in questo post del blog sono basati su MaxScale 2.5.3.
Gestione filtri
Il filtro è un modulo in MaxScale che funge da motore di elaborazione e routing per un servizio MaxScale. Il filtraggio avviene tra la connessione client a MaxScale e la connessione MaxScale ai server di database back-end. Questo percorso (dal lato client di MaxScale verso i server di database effettivi) può essere considerato una pipeline, quindi è possibile inserire filtri in tale pipeline per monitorare, modificare, copiare o bloccare il contenuto che scorre attraverso di essa.
Esistono molti filtri che possono essere applicati per estendere le capacità di elaborazione di un servizio MaxScale, come mostrato nella tabella seguente:
Nome filtro | Descrizione |
Binlog | Replica selettivamente gli eventi di log binari su server slave combinati insieme a un servizio binlogrouter. |
Cache | Una cache semplice in grado di memorizzare nella cache il risultato di SELECT, in modo che i successivi SELECT identici siano serviti direttamente da MaxScale, senza che le query vengano instradate a nessuno server. |
Lettura critica coerente | Consente di eseguire letture critiche coerenti tramite MaxScale pur consentendo la scalabilità orizzontale di letture non critiche. |
Firewall database | Blocca le query che corrispondono a un insieme di regole. Questo filtro deve essere considerato una soluzione ottimale per la protezione da usi impropri accidentali piuttosto che da attacchi dannosi. |
Suggerimento | Aggiunge suggerimenti di instradamento a un servizio, indicando al router di instradare una query a un determinato tipo di server. |
Inserisci flusso | Converte gli inserimenti di massa in flussi di dati CSV che vengono consumati dal server back-end tramite il meccanismo LOAD DATA LOCAL INFILE |
Lua | Richiama un insieme di funzioni in uno script Lua. |
Mascheramento | Offusca il valore restituito di una particolare colonna |
Maxrows | Limitazione del numero di righe che un SELECT, un'istruzione preparata o una procedura memorizzata potrebbero restituire all'applicazione client. |
Server denominato | Indirizza le query ai server in base a corrispondenze di espressioni regolari (regex). |
Interroga registro tutto | Registra il contenuto della query in un file in formato CSV. |
Regex | Riscrive il contenuto della query utilizzando le corrispondenze di espressioni regolari e la sostituzione del testo. |
Tee | Fai copie delle richieste dal client e invia le copie a un altro servizio all'interno di MariaDB MaxScale. |
acceleratore | Sostituisce ed estende la funzionalità limit_queries del filtro Database Firewall |
Inizio | Controlla le prestazioni della query dell'istruzione SQL selezionata che passa attraverso il filtro. |
Monitoraggio delle prestazioni delle transazioni | Controlla ogni istruzione SQL che passa attraverso il filtro, raggruppata per transazione, per l'analisi delle prestazioni della transazione. |
Crea un filtro
Ogni filtro MaxScale ha il suo modo di essere configurato. In questo esempio, creeremo un filtro di mascheramento, per mascherare i nostri dati sensibili per la colonna "card_no" nella nostra tabella "credit_cards". Il mascheramento richiede un file di regole, scritto in formato JSON. Innanzitutto, crea una directory per ospitare i nostri file di regole:
$ mkdir /var/lib/maxscale/rules
Quindi, crea un file di testo:
$ vi /var/lib/maxscale/rules/masking.json
Specificare le righe come di seguito:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
Le semplici regole di cui sopra offuscheranno semplicemente l'output della colonna card_no per qualsiasi tabella, per proteggere i dati sensibili che devono essere visti dal client MariaDB.
Dopo aver creato il file delle regole, possiamo creare il filtro, utilizzando il seguente comando:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Si noti che alcuni filtri richiedono parametri diversi. Per quanto riguarda questo filtro di mascheratura, il parametro di base è "regole", dove dobbiamo specificare il file di regole di mascheratura creato in formato JSON.
Collega un filtro a un servizio
Un filtro può essere attivato solo allegandolo a un servizio. La modifica di un servizio esistente utilizzando MaxCtrl è supportata solo da alcuni parametri e l'aggiunta di un filtro non è uno di questi. Dobbiamo aggiungere il componente del filtro nel file di configurazione del servizio di MaxScale per allegare sostanzialmente il filtro. In questo esempio, applicheremo il filtro "Obfuscates-card" al nostro servizio round-robin esistente chiamato rr-service.
Vai alla directory /var/lib/maxscale/maxscale.cnf.d e trova rr-service.cnf, aprilo con un editor di testo e quindi aggiungi la seguente riga:
filters=Obfuscates-card
Per caricare la nuova modifica è necessario un riavvio di MaxScale:
$ systemctl restart maxscale
Per testare il filtro, utilizzeremo un client MariaDB e confronteremo l'output connettendoci a due diversi servizi. Il nostro servizio rw è collegato a un listener in ascolto sulla porta 3306, senza alcun filtro configurato. Quindi, dovremmo vedere la risposta non filtrata da MaxScale:
$ mysql -ucard_user -p -hmaxscale_host -p3306 -e "SELECT * FROM secure.credit_cards LIMIT 1"
+----+-----------+-----------------+-------------+-----------+---------+
| id | card_type | card_no | card_expiry | card_name | user_id |
+----+-----------+-----------------+-------------+-----------+---------+
| 1 | VISA | 425388910909238 | NULL | BOB SAGAT | 1 |
+----+-----------+-----------------+-------------+-----------+---------+
Quando ci si connette al listener rr-service sulla porta 3307, che è stata configurata con il nostro filtro, il nostro valore "card_no" viene offuscato da un output senza senso:
$ mysql -ucard_user -p -hmaxscale_host -p3307 -e "SELECT * FROM secure.credit_cards LIMIT 1"
+----+-----------+-----------------+-------------+-----------+---------+
| id | card_type | card_no | card_expiry | card_name | user_id |
+----+-----------+-----------------+-------------+-----------+---------+
| 1 | VISA | ~W~p[=&^M~5f~~M | NULL | BOB SAGAT | 1 |
+----+-----------+-----------------+-------------+-----------+---------+
Questo filtro viene eseguito da MaxScale, seguendo le regole di corrispondenza all'interno di masking.json che abbiamo creato in precedenza.
Elenco filtri
Per elencare tutti i filtri creati, usa il comando "elenca filtri":
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
Negli esempi precedenti, abbiamo creato 3 filtri. Tuttavia, solo il filtro della scheda Offuscate è collegato a un servizio.
Per mostrare tutti i servizi in dettaglio:
maxctrl: show filters
Oppure se vuoi mostrare un servizio particolare:
maxctrl: show filter Obfuscates-card
┌────────────┬──────────────────────────────────────────────────────┐
│ Filter │ Obfuscates-card │
├────────────┼──────────────────────────────────────────────────────┤
│ Module │ masking │
├────────────┼──────────────────────────────────────────────────────┤
│ Services │ rr-service │
├────────────┼──────────────────────────────────────────────────────┤
│ Parameters │ { │
│ │ "check_subqueries": true, │
│ │ "check_unions": true, │
│ │ "check_user_variables": true, │
│ │ "large_payload": "abort", │
│ │ "prevent_function_usage": true, │
│ │ "require_fully_parsed": true, │
│ │ "rules": "/var/lib/maxscale/rules/masking.json", │
│ │ "treat_string_arg_as_field": true, │
│ │ "warn_type_mismatch": "never" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Elimina un filtro
Per eliminare un filtro, è necessario prima scollegarsi dai servizi associati. Ad esempio, considera i seguenti filtri in MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
Per il filtro qla, possiamo semplicemente usare il seguente comando per eliminarlo:
maxctrl: destroy filter qla
OK
Tuttavia, per il filtro della scheda Obfuscates, deve essere scollegato con rr-service e, sfortunatamente, ciò richiede una modifica del file di configurazione e il riavvio di MaxScale. Vai alla directory /var/lib/maxscale/maxscale.cnf.d e trova rr-service.cnf, aprilo con un editor di testo e quindi rimuovi la seguente riga:
filters=Obfuscates-card
Puoi anche rimuovere la stringa "Offuscates-card" dalla riga sopra e lasciare che la riga "filtri" sia uguale a un valore vuoto. Quindi, salva il file e riavvia il servizio MaxScale per caricare le modifiche:
$ systemctl restart maxscale
Solo allora possiamo rimuovere il filtro della scheda Offuscate da MaxScale usando il comando "distruggi filtro":
maxctrl: destroy filter Obfuscates-card
OK
Gestione MaxScale
Elenca utenti
Per elencare tutti gli utenti MaxScale, utilizzare il comando "list users":
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Crea un utente MaxScale
Per impostazione predefinita, un utente creato è un utente di sola lettura:
maxctrl: create user dev mySecret
OK
Per creare un utente amministratore, specifica il comando --type=admin:
maxctrl: create user dba mySecret --type=admin
OK
Elimina un utente MaxScale
Per eliminare un utente, usa semplicemente il comando "distruggi utente":
maxctrl: destroy user dba
OK
L'ultimo utente amministrativo rimasto non può essere rimosso. Crea un utente amministrativo sostitutivo prima di tentare di rimuovere l'ultimo utente amministrativo.
Mostra parametri MaxScale
Per mostrare tutti i parametri caricati per l'istanza MaxScale, usa il comando "show maxscale":
maxctrl: show maxscale
┌──────────────┬──────────────────────────────────────────────────────────────────────┐
│ Version │ 2.5.3 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Commit │ de3770579523e8115da79b1696e600cce1087664 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Started At │ Mon, 21 Sep 2020 04:44:49 GMT │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Activated At │ Mon, 21 Sep 2020 04:44:49 GMT │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Uptime │ 1627 │
├──────────────┼──────────────────────────────────────────────────────────────────────┤
│ Parameters │ { │
│ │ "admin_auth": true, │
│ │ "admin_enabled": true, │
│ │ "admin_gui": true, │
│ │ "admin_host": "127.0.0.1", │
│ │ "admin_log_auth_failures": true, │
│ │ "admin_pam_readonly_service": null, │
│ │ "admin_pam_readwrite_service": null, │
│ │ "admin_port": 8989, │
│ │ "admin_secure_gui": true, │
│ │ "admin_ssl_ca_cert": null, │
│ │ "admin_ssl_cert": null, │
│ │ "admin_ssl_key": null, │
│ │ "auth_connect_timeout": 10000, │
│ │ "auth_read_timeout": 10000, │
│ │ "auth_write_timeout": 10000, │
│ │ "cachedir": "/var/cache/maxscale", │
│ │ "connector_plugindir": "/usr/lib/x86_64-linux-gnu/mysql/plugin", │
│ │ "datadir": "/var/lib/maxscale", │
│ │ "debug": null, │
│ │ "dump_last_statements": "never", │
│ │ "execdir": "/usr/bin", │
│ │ "language": "/var/lib/maxscale", │
│ │ "libdir": "/usr/lib/x86_64-linux-gnu/maxscale", │
│ │ "load_persisted_configs": true, │
│ │ "local_address": null, │
│ │ "log_debug": false, │
│ │ "log_info": false, │
│ │ "log_notice": false, │
│ │ "log_throttling": { │
│ │ "count": 0, │
│ │ "suppress": 0, │
│ │ "window": 0 │
│ │ }, │
│ │ "log_warn_super_user": false, │
│ │ "log_warning": false, │
│ │ "logdir": "/var/log/maxscale", │
│ │ "max_auth_errors_until_block": 10, │
│ │ "maxlog": true, │
│ │ "module_configdir": "/etc/maxscale.modules.d", │
│ │ "ms_timestamp": true, │
│ │ "passive": false, │
│ │ "persistdir": "/var/lib/maxscale/maxscale.cnf.d", │
│ │ "piddir": "/var/run/maxscale", │
│ │ "query_classifier": "qc_sqlite", │
│ │ "query_classifier_args": null, │
│ │ "query_classifier_cache_size": 0, │
│ │ "query_retries": 1, │
│ │ "query_retry_timeout": 5000, │
│ │ "rebalance_period": 0, │
│ │ "rebalance_threshold": 20, │
│ │ "rebalance_window": 10, │
│ │ "retain_last_statements": 0, │
│ │ "session_trace": 0, │
│ │ "skip_permission_checks": false, │
│ │ "sql_mode": "default", │
│ │ "syslog": true, │
│ │ "threads": 1, │
│ │ "users_refresh_interval": 0, │
│ │ "users_refresh_time": 30000, │
│ │ "writeq_high_water": 16777216, │
│ │ "writeq_low_water": 8192 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
Modifica i parametri MaxScale
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- admin_auth
- admin_log_auth_failures
- passivo
Il resto dei parametri deve essere impostato all'interno di /etc/maxscale.conf, che richiede un riavvio di MaxScale per applicare le nuove modifiche.
Guida grafica MaxScale
MaxGUI è un nuovo strumento basato su browser per la configurazione e la gestione di MaxScale, introdotto nella versione 2.5. È accessibile tramite la porta 8989 dell'host MaxScale sull'interfaccia localhost, 127.0.0.1. Per impostazione predefinita, è necessario impostare admin_secure_gui=true e configurare entrambi i parametri admin_ssl_key e admin_ssl_cert. Tuttavia, in questo post del blog, consentiremo la connettività tramite il semplice HTTP aggiungendo la seguente riga nella direttiva [maxctrl] all'interno di /etc/maxscale.cnf:
admin_secure_gui = false
Riavvia il servizio MaxScale per caricare la modifica:
$ systemctl restart maxscale
Poiché la GUI è in ascolto sull'interfaccia localhost, possiamo utilizzare il tunneling SSH per accedere alla GUI dalla nostra workstation locale:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Quindi, apri un browser web, punta l'URL a http://127.0.0.1:8989/ e accedi. MaxGUI usa le stesse credenziali di maxctrl, quindi la password predefinita è "admin" con la password "mariadb". Per motivi di sicurezza, è necessario creare un nuovo utente amministratore con una password più forte specificatamente per questo scopo. Una volta effettuato l'accesso, dovresti vedere la dashboard di MaxGUI come di seguito:
La maggior parte dei comandi di gestione di MaxCtrl che abbiamo mostrato in questa serie di blog possono essere eseguito direttamente da questa GUI. Se fai clic sul pulsante "Crea nuovo", ti verrà presentata la seguente finestra di dialogo:
Come puoi vedere, tutti i componenti importanti di MaxScale possono essere gestiti direttamente dalla GUI, con un aspetto pulito e intuitivo, rende le cose molto più semplici e dirette da gestire. Ad esempio, l'associazione di un filtro può essere eseguita direttamente dall'interfaccia utente, senza la necessità di riavviare il servizio MaxScale, come mostrato nella sezione "Allega un filtro a un servizio" in questo post del blog.
Per ulteriori informazioni su questa nuova GUI, consulta questa guida MaxGUI.
Gestione registrazione
Mostra parametri di registrazione
Per visualizzare i parametri di registrazione, utilizzare il comando "mostra registrazione":
maxctrl: show logging
┌────────────────────┬────────────────────────────────┐
│ Current Log File │ /var/log/maxscale/maxscale.log │
├────────────────────┼────────────────────────────────┤
│ Enabled Log Levels │ alert │
│ │ error │
│ │ warning │
│ │ notice │
├────────────────────┼────────────────────────────────┤
│ Parameters │ { │
│ │ "highprecision": true, │
│ │ "log_debug": false, │
│ │ "log_info": false, │
│ │ "log_notice": true, │
│ │ "log_warning": true, │
│ │ "maxlog": true, │
│ │ "syslog": true, │
│ │ "throttling": { │
│ │ "count": 10, │
│ │ "suppress_ms": 10000, │
│ │ "window_ms": 1000 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Modifica parametri di registrazione
Tutti i parametri di registrazione mostrati sopra possono essere configurati tramite il comando MaxCtrl in runtime. Ad esempio, possiamo attivare log_info usando il comando "alter logging":
maxctrl: alter logging log_info true
Ruota registri
Per impostazione predefinita, MaxScale fornisce un file di configurazione di rotazione del registro in /etc/logrotate.d/maxscale_logrotate. In base alla configurazione della rotazione dei registri, il file di registro viene ruotato mensilmente e utilizza il comando "ruota registri" di MaxCtrl. Possiamo forzare la rotazione del registro in modo che avvenga immediatamente con il seguente comando:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Verifica con il seguente comando:
$ ls -al /var/log/maxscale/
total 1544
drwxr-xr-x 2 maxscale maxscale 4096 Sep 21 05:53 ./
drwxrwxr-x 10 root syslog 4096 Sep 20 06:25 ../
-rw-r--r-- 1 maxscale maxscale 75 Sep 21 05:53 maxscale.log
-rw-r--r-- 1 maxscale maxscale 253250 Sep 21 05:53 maxscale.log.1
-rw-r--r-- 1 maxscale maxscale 1034364 Sep 18 06:25 maxscale.log.2
-rw-r--r-- 1 maxscale maxscale 262676 Aug 1 06:25 maxscale.log.3
Conclusione
Abbiamo raggiunto la fine della serie di distribuzione e gestione di MaxScale utilizzando il client MaxCtrl. In questa serie di blog, abbiamo utilizzato un paio di versioni diverse di MaxScale più recenti (relative alla data di scrittura) e abbiamo riscontrato molti miglioramenti significativi in ogni versione.
Complimenti al team di MariaDB MaxScale per il duro lavoro nel rendere MaxScale uno dei migliori strumenti di bilanciamento del carico del database sul mercato.