I det tidigare blogginlägget har vi täckt fyra grundläggande hanteringskomponenter med MaxCtrl-kommandoradsklienten. I det här blogginlägget kommer vi att täcka den återstående delen av MaxScale-komponenterna som vanligtvis används i ett MariaDB-kluster:
- Filterhantering
- MaxScale-hantering
- Logghantering
Alla kommandon i det här blogginlägget är baserade på MaxScale 2.5.3.
Filterhantering
Filtret är en modul i MaxScale som fungerar som process- och routingmotor för en MaxScale-tjänst. Filtreringen sker mellan klientanslutningen till MaxScale och MaxScale-anslutningen till backend-databasservrarna. Den här sökvägen (klientsidan av MaxScale ut till de faktiska databasservrarna) kan betraktas som en pipeline, filter kan sedan placeras i den pipeline för att övervaka, modifiera, kopiera eller blockera innehållet som flödar genom den.
Det finns många filter som kan användas för att utöka bearbetningsmöjligheterna för en MaxScale-tjänst, som visas i följande tabell:
Filternamn | Beskrivning |
Binlog | Replikerar selektivt de binära logghändelserna till slavservrar kombinerat med en binlogrouter-tjänst. |
Cache | En enkel cache som kan cachelagra resultatet av SELECT, så att efterföljande identiska SELECT:er betjänas direkt av MaxScale, utan att frågorna dirigeras till någon server. |
Konsekvent kritisk läsning | Tillåter att konsekventa kritiska läsningar görs genom MaxScale samtidigt som det tillåter skalning av icke-kritiska läsningar. |
Databasbrandvägg | Blockerar frågor som matchar en uppsättning regler. Det här filtret bör ses som en bästa lösning avsedd för att skydda mot oavsiktlig missbruk snarare än skadliga attacker. |
Tips | Lägger till routingtips till en tjänst och instruerar routern att dirigera en fråga till en viss typ av server. |
Infoga ström | Konverterar massinlägg till CSV-dataströmmar som konsumeras av backend-servern via mekanismen LADDA DATA LOCAL INFILE |
Lua | Anropar en uppsättning funktioner i ett Lua-skript. |
Maskning | Obfuskerar det returnerade värdet för en viss kolumn |
Maxrows | Begränsning av antalet rader som en SELECT, en förberedd sats eller lagrad procedur kan returnera till klientapplikationen. |
Namnställd server | Dirigerar frågor till servrar baserat på matchningar med reguljära uttryck (regex). |
Frågelogg alla | Loggar frågeinnehåll till en fil i CSV-format. |
Regex | Skrivar om frågeinnehåll med hjälp av reguljära uttrycksmatchningar och textersättning. |
T-shirt | Gör kopior av förfrågningar från klienten och skicka kopiorna till en annan tjänst inom MariaDB MaxScale. |
Gåpa | Ersätter och utökar limit_queries-funktionen för databasbrandväggsfiltret |
Överst | Övervakar frågeprestanda för den valda SQL-satsen som passerar genom filtret. |
Övervakning av transaktionsprestanda | Övervakar varje SQL-sats som passerar genom filtret, grupperad per transaktion, för analys av transaktionsprestanda. |
Skapa ett filter
Varje MaxScale-filter har sitt eget sätt att konfigureras. I det här exemplet kommer vi att skapa ett maskeringsfilter för att maskera våra känsliga data för kolumnen "card_no" i vår tabell "credit_cards". Maskering kräver en regelfil, skriven i JSON-format. Skapa först en katalog för våra regelfiler:
$ mkdir /var/lib/maxscale/rules
Skapa sedan en textfil:
$ vi /var/lib/maxscale/rules/masking.json
Ange raderna enligt nedan:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
Ovanstående enkla regler kommer helt enkelt att fördunkla utdata från kolumn card_no för alla tabeller, för att skydda den känsliga data som ska ses av MariaDB-klienten.
Efter att regelfilen har skapats kan vi skapa filtret med följande kommando:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Observera att vissa filter kräver olika parametrar. När det gäller detta maskeringsfilter är grundparametern "regler", där vi måste specificera den skapade maskeringsregelfilen i JSON-format.
Bifoga ett filter till en tjänst
Ett filter kan bara aktiveras genom att det kopplas till en tjänst. Att ändra en befintlig tjänst med MaxCtrl stöds endast av vissa parametrar, och att lägga till ett filter är inte en av dem. Vi måste lägga till filterkomponenten under MaxScales tjänstkonfigurationsfil för att i princip bifoga filtret. I det här exemplet kommer vi att tillämpa filtret "Obfuscates-card" på vår befintliga round-robin-tjänst som heter rr-service.
Gå till katalogen /var/lib/maxscale/maxscale.cnf.d och hitta rr-service.cnf, öppna den med en textredigerare och lägg sedan till följande rad:
filters=Obfuscates-card
En MaxScale-omstart krävs för att ladda den nya ändringen:
$ systemctl restart maxscale
För att testa filtret kommer vi att använda en MariaDB-klient och jämföra utdata genom att ansluta till två olika tjänster. Vår rw-tjänst är kopplad till en lyssnare som lyssnar på port 3306, utan några filter konfigurerade. Därför bör vi se det ofiltrerade svaret från 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 ansluter till rr-service-lyssnaren på port 3307, som är konfigurerad med vårt filter, fördunklas vårt "card_no"-värde med en floskelutgång:
$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Denna filtrering utförs av MaxScale, enligt matchningsreglerna inuti maskering.json som vi har skapat tidigare.
Lista filter
För att lista ut alla skapade filter, använd kommandot "list filters":
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
I exemplen ovan har vi skapat 3 filter. Det är dock bara Obfuscates-kortfiltret som är kopplat till en tjänst.
För att visa alla tjänster i detalj:
maxctrl: show filters
Eller om du vill visa en viss tjänst:
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" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Ta bort ett filter
För att radera ett filter måste man först ta bort länken från de tillhörande tjänsterna. Tänk till exempel på följande filter i MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
För qla-filtret kan vi helt enkelt använda följande kommando för att ta bort det:
maxctrl: destroy filter qla
OK
Men för Obfuscates-kortfiltret måste det kopplas bort med rr-service och tyvärr kräver detta en konfigurationsfiländring och omstart av MaxScale. Gå till katalogen /var/lib/maxscale/maxscale.cnf.d och hitta rr-service.cnf, öppna den med en textredigerare och ta sedan bort följande rad:
filters=Obfuscates-card
Du kan också ta bort "Obfuscates-card"-strängen från ovanstående rad och låta "filters"-raden vara lika med ett tomt värde. Spara sedan filen och starta om MaxScale-tjänsten för att ladda ändringarna:
$ systemctl restart maxscale
Först då kan vi ta bort Obfuscates-kortfiltret från MaxScale med kommandot "destroy filter":
maxctrl: destroy filter Obfuscates-card
OK
MaxScale Management
Lista användare
För att lista alla MaxScale-användare, använd kommandot "list users":
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Skapa en MaxScale-användare
Som standard är en skapad användare en skrivskyddad användare:
maxctrl: create user dev mySecret
OK
För att skapa en administratörsanvändare anger du kommandot --type=admin:
maxctrl: create user dba mySecret --type=admin
OK
Ta bort en MaxScale-användare
För att ta bort en användare, använd helt enkelt kommandot "förstör användare":
maxctrl: destroy user dba
OK
Den sista kvarvarande administrativa användaren kan inte tas bort. Skapa en ersättningsadministrativ användare innan du försöker ta bort den sista administrativa användaren.
Visa MaxScale-parametrar
För att visa alla inlästa parametrar för MaxScale-instansen, använd kommandot "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 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
Ändra MaxScale-parametrar
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- admin_auth
- admin_log_auth_failures
- passiv
Resten av parametrarna måste ställas in i /etc/maxscale.conf, vilket kräver en omstart av MaxScale för att tillämpa de nya ändringarna.
MaxScale GUI
MaxGUI är ett nytt webbläsarbaserat verktyg för att konfigurera och hantera MaxScale, introducerat i version 2.5. Den är tillgänglig via port 8989 på MaxScale-värden på localhost-gränssnittet, 127.0.0.1. Som standard är det nödvändigt att ställa in admin_secure_gui=true och konfigurera både admin_ssl_key och admin_ssl_cert parametrarna. Men i det här blogginlägget kommer vi att tillåta anslutning via vanlig HTTP genom att lägga till följande rad under [maxctrl]-direktivet inuti /etc/maxscale.cnf:
admin_secure_gui = false
Starta om MaxScale-tjänsten för att ladda ändringen:
$ systemctl restart maxscale
Eftersom det grafiska användargränssnittet lyssnar på det lokala värdgränssnittet kan vi använda SSH-tunnling för att komma åt det grafiska användargränssnittet från vår lokala arbetsstation:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Öppna sedan en webbläsare, peka URL:en till http://127.0.0.1:8989/ och logga in. MaxGUI använder samma referenser som maxctrl, därför är standardlösenordet "admin" med lösenordet "mariadb". Av säkerhetsskäl bör man skapa en ny administratörsanvändare med ett starkare lösenord specifikt för detta ändamål. När du har loggat in bör du se MaxGUI-instrumentpanelen enligt nedan:
De flesta av MaxCtrl-hanteringskommandona som vi har visat i den här bloggserien kan utföras direkt från detta GUI. Om du klickar på knappen "Skapa ny" kommer du att få följande dialogruta:
Som du kan se kan alla viktiga MaxScale-komponenter hanteras direkt från GUI, med ett snyggt intuitivt rent utseende, gör saker mycket enklare och enklare att hantera. Till exempel kan associering av ett filter göras direkt från användargränssnittet, utan att behöva starta om MaxScale-tjänsten, som visas under avsnittet "Bifoga ett filter till en tjänst" i det här blogginlägget.
För mer information om detta nya GUI, kolla in denna MaxGUI-guide.
Logghantering
Visa loggningsparametrar
För att visa loggningsparametrarna, använd kommandot "visa loggning":
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 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Redigera loggningsparametrar
Alla loggningsparametrar som visas ovan kan konfigureras via MaxCtrl-kommandot under körning. Till exempel kan vi aktivera log_info genom att använda kommandot "alter logging":
maxctrl: alter logging log_info true
Rotera loggar
Som standard tillhandahåller MaxScale en konfigurationsfil för loggrotering under /etc/logrotate.d/maxscale_logrotate. Baserat på loggrotationskonfigurationen roteras loggfilen månadsvis och använder sig av MaxCtrls kommando "rotate logs". Vi kan tvinga loggrotation att ske omedelbart med följande kommando:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Verifiera med följande 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
Slutsats
Vi har nått slutet av serien av MaxScale-distribution och hantering med MaxCtrl-klienten. I den här bloggserien har vi använt ett par olika senaste MaxScale-versioner (i förhållande till uppskrivningsdatumet) och vi har sett många betydande förbättringar i varje version.
Kudos till MariaDB MaxScale-teamet för deras hårda arbete med att göra MaxScale till ett av de bästa databaslastbalanseringsverktygen på marknaden.