MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MaxScale Basic Management mit MaxCtrl für MariaDB-Cluster – Teil Zwei

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.

Jeder Filter hat seine eigenen Konfigurationsmöglichkeiten. Filter werden üblicherweise an einen MaxScale-Dienst angehängt. Beispielsweise kann ein Binlog-Filter auf den Binlogrouter-Dienst angewendet werden, um nur eine Teilmenge von Daten auf einen Slave-Server zu replizieren, was den Speicherplatz für große Tabellen enorm reduzieren kann. Sehen Sie sich die MaxScale-Filterdokumentation an, um zu erfahren, wie Sie die Parameter für den entsprechenden Filter richtig konfigurieren.

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.