I det forrige blogindlæg har vi dækket 4 grundlæggende administrationskomponenter ved hjælp af MaxCtrl-kommandolinjeklienten. I dette blogindlæg vil vi dække den resterende del af MaxScale-komponenterne, som almindeligvis bruges i en MariaDB-klynge:
- Filterstyring
- MaxScale-styring
- Logføringsstyring
Alle kommandoerne i dette blogindlæg er baseret på MaxScale 2.5.3.
Filterstyring
Filteret er et modul i MaxScale, der fungerer som behandlings- og routingmotor for en MaxScale-tjeneste. Filtreringen sker mellem klientforbindelsen til MaxScale og MaxScale-forbindelsen til backend-databaseserverne. Denne sti (klientsiden af MaxScale ud til de faktiske databaseservere) kan betragtes som en pipeline, filtre kan derefter placeres i den pipeline for at overvåge, ændre, kopiere eller blokere indholdet, der flyder igennem den.
Der er mange filtre, der kan anvendes til at udvide behandlingsmulighederne for en MaxScale-tjeneste, som vist i følgende tabel:
Filternavn | Beskrivelse |
Binlog | Replikerer selektivt de binære loghændelser til slaveservere kombineret med en binlogrouter-tjeneste. |
Cache | En simpel cache, der er i stand til at cache resultatet af SELECT'er, så efterfølgende identiske SELECT'er betjenes direkte af MaxScale, uden at forespørgslerne bliver dirigeret til evt. server. |
Konsekvent kritisk læsning | Tillader konsekvente kritiske læsninger at udføres gennem MaxScale, mens de stadig tillader skalering af ikke-kritiske læsninger. |
Database Firewall | Blokerer forespørgsler, der matcher et sæt regler. Dette filter skal ses som en bedst mulig løsning beregnet til at beskytte mod utilsigtet misbrug snarere end ondsindede angreb. |
Tip | Tilføjer routingtip til en tjeneste og instruerer routeren om at dirigere en forespørgsel til en bestemt type server. |
Indsæt stream | Konverterer masseindsættelser til CSV-datastrømme, der forbruges af backend-serveren via LOAD DATA LOCAL INFILE-mekanismen |
Lua | Kalder et sæt funktioner i et Lua-script. |
Maskning | Forslører den returnerede værdi af en bestemt kolonne |
Maxrows | Begrænsning af antallet af rækker, som en SELECT, en forberedt sætning eller lagret procedure kan returnere til klientapplikationen. |
Navnet server | Ruterer forespørgsler til servere baseret på match med regulære udtryk (regex). |
Forespørgselslog alle | Logger forespørgselsindhold til en fil i CSV-format. |
Regex | Omskriver forespørgselsindhold ved hjælp af matches med regulære udtryk og tekstsubstitution. |
T-shirt | Lav kopier af anmodninger fra klienten og send kopierne til en anden tjeneste inden for MariaDB MaxScale. |
Throttle | Erstatter og udvider limit_queries-funktionaliteten i Database Firewall-filteret |
Top | Overvåger forespørgselsydeevnen for den valgte SQL-sætning, der passerer gennem filteret. |
Overvågning af transaktionsydelse | Overvåger hver SQL-sætning, der passerer gennem filteret, grupperet efter transaktion, til analyse af transaktionsydelse. |
Opret et filter
Hvert MaxScale-filter har sin egen måde at blive konfigureret på. I dette eksempel skal vi oprette et maskeringsfilter for at maskere vores følsomme data for kolonnen "card_no" i vores tabel "credit_cards". Maskering kræver en regelfil, skrevet i JSON-format. For det første skal du oprette en mappe til at være vært for vores regelfiler:
$ mkdir /var/lib/maxscale/rules
Opret derefter en tekstfil:
$ vi /var/lib/maxscale/rules/masking.json
Angiv linjerne som nedenfor:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
Ovenstående enkle regler vil simpelthen sløre outputtet af kolonne card_no for alle tabeller for at beskytte de følsomme data, der skal ses af MariaDB-klienten.
Efter at regelfilen er blevet oprettet, kan vi oprette filteret ved at bruge følgende kommando:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Bemærk, at nogle filtre kræver forskellige parametre. Hvad angår dette maskeringsfilter, er den grundlæggende parameter "regler", hvor vi skal angive den oprettede maskeringsregelfil i JSON-format.
Vedhæft et filter til en tjeneste
Et filter kan kun aktiveres ved at tilslutte det til en tjeneste. Ændring af en eksisterende tjeneste ved hjælp af MaxCtrl understøttes kun af nogle parametre, og tilføjelse af et filter er ikke en af dem. Vi er nødt til at tilføje filterkomponenten under MaxScales servicekonfigurationsfil for grundlæggende at vedhæfte filteret. I dette eksempel vil vi anvende filteret "Obfuscates-card" på vores eksisterende round-robin-tjeneste kaldet rr-service.
Gå til mappen /var/lib/maxscale/maxscale.cnf.d og find rr-service.cnf, åbn den med en teksteditor og tilføj derefter følgende linje:
filters=Obfuscates-card
En MaxScale-genstart er påkrævet for at indlæse den nye ændring:
$ systemctl restart maxscale
For at teste filteret bruger vi en MariaDB-klient og sammenligner outputtet ved at oprette forbindelse til to forskellige tjenester. Vores rw-service er knyttet til en lytter, der lytter på port 3306, uden at der er konfigureret nogen filtre. Derfor bør vi se det ufiltrerede svar fra 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Når du forbinder til rr-service-lytteren på port 3307, som er konfigureret med vores filter, er vores "card_no"-værdi sløret med et volapyk-output:
$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Denne filtrering udføres af MaxScale efter matchningsreglerne inde i masking.json, som vi har oprettet tidligere.
Vis filtre
Brug kommandoen "liste filtre" for at få vist alle oprettede filtre:
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
I ovenstående eksempler har vi lavet 3 filtre. Det er dog kun Obfuscates-kortfilteret, der er knyttet til en tjeneste.
For at vise alle tjenester i detaljer:
maxctrl: show filters
Eller hvis du vil vise en bestemt tjeneste:
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" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Slet et filter
For at slette et filter, skal man først fjerne linket fra de tilknyttede tjenester. Overvej f.eks. følgende filtre i MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
For qla-filteret kan vi blot bruge følgende kommando til at slette det:
maxctrl: destroy filter qla
OK
Men for Obfuscates-kortfilteret skal det kobles fra med rr-service, og desværre kræver dette en konfigurationsfilændring og MaxScale genstart. Gå til mappen /var/lib/maxscale/maxscale.cnf.d og find rr-service.cnf, åbn den med en teksteditor og fjern derefter følgende linje:
filters=Obfuscates-card
Du kan også fjerne "Obfuscates-card"-strengen fra ovenstående linje og lade "filtre"-linjen svare til en tom værdi. Gem derefter filen og genstart MaxScale-tjenesten for at indlæse ændringerne:
$ systemctl restart maxscale
Først da kan vi fjerne Obfuscates-kortfilteret fra MaxScale ved at bruge kommandoen "destroy filter":
maxctrl: destroy filter Obfuscates-card
OK
MaxScale Management
Angiv brugere
For at liste alle MaxScale-brugere, brug kommandoen "list users":
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Opret en MaxScale-bruger
Som standard er en oprettet bruger en skrivebeskyttet bruger:
maxctrl: create user dev mySecret
OK
For at oprette en administratorbruger skal du angive kommandoen --type=admin:
maxctrl: create user dba mySecret --type=admin
OK
Slet en MaxScale-bruger
For at slette en bruger skal du blot bruge kommandoen "ødelæg bruger":
maxctrl: destroy user dba
OK
Den sidste resterende administrative bruger kan ikke fjernes. Opret en erstatningsadministrativ bruger, før du forsøger at fjerne den sidste administrative bruger.
Vis MaxScale-parametre
For at vise alle indlæste parametre for MaxScale-forekomsten skal du bruge kommandoen "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 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
Ændre MaxScale-parametre
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- admin_auth
- admin_log_auth_failures
- passiv
Resten af parametrene skal indstilles inde i /etc/maxscale.conf, hvilket kræver en MaxScale-genstart for at anvende de nye ændringer.
MaxScale GUI
MaxGUI er et nyt browserbaseret værktøj til konfiguration og styring af MaxScale, introduceret i version 2.5. Den er tilgængelig via port 8989 på MaxScale-værten på localhost-grænsefladen, 127.0.0.1. Som standard er det nødvendigt at indstille admin_secure_gui=true og konfigurere både admin_ssl_key og admin_ssl_cert parametrene. I dette blogindlæg vil vi dog tillade forbindelse via den almindelige HTTP ved at tilføje følgende linje under [maxctrl]-direktivet inde i /etc/maxscale.cnf:
admin_secure_gui = false
Genstart MaxScale-tjenesten for at indlæse ændringen:
$ systemctl restart maxscale
Da GUI'en lytter på den lokale værtsgrænseflade, kan vi bruge SSH-tunneling til at få adgang til GUI'en fra vores lokale arbejdsstation:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Åbn derefter en webbrowser, peg URL'en til http://127.0.0.1:8989/ og log ind. MaxGUI bruger de samme legitimationsoplysninger som maxctrl, så standardadgangskoden er "admin" med adgangskoden "mariadb". Af sikkerhedsmæssige årsager bør man oprette en ny admin-bruger med en stærkere adgangskode specifikt til dette formål. Når du er logget ind, bør du se MaxGUI-dashboardet som nedenfor:
De fleste af de MaxCtrl-styringskommandoer, som vi har vist i denne blogserie, kan udføres direkte fra denne GUI. Hvis du klikker på knappen "Opret ny", vil du blive præsenteret for følgende dialogboks:
Som du kan se, kan alle de vigtige MaxScale-komponenter administreres direkte fra GUI'en, med et flot intuitivt rent udseende, gør tingene meget enklere og mere ligetil at administrere. For eksempel kan tilknytning af et filter ske direkte fra brugergrænsefladen, uden at det er nødvendigt at genstarte MaxScale-tjenesten, som vist under afsnittet "Vedhæft et filter til en tjeneste" i dette blogindlæg.
For mere information om denne nye GUI, tjek denne MaxGUI guide.
Logføringsstyring
Vis logningsparametre
For at vise logningsparametrene, brug kommandoen "vis logning":
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 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Rediger logningsparametre
Alle logningsparametre som vist ovenfor kan konfigureres via MaxCtrl-kommandoen i runtime. For eksempel kan vi slå log_info til ved at bruge kommandoen "alter logging":
maxctrl: alter logging log_info true
Rotér logfiler
Som standard giver MaxScale en logrotationskonfigurationsfil under /etc/logrotate.d/maxscale_logrotate. Baseret på logrotationskonfigurationen roteres logfilen månedligt og gør brug af MaxCtrl's "rotate logs" kommando. Vi kan tvinge log-rotation til at ske med det samme med følgende kommando:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Bekræft med følgende kommando:
$ 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
Konklusion
Vi er nået til slutningen af serien af MaxScale-implementering og administration ved hjælp af MaxCtrl-klienten. På tværs af denne blogserie har vi brugt et par forskellige nyeste MaxScale-versioner (i forhold til opskrivningsdatoen), og vi har set mange væsentlige forbedringer i hver version.
Kudos til MariaDB MaxScale-teamet for deres hårde arbejde med at gøre MaxScale til et af de bedste database-load balancer-værktøjer på markedet.