In de vorige blogpost hebben we 4 basisbeheercomponenten behandeld met behulp van de MaxCtrl-opdrachtregelclient. In deze blogpost gaan we het resterende deel van de MaxScale-componenten behandelen die vaak worden gebruikt in een MariaDB-cluster:
- Filterbeheer
- MaxScale-beheer
- Logboekbeheer
Alle opdrachten in deze blogpost zijn gebaseerd op MaxScale 2.5.3.
Filterbeheer
Het filter is een module in MaxScale die fungeert als de verwerkings- en routeringsengine voor een MaxScale-service. Het filteren gebeurt tussen de clientverbinding met MaxScale en de MaxScale-verbinding met de backend-databaseservers. Dit pad (de clientzijde van MaxScale naar de eigenlijke databaseservers) kan worden beschouwd als een pijplijn, filters kunnen vervolgens in die pijplijn worden geplaatst om de inhoud die er doorheen stroomt te bewaken, wijzigen, kopiëren of blokkeren.
Er zijn veel filters die kunnen worden toegepast om de verwerkingsmogelijkheden van een MaxScale-service uit te breiden, zoals weergegeven in de volgende tabel:
Filternaam
Beschrijving
Binlog
Repliceert selectief de binaire loggebeurtenissen naar slave-servers in combinatie met een binlogrouter-service.
Cache
Een eenvoudige cache die het resultaat van SELECT's kan cachen, zodat daaropvolgende identieke SELECT's rechtstreeks door MaxScale worden bediend, zonder dat de query's naar een server.
Consistent kritisch lezen
Maakt consistente kritische leesbewerkingen mogelijk via MaxScale, terwijl scale-out van niet-kritieke leesbewerkingen nog steeds mogelijk is.
Database-firewall
Blokkeert zoekopdrachten die overeenkomen met een set regels. Dit filter moet worden gezien als een best-effort-oplossing die bedoeld is om te beschermen tegen onbedoeld misbruik in plaats van kwaadaardige aanvallen.
Hint
Voegt routeringshints toe aan een service en instrueert de router om een query naar een bepaald type server te routeren.
Stream invoegen
Converteert bulk-inserts in CSV-gegevensstromen die worden gebruikt door de backend-server via het LOAD DATA LOCAL INFILE-mechanisme
Lua
Roept een set functies in een Lua-script aan.
Masker
Verdoezelt de geretourneerde waarde van een bepaalde kolom
Maxrows
Beperking van het aantal rijen dat een SELECT, een voorbereide instructie of opgeslagen procedure kan retourneren naar de clienttoepassing.
Named Server
Routeert zoekopdrachten naar servers op basis van reguliere expressie (regex) overeenkomsten.
Alle querylogboeken
Hiermee wordt de query-inhoud in CSV-indeling in een bestand vastgelegd.
Regex
Herschrijft query-inhoud met behulp van reguliere expressie-overeenkomsten en tekstvervanging.
T-shirt
Maak kopieën van verzoeken van de client en stuur de kopieën naar een andere service binnen MariaDB MaxScale.
Gashendel
Vervangt en breidt de limit_queries-functionaliteit van het Database Firewall-filter uit
Bovenaan
Bewaakt de queryprestaties van de geselecteerde SQL-instructie die door het filter gaat.
Controle van transactieprestaties
Bewaakt elke SQL-instructie die door het filter gaat, gegroepeerd per transactie, voor analyse van transactieprestaties.
Een filter maken
Elk MaxScale-filter heeft zijn eigen manier om te worden geconfigureerd. In dit voorbeeld gaan we een maskeerfilter maken om onze gevoelige gegevens voor kolom "card_no" in onze tabel "credit_cards" te maskeren. Masking vereist een regelbestand, geschreven in JSON-indeling. Maak eerst een map om onze regelbestanden te hosten:
$ mkdir /var/lib/maxscale/rules
Maak vervolgens een tekstbestand:
$ vi /var/lib/maxscale/rules/masking.json
Specificeer de regels zoals hieronder:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
De bovenstaande eenvoudige regels verdoezelen eenvoudig de uitvoer van column card_no voor alle tabellen, om de gevoelige gegevens te beschermen die door de MariaDB-client kunnen worden gezien.
Nadat het regelbestand is gemaakt, kunnen we het filter maken met behulp van de volgende opdracht:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Merk op dat sommige filters andere parameters vereisen. Wat dit maskeringsfilter betreft, is de basisparameter "regels", waarbij we het gemaakte maskeringsregelbestand in JSON-indeling moeten specificeren.
Een filter aan een service koppelen
Een filter kan alleen worden geactiveerd door deze aan een dienst te koppelen. Het wijzigen van een bestaande service met MaxCtrl wordt alleen ondersteund door enkele parameters, en het toevoegen van een filter is daar niet een van. We moeten het filteronderdeel toevoegen onder het serviceconfiguratiebestand van MaxScale om het filter in feite te bevestigen. In dit voorbeeld gaan we het filter "Obfuscates-card" toepassen op onze bestaande round-robin-service genaamd rr-service.
Ga naar de map /var/lib/maxscale/maxscale.cnf.d en zoek rr-service.cnf, open het met een teksteditor en voeg de volgende regel toe:
filters=Obfuscates-card
Een MaxScale-herstart is vereist om de nieuwe wijziging te laden:
$ systemctl restart maxscale
Om het filter te testen, gebruiken we een MariaDB-client en vergelijken we de uitvoer door verbinding te maken met twee verschillende services. Onze rw-service is gekoppeld aan een luisteraar die luistert op poort 3306, zonder dat er filters zijn geconfigureerd. Daarom zouden we het ongefilterde antwoord van de MaxScale moeten zien:
$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Wanneer u verbinding maakt met de rr-service-listener op poort 3307, die is geconfigureerd met ons filter, wordt onze "card_no"-waarde versluierd met een wartaal-uitvoer:
$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Deze filtering wordt uitgevoerd door MaxScale, volgens de overeenkomende regels in masking.json die we eerder hebben gemaakt.
Lijstfilters
Gebruik de opdracht "lijst filters" om alle gemaakte filters weer te geven:
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
In de bovenstaande voorbeelden hebben we 3 filters gemaakt. Alleen het filter van de Obfuscates-kaart is echter aan een dienst gekoppeld.
Om alle services in detail weer te geven:
maxctrl: show filters
Of als u een bepaalde dienst wilt laten zien:
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" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Een filter verwijderen
Om een filter te verwijderen, moet men eerst ontkoppelen van de bijbehorende services. Overweeg bijvoorbeeld de volgende filters in MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
Voor het qla-filter kunnen we eenvoudig de volgende opdracht gebruiken om het te verwijderen:
maxctrl: destroy filter qla
OK
Voor de Obfuscates-kaartfilter moet deze echter worden ontkoppeld met rr-service en helaas vereist dit een wijziging van het configuratiebestand en een herstart van MaxScale. Ga naar de map /var/lib/maxscale/maxscale.cnf.d en zoek rr-service.cnf, open het met een teksteditor en verwijder de volgende regel:
filters=Obfuscates-card
Je zou ook de "Obfuscates-card" string uit de bovenstaande regel kunnen verwijderen en de regel "filters" gelijk kunnen stellen aan een lege waarde. Sla vervolgens het bestand op en start de MaxScale-service opnieuw om de wijzigingen te laden:
$ systemctl restart maxscale
Alleen dan kunnen we het Obfuscates-kaartfilter uit MaxScale verwijderen met het commando "destroy filter":
maxctrl: destroy filter Obfuscates-card
OK
MaxScale-beheer
Gebruikerslijst
Gebruik de opdracht "list users" om alle MaxScale-gebruikers weer te geven:
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Maak een MaxScale-gebruiker
Standaard is een aangemaakte gebruiker een alleen-lezen gebruiker:
maxctrl: create user dev mySecret
OK
Om een administrator-gebruiker aan te maken, specificeert u het --type=admin commando:
maxctrl: create user dba mySecret --type=admin
OK
Een MaxScale-gebruiker verwijderen
Om een gebruiker te verwijderen, gebruik je gewoon de opdracht "gebruiker vernietigen":
maxctrl: destroy user dba
OK
De laatst overgebleven beheerder kan niet worden verwijderd. Maak een vervangende gebruiker met beheerdersrechten aan voordat u probeert de laatste gebruiker met beheerdersrechten te verwijderen.
Toon MaxScale-parameters
Gebruik de opdracht "show maxscale" om alle geladen parameters voor de MaxScale-instantie weer te geven:
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 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
MaxScale-parameters wijzigen
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- admin_auth
- admin_log_auth_failures
- passief
De rest van de parameters moet worden ingesteld in /etc/maxscale.conf, wat een herstart van MaxScale vereist om de nieuwe wijzigingen toe te passen.
MaxScale GUI
MaxGUI is een nieuwe browsergebaseerde tool voor het configureren en beheren van MaxScale, geïntroduceerd in versie 2.5. Het is toegankelijk via poort 8989 van de MaxScale-host op de localhost-interface, 127.0.0.1. Het is standaard vereist om admin_secure_gui=true in te stellen en zowel de parameters admin_ssl_key als admin_ssl_cert te configureren. In deze blogpost gaan we echter connectiviteit via de gewone HTTP toestaan door de volgende regel toe te voegen onder [maxctrl]-richtlijn in /etc/maxscale.cnf:
admin_secure_gui = false
Start de MaxScale-service opnieuw om de wijziging te laden:
$ systemctl restart maxscale
Omdat de GUI luistert op de localhost-interface, kunnen we SSH-tunneling gebruiken om toegang te krijgen tot de GUI vanaf ons lokale werkstation:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Open vervolgens een webbrowser, verwijs de URL naar http://127.0.0.1:8989/ en log in. MaxGUI gebruikt dezelfde inloggegevens als maxctrl, dus het standaardwachtwoord is "admin" met het wachtwoord "mariadb". Om veiligheidsredenen moet men speciaal voor dit doel een nieuwe admin-gebruiker maken met een sterker wachtwoord. Nadat u bent ingelogd, ziet u het MaxGUI-dashboard zoals hieronder:
De meeste MaxCtrl-beheeropdrachten die we in deze blogreeks hebben laten zien, kunnen rechtstreeks vanuit deze GUI worden uitgevoerd. Als u op de knop "Nieuwe maken" klikt, krijgt u het volgende dialoogvenster te zien:
Zoals u kunt zien, kunnen alle belangrijke MaxScale-componenten direct worden beheerd vanuit de GUI, met een mooie intuïtieve, strakke uitstraling, maakt dingen veel eenvoudiger en eenvoudiger te beheren. Het koppelen van een filter kan bijvoorbeeld rechtstreeks vanuit de gebruikersinterface worden gedaan, zonder dat de MaxScale-service opnieuw hoeft te worden gestart, zoals wordt weergegeven in het gedeelte 'Een filter aan een service koppelen' in deze blogpost.
Bekijk deze MaxGUI-gids voor meer informatie over deze nieuwe GUI.
Logboekbeheer
Toon logboekparameters
Gebruik de opdracht "show logging" om de logparameters weer te geven:
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 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Logboekparameters bewerken
Alle logparameters zoals hierboven weergegeven, kunnen tijdens runtime worden geconfigureerd via de opdracht MaxCtrl. We kunnen bijvoorbeeld de log_info aanzetten door het "alter logging" commando te gebruiken:
maxctrl: alter logging log_info true
Logboeken roteren
Standaard biedt de MaxScale een configuratiebestand voor het roteren van logbestanden onder /etc/logrotate.d/maxscale_logrotate. Op basis van de logrotatieconfiguratie wordt het logbestand maandelijks geroteerd en maakt het gebruik van MaxCtrl's "rotate logs"-commando. We kunnen de logrotatie onmiddellijk forceren met het volgende commando:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Verifieer met het volgende commando:
$ 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
Conclusie
We zijn aan het einde gekomen van de reeks van MaxScale-implementatie en -beheer met behulp van de MaxCtrl-client. In deze blogreeks hebben we een aantal verschillende nieuwste MaxScale-versies gebruikt (ten opzichte van de opschrijfdatum) en we hebben in elke versie veel significante verbeteringen gezien.
Een pluim voor het MariaDB MaxScale-team voor hun harde werk om van MaxScale een van de beste load balancer-tools voor databases op de markt te maken.