Im vorherigen Blogbeitrag haben wir 4 grundlegende Verwaltungskomponenten mit dem MaxCtrl-Befehlszeilenclient behandelt. In diesem Blogbeitrag behandeln wir den verbleibenden Teil der MaxScale-Komponenten, die üblicherweise in einem MariaDB-Cluster verwendet werden:
- Filterverwaltung
- MaxScale-Verwaltung
- Protokollverwaltung
Alle Befehle in diesem Blogbeitrag basieren auf MaxScale 2.5.3.
Filterverwaltung
Der Filter ist ein Modul in MaxScale, das als Verarbeitungs- und Routing-Engine für einen MaxScale-Dienst fungiert. Die Filterung erfolgt zwischen der Client-Verbindung zu MaxScale und der MaxScale-Verbindung zu den Backend-Datenbankservern. Dieser Pfad (die Client-Seite von MaxScale zu den eigentlichen Datenbankservern) kann als Pipeline betrachtet werden, Filter können dann in dieser Pipeline platziert werden, um den Inhalt zu überwachen, zu ändern, zu kopieren oder zu blockieren, der durch ihn fließt.
Es gibt viele Filter, die angewendet werden können, um die Verarbeitungsfähigkeiten eines MaxScale-Dienstes zu erweitern, wie in der folgenden Tabelle gezeigt:
Filtername | Beschreibung |
Binlog | Repliziert selektiv die binären Log-Ereignisse auf Slave-Server, kombiniert mit einem binlogrouter-Dienst. |
Cache | Ein einfacher Cache, der das Ergebnis von SELECTs zwischenspeichern kann, sodass nachfolgende identische SELECTs direkt von MaxScale bedient werden, ohne dass die Abfragen an irgendwelche weitergeleitet werden Server. |
Konsistentes kritisches Lesen | Ermöglicht konsistente kritische Lesevorgänge über MaxScale, während weiterhin die Skalierung nicht kritischer Lesevorgänge möglich ist. |
Datenbank-Firewall | Blockiert Abfragen, die einem Satz von Regeln entsprechen. Dieser Filter sollte als Best-Effort-Lösung zum Schutz vor versehentlichem Missbrauch und nicht vor böswilligen Angriffen betrachtet werden. |
Hinweis | Fügt einem Dienst Routing-Hinweise hinzu und weist den Router an, eine Abfrage an einen bestimmten Servertyp weiterzuleiten. |
Stream einfügen | Konvertiert Masseneinfügungen in CSV-Datenströme, die vom Backend-Server über den LOAD DATA LOCAL INFILE-Mechanismus verbraucht werden |
Lua | Ruft eine Reihe von Funktionen in einem Lua-Skript auf. |
Maskierung | Verschleiert den zurückgegebenen Wert einer bestimmten Spalte |
Maxrows | Einschränkung der Anzahl der Zeilen, die eine SELECT-Anweisung, eine vorbereitete Anweisung oder eine gespeicherte Prozedur an die Clientanwendung zurückgeben kann. |
Benannter Server | Leitet Abfragen basierend auf Übereinstimmungen mit regulären Ausdrücken (regex) an Server weiter. |
Alle Abfrageprotokolle | Protokolliert Abfrageinhalte in einer Datei im CSV-Format. |
Regex | Schreibt Abfrageinhalte neu, indem es Übereinstimmungen mit regulären Ausdrücken und Textersetzung verwendet. |
T-Stück | Erstellen Sie Kopien von Anfragen des Clients und senden Sie die Kopien an einen anderen Dienst innerhalb von MariaDB MaxScale. |
Drosseln | Ersetzt und erweitert die limit_queries-Funktionalität des Datenbank-Firewall-Filters |
Oben | Überwacht die Abfrageleistung der ausgewählten SQL-Anweisung, die den Filter passiert. |
Überwachung der Transaktionsleistung | Überwacht jede SQL-Anweisung, die den Filter passiert, gruppiert nach Transaktion, zur Analyse der Transaktionsleistung. |
Filter erstellen
Jeder MaxScale-Filter kann auf seine eigene Weise konfiguriert werden. In diesem Beispiel erstellen wir einen Maskierungsfilter, um unsere sensiblen Daten für die Spalte „card_no“ in unserer Tabelle „credit_cards“ zu maskieren. Für die Maskierung ist eine im JSON-Format geschriebene Regeldatei erforderlich. Erstellen Sie zunächst ein Verzeichnis zum Hosten unserer Regeldateien:
$ mkdir /var/lib/maxscale/rules
Erstellen Sie dann eine Textdatei:
$ vi /var/lib/maxscale/rules/masking.json
Geben Sie die Zeilen wie folgt an:
{
"rules": [
{
"obfuscate": {
"column": "card_no"
}
}
]
}
Die obigen einfachen Regeln verschleiern einfach die Ausgabe der Spalte card_no für alle Tabellen, um die sensiblen Daten zu schützen, die vom MariaDB-Client gesehen werden.
Nachdem die Regeldatei erstellt wurde, können wir den Filter mit dem folgenden Befehl erstellen:
maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK
Beachten Sie, dass einige Filter unterschiedliche Parameter erfordern. Für diesen Maskierungsfilter ist der Basisparameter „rules“, wo wir die erstellte Maskierungsregeldatei im JSON-Format angeben müssen.
Hinzufügen eines Filters zu einem Dienst
Ein Filter kann nur aktiviert werden, indem er einem Dienst zugeordnet wird. Das Ändern eines vorhandenen Dienstes mit MaxCtrl wird nur von einigen Parametern unterstützt, und das Hinzufügen eines Filters gehört nicht dazu. Wir müssen die Filterkomponente unter der Dienstkonfigurationsdatei von MaxScale hinzufügen, um den Filter grundsätzlich anzuhängen. In diesem Beispiel werden wir den Filter „Obfuscates-card“ auf unseren bestehenden Round-Robin-Dienst namens rr-service anwenden.
Gehen Sie in das Verzeichnis /var/lib/maxscale/maxscale.cnf.d und suchen Sie rr-service.cnf, öffnen Sie es mit einem Texteditor und fügen Sie dann die folgende Zeile hinzu:
filters=Obfuscates-card
Zum Laden der neuen Änderung ist ein MaxScale-Neustart erforderlich:
$ systemctl restart maxscale
Um den Filter zu testen, verwenden wir einen MariaDB-Client und vergleichen die Ausgabe, indem wir eine Verbindung zu zwei verschiedenen Diensten herstellen. Unser rw-Dienst ist an einen Listener angehängt, der Port 3306 überwacht, ohne dass Filter konfiguriert sind. Daher sollten wir die ungefilterte Antwort von MaxScale sehen:
$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Beim Verbinden mit dem rr-Service-Listener auf Port 3307, der mit unserem Filter konfiguriert ist, wird unser „card_no“-Wert mit einer Kauderwelsch-Ausgabe verschleiert:
$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+
Diese Filterung wird von MaxScale durchgeführt und folgt den Abgleichsregeln in masking.json, die wir zuvor erstellt haben.
Listenfilter
Um alle erstellten Filter aufzulisten, verwenden Sie den Befehl "Filter auflisten":
maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼─────────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking │
├─────────────────┼────────────┼─────────────┤
│ fetch │ │ regexfilter │
└─────────────────┴────────────┴─────────────┘
In den obigen Beispielen haben wir 3 Filter erstellt. Allerdings ist nur der Obfuscates-Kartenfilter mit einem Dienst verknüpft.
Um alle Dienste im Detail anzuzeigen:
maxctrl: show filters
Oder wenn Sie einen bestimmten Dienst anzeigen möchten:
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" │
│ │ } │
└────────────┴──────────────────────────────────────────────────────┘
Filter löschen
Um einen Filter zu löschen, muss man zuerst die Verknüpfung mit den zugehörigen Diensten aufheben. Betrachten Sie beispielsweise die folgenden Filter in MaxScale:
maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter │ Service │ Module │
├─────────────────┼────────────┼───────────┤
│ qla │ │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking │
└─────────────────┴────────────┴───────────┘
Für den qla-Filter können wir einfach den folgenden Befehl verwenden, um ihn zu löschen:
maxctrl: destroy filter qla
OK
Für den Obfuscates-Card-Filter muss die Verknüpfung mit dem rr-Service jedoch aufgehoben werden, und dies erfordert leider eine Änderung der Konfigurationsdatei und einen Neustart von MaxScale. Gehen Sie in das Verzeichnis /var/lib/maxscale/maxscale.cnf.d und suchen Sie rr-service.cnf, öffnen Sie es mit einem Texteditor und entfernen Sie dann die folgende Zeile:
filters=Obfuscates-card
Sie könnten auch die Zeichenfolge "Obfuscates-card" aus der obigen Zeile entfernen und die Zeile "filters" gleich einem leeren Wert lassen. Speichern Sie dann die Datei und starten Sie den MaxScale-Dienst neu, um die Änderungen zu laden:
$ systemctl restart maxscale
Erst dann können wir den Obfuscates-Card-Filter mit dem Befehl „destroy filter“ aus MaxScale entfernen:
maxctrl: destroy filter Obfuscates-card
OK
MaxScale-Verwaltung
Benutzer auflisten
Um alle MaxScale-Benutzer aufzulisten, verwenden Sie den Befehl "Benutzer auflisten":
maxctrl: list users
┌───────┬──────┬────────────┐
│ Name │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin │
└───────┴──────┴────────────┘
Erstellen Sie einen MaxScale-Benutzer
Standardmäßig ist ein erstellter Benutzer ein schreibgeschützter Benutzer:
maxctrl: create user dev mySecret
OK
Geben Sie zum Erstellen eines Administratorbenutzers den Befehl --type=admin an:
maxctrl: create user dba mySecret --type=admin
OK
Löschen Sie einen MaxScale-Benutzer
Um einen Benutzer zu löschen, verwenden Sie einfach den Befehl "Benutzer zerstören":
maxctrl: destroy user dba
OK
Der letzte verbleibende Administrator kann nicht entfernt werden. Erstellen Sie einen Ersatzbenutzer mit Administratorrechten, bevor Sie versuchen, den letzten Benutzer mit Administratorrechten zu entfernen.
MaxScale-Parameter anzeigen
Um alle geladenen Parameter für die MaxScale-Instanz anzuzeigen, verwenden Sie den Befehl „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 │
│ │ } │
└──────────────┴──────────────────────────────────────────────────────────────────────┘
MaxScale-Parameter ändern
- auth_connect_timeout
- auth_read_timeout
- auth_write_timeout
- admin_auth
- admin_log_auth_failures
- passiv
Der Rest der Parameter muss in /etc/maxscale.conf gesetzt werden, was einen Neustart von MaxScale erfordert, um die neuen Änderungen zu übernehmen.
MaxScale-GUI
MaxGUI ist ein neues browserbasiertes Tool zum Konfigurieren und Verwalten von MaxScale, das in Version 2.5 eingeführt wurde. Es ist über Port 8989 des MaxScale-Hosts auf der localhost-Schnittstelle 127.0.0.1 zugänglich. Standardmäßig ist es erforderlich, admin_secure_gui=true festzulegen und die Parameter admin_ssl_key und admin_ssl_cert zu konfigurieren. In diesem Blogbeitrag werden wir jedoch die Verbindung über das einfache HTTP zulassen, indem wir die folgende Zeile unter der [maxctrl]-Direktive in /etc/maxscale.cnf hinzufügen:
admin_secure_gui = false
Starten Sie den MaxScale-Dienst neu, um die Änderung zu laden:
$ systemctl restart maxscale
Da die GUI auf der localhost-Schnittstelle lauscht, können wir SSH-Tunneling verwenden, um von unserer lokalen Workstation aus auf die GUI zuzugreifen:
$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>
Öffnen Sie dann einen Webbrowser, zeigen Sie die URL auf http://127.0.0.1:8989/ und melden Sie sich an. MaxGUI verwendet die gleichen Anmeldeinformationen wie maxctrl, daher ist das Standardpasswort "admin". das Passwort "mariadb". Aus Sicherheitsgründen sollte man eigens für diesen Zweck einen neuen Admin-Benutzer mit einem stärkeren Passwort erstellen. Sobald Sie angemeldet sind, sollten Sie das MaxGUI-Dashboard wie folgt sehen:
Die meisten der MaxCtrl-Verwaltungsbefehle, die wir in dieser Blogserie gezeigt haben, können direkt von dieser GUI ausgeführt werden. Wenn Sie auf die Schaltfläche "Neu erstellen" klicken, wird Ihnen der folgende Dialog angezeigt:
Wie Sie sehen, können alle wichtigen MaxScale-Komponenten direkt verwaltet werden von der GUI, mit einem netten, intuitiven, sauberen Aussehen, macht die Dinge viel einfacher und unkomplizierter zu verwalten. Beispielsweise kann das Zuordnen eines Filters direkt über die Benutzeroberfläche erfolgen, ohne dass der MaxScale-Dienst neu gestartet werden muss, wie im Abschnitt „Einen Filter an einen Dienst anhängen“ in diesem Blogbeitrag gezeigt.
Weitere Informationen zu dieser neuen GUI finden Sie in dieser MaxGUI-Anleitung.
Protokollverwaltung
Logging-Parameter anzeigen
Um die Logging-Parameter anzuzeigen, verwenden Sie den Befehl „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 │
│ │ } │
│ │ } │
└────────────────────┴────────────────────────────────┘
Protokollierungsparameter bearbeiten
Alle oben gezeigten Protokollierungsparameter können über den MaxCtrl-Befehl zur Laufzeit konfiguriert werden. Zum Beispiel können wir log_info einschalten, indem wir den Befehl „alter logging“ verwenden:
maxctrl: alter logging log_info true
Protokolle rotieren
Standardmäßig stellt MaxScale eine Konfigurationsdatei für die Protokollrotation unter /etc/logrotate.d/maxscale_logrotate bereit. Basierend auf der Protokollrotationskonfiguration wird die Protokolldatei monatlich rotiert und verwendet den Befehl „rotate logs“ von MaxCtrl. Mit dem folgenden Befehl können wir eine sofortige Log-Rotation erzwingen:
$ logrotate --force /etc/logrotate.d/maxscale_logrotate
Überprüfen Sie dies mit dem folgenden Befehl:
$ 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
Fazit
Wir haben das Ende der Reihe der MaxScale-Bereitstellung und -Verwaltung mit dem MaxCtrl-Client erreicht. In dieser Blogserie haben wir einige verschiedene neueste MaxScale-Versionen verwendet (relativ zum Datum der Erstellung) und wir haben in jeder Version viele signifikante Verbesserungen gesehen.
Kudos an das MariaDB MaxScale-Team für seine harte Arbeit, MaxScale zu einem der besten Datenbank-Load-Balancer-Tools auf dem Markt zu machen.