W poprzednim wpisie na blogu omówiliśmy 4 podstawowe komponenty zarządzania przy użyciu klienta wiersza poleceń MaxCtrl. W tym poście na blogu omówimy pozostałą część komponentów MaxScale, które są powszechnie używane w klastrze MariaDB:
- Zarządzanie filtrami
- Zarządzanie MaxScale
- Zarządzanie logowaniem
Wszystkie polecenia w tym poście na blogu są oparte na MaxScale 2.5.3.
Zarządzanie filtrami
Filtr to moduł w MaxScale, który działa jako silnik przetwarzania i routingu dla usługi MaxScale. Filtrowanie odbywa się między połączeniem klienta z MaxScale i połączeniem MaxScale z serwerami baz danych zaplecza. Ta ścieżka (strona klienta MaxScale do rzeczywistych serwerów baz danych) może być uważana za potok, filtry można następnie umieścić w tym potoku w celu monitorowania, modyfikowania, kopiowania lub blokowania treści, które przez nią przepływają.
Istnieje wiele filtrów, które można zastosować w celu rozszerzenia możliwości przetwarzania usługi MaxScale, jak pokazano w poniższej tabeli:
Nazwa filtra | Opis |
Binlog | Wybiórczo replikuje zdarzenia dziennika binarnego na serwery podrzędne w połączeniu z usługą binlogrouter. |
Pamięć podręczna | Prosta pamięć podręczna, która może buforować wyniki SELECT, dzięki czemu kolejne identyczne SELECTy są obsługiwane bezpośrednio przez MaxScale, bez kierowania zapytań do żadnego serwer. |
Spójny odczyt krytyczny | Pozwala na wykonywanie spójnych krytycznych odczytów za pomocą MaxScale, jednocześnie umożliwiając skalowanie odczytów niekrytycznych. |
Zapora bazy danych | Blokuje zapytania pasujące do zestawu reguł. Ten filtr należy postrzegać jako najlepsze rozwiązanie przeznaczone do ochrony przed przypadkowym niewłaściwym użyciem, a nie złośliwymi atakami. |
Wskazówka | Dodaje wskazówki dotyczące routingu do usługi, instruując router, aby skierował zapytanie do określonego typu serwera. |
Wstaw strumień | Konwertuje zbiorcze wstawki na strumienie danych CSV, które są zużywane przez serwer zaplecza za pośrednictwem mechanizmu LOAD DATA LOCAL INFILE |
Lua | Wywołuje zestaw funkcji w skrypcie Lua. |
Maskowanie | Zaciemnia zwróconą wartość konkretnej kolumny |
Maksymalne wiersze | Ograniczanie liczby wierszy, które polecenie SELECT, przygotowana instrukcja lub procedura składowana może zwrócić do aplikacji klienckiej. |
Serwer nazwany | Kieruje zapytania do serwerów na podstawie dopasowań wyrażeń regularnych (regex). |
Dziennik zapytań wszystko | Zapisuje treść zapytania do pliku w formacie CSV. |
Wyrażenie regularne | Przepisuje treść zapytania przy użyciu dopasowań wyrażeń regularnych i podstawienia tekstu. |
Koszulki | Tworzenie kopii żądań od klienta i wysyłanie kopii do innej usługi w ramach MariaDB MaxScale. |
Przepustnica | Zastępuje i rozszerza funkcjonalność limit_queries filtra zapory bazy danych |
Góra | Monitoruje wydajność zapytania wybranej instrukcji SQL, która przechodzi przez filtr. |
Monitorowanie wydajności transakcji | Monitoruje każdą instrukcję SQL przechodzącą przez filtr, pogrupowaną według transakcji, w celu analizy wydajności transakcji. |
Utwórz filtr
Każdy filtr MaxScale ma swój własny sposób konfiguracji. W tym przykładzie stworzymy filtr maskujący, aby zamaskować nasze poufne dane dla kolumny „card_no” w naszej tabeli „credit_cards”. Maskowanie wymaga pliku reguł zapisanego w formacie JSON. Najpierw utwórz katalog do przechowywania naszych plików reguł:
$ mkdir /var/lib/maxscale/rules
Następnie utwórz plik tekstowy:
$ vi /var/lib/maxscale/rules/masking.json
Określ linie jak poniżej:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
Powyższe proste zasady po prostu zaciemnią dane wyjściowe kolumny card_no dla dowolnych tabel, aby chronić poufne dane, które będą widoczne dla klienta MariaDB.
Po utworzeniu pliku reguły możemy utworzyć filtr za pomocą następującego polecenia:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Zauważ, że niektóre filtry wymagają innych parametrów. Jeśli chodzi o ten filtr maskujący, podstawowym parametrem jest „rules”, gdzie musimy określić utworzony plik reguł maskowania w formacie JSON.
Dołącz filtr do usługi
Filtr można aktywować tylko przez dołączenie go do usługi. Modyfikowanie istniejącej usługi za pomocą MaxCtrl jest obsługiwane tylko przez niektóre parametry, a dodanie filtra nie jest jednym z nich. Musimy dodać składnik filtra w pliku konfiguracyjnym usługi MaxScale, aby w zasadzie dołączyć filtr. W tym przykładzie zastosujemy filtr „Obfuscates-card” do naszej istniejącej usługi round-robin o nazwie rr-service.
Przejdź do katalogu /var/lib/maxscale/maxscale.cnf.d i znajdź rr-service.cnf, otwórz go za pomocą edytora tekstu, a następnie dodaj następujący wiersz:
filters=Obfuscates-card
Aby wczytać nową zmianę, wymagane jest ponowne uruchomienie MaxScale:
$ systemctl restart maxscale
Aby przetestować filtr, użyjemy klienta MariaDB i porównamy dane wyjściowe, łącząc się z dwiema różnymi usługami. Nasza usługa rw jest dołączona do słuchacza nasłuchującego na porcie 3306, bez skonfigurowanych żadnych filtrów. Dlatego powinniśmy zobaczyć niefiltrowaną odpowiedź 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Podczas łączenia się z listenerem usługi rr na porcie 3307, który został skonfigurowany za pomocą naszego filtra, nasza wartość "card_no" jest zaciemniana przez bezużyteczne wyjście:
$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+
To filtrowanie jest wykonywane przez MaxScale, zgodnie z regułami dopasowania w masking.json, które stworzyliśmy wcześniej.
Lista filtrów
Aby wyświetlić listę wszystkich utworzonych filtrów, użyj polecenia „list filters”:
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
W powyższych przykładach stworzyliśmy 3 filtry. Jednak tylko filtr kart zaciemniających jest połączony z usługą.
Aby wyświetlić szczegóły wszystkich usług:
maxctrl: show filters
Lub jeśli chcesz pokazać konkretną usługę:
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" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Usuń filtr
Aby usunąć filtr, należy najpierw odłączyć się od powiązanych usług. Rozważmy na przykład następujące filtry w MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
W przypadku filtra qla możemy po prostu użyć następującego polecenia, aby go usunąć:
maxctrl: destroy filter qla
OK
Jednak filtr karty Obfuscates musi być odłączony od usługi rr i niestety wymaga to modyfikacji pliku konfiguracyjnego i restartu MaxScale. Przejdź do katalogu /var/lib/maxscale/maxscale.cnf.d i znajdź rr-service.cnf, otwórz go w edytorze tekstu, a następnie usuń następujący wiersz:
filters=Obfuscates-card
Możesz również usunąć ciąg „Obfuscates-card” z powyższej linii i pozwolić, aby wiersz „filtry” był równy pustej wartości. Następnie zapisz plik i uruchom ponownie usługę MaxScale, aby załadować zmiany:
$ systemctl restart maxscale
Dopiero wtedy możemy usunąć filtr Obfuscates-card z MaxScale za pomocą polecenia „destroy filter”:
maxctrl: destroy filter Obfuscates-card
OK
Zarządzanie maksymalną skalą
Lista użytkowników
Aby wyświetlić listę wszystkich użytkowników MaxScale, użyj polecenia „list users”:
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Utwórz użytkownika MaxScale
Domyślnie utworzony użytkownik jest użytkownikiem tylko do odczytu:
maxctrl: create user dev mySecret
OK
Aby utworzyć użytkownika administratora, określ --type=admin polecenie:
maxctrl: create user dba mySecret --type=admin
OK
Usuń użytkownika MaxScale
Aby usunąć użytkownika, po prostu użyj polecenia „zniszcz użytkownika”:
maxctrl: destroy user dba
OK
Nie można usunąć ostatniego pozostałego użytkownika administracyjnego. Utwórz zastępczego użytkownika administracyjnego przed próbą usunięcia ostatniego użytkownika administracyjnego.
Pokaż parametry MaxScale
Aby wyświetlić wszystkie załadowane parametry dla instancji MaxScale, użyj polecenia „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 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
Zmień parametry MaxScale
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- admin_auth
- admin_log_auth_failures
- pasywny
Pozostałe parametry muszą być ustawione w /etc/maxscale.conf, co wymaga ponownego uruchomienia MaxScale, aby zastosować nowe zmiany.
GUI MaxScale
MaxGUI to nowe narzędzie oparte na przeglądarce do konfiguracji i zarządzania MaxScale, wprowadzone w wersji 2.5. Jest dostępny przez port 8989 hosta MaxScale na interfejsie localhost, 127.0.0.1. Domyślnie wymagane jest ustawienie admin_secure_gui=true i skonfigurowanie parametrów admin_ssl_key i admin_ssl_cert. Jednak w tym poście na blogu zamierzamy zezwolić na łączność przez zwykły HTTP, dodając następujący wiersz pod dyrektywą [maxctrl] wewnątrz /etc/maxscale.cnf:
admin_secure_gui = false
Uruchom ponownie usługę MaxScale, aby załadować zmianę:
$ systemctl restart maxscale
Ponieważ GUI nasłuchuje na interfejsie hosta lokalnego, możemy użyć tunelowania SSH, aby uzyskać dostęp do GUI z naszej lokalnej stacji roboczej:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Następnie otwórz przeglądarkę internetową, wskaż adres URL http://127.0.0.1:8989/ i zaloguj się. MaxGUI używa tych samych danych uwierzytelniających, co maxctrl, dlatego domyślne hasło to „admin” z hasło „mariadb”. Ze względów bezpieczeństwa należy utworzyć nowego administratora z silniejszym hasłem specjalnie do tego celu. Po zalogowaniu powinieneś zobaczyć panel MaxGUI, jak poniżej:
Większość poleceń zarządzania MaxCtrl, które pokazaliśmy w tej serii blogów, może być wykonywane bezpośrednio z tego GUI. Jeśli klikniesz przycisk „Utwórz nowy”, pojawi się następujące okno dialogowe:
Jak widać, wszystkimi ważnymi komponentami MaxScale można zarządzać bezpośrednio z GUI, z ładnym, intuicyjnym, czystym wyglądem, znacznie ułatwia zarządzanie. Na przykład powiązanie filtra można wykonać bezpośrednio z interfejsu użytkownika, bez konieczności ponownego uruchamiania usługi MaxScale, jak pokazano w sekcji „Dołącz filtr do usługi” w tym poście na blogu.
Aby uzyskać więcej informacji na temat tego nowego GUI, zapoznaj się z tym przewodnikiem MaxGUI.
Zarządzanie rejestrowaniem
Pokaż parametry rejestrowania
Aby wyświetlić parametry rejestrowania, użyj polecenia „show logging”:
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 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Edytuj parametry rejestrowania
Wszystkie parametry rejestrowania, jak pokazano powyżej, można skonfigurować za pomocą polecenia MaxCtrl w czasie wykonywania. Na przykład możemy włączyć log_info za pomocą polecenia „zmień rejestrowanie”:
maxctrl: alter logging log_info true
Obróć dzienniki
Domyślnie MaxScale udostępnia plik konfiguracyjny obracania dziennika w /etc/logrotate.d/maxscale_logrotate. Na podstawie konfiguracji rotacji dzienników plik dziennika jest obracany co miesiąc i korzysta z polecenia „obróć dzienniki” MaxCtrl. Możemy wymusić natychmiastową rotację dziennika za pomocą następującego polecenia:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Zweryfikuj za pomocą następującego polecenia:
$ 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
Wnioski
Doszliśmy do końca serii wdrażania i zarządzania MaxScale przy użyciu klienta MaxCtrl. W tej serii blogów użyliśmy kilku różnych najnowszych wersji MaxScale (w stosunku do daty napisania) i zauważyliśmy wiele znaczących ulepszeń w każdej wersji.
Podziękowania dla zespołu MariaDB MaxScale za ich ciężką pracę nad uczynieniem MaxScale jednym z najlepszych narzędzi do równoważenia obciążenia bazy danych na rynku.