MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Gestion de base de MaxScale à l'aide de MaxCtrl pour le cluster MariaDB - Deuxième partie

Dans l'article de blog précédent, nous avons couvert 4 composants de gestion de base à l'aide du client de ligne de commande MaxCtrl. Dans cet article de blog, nous allons couvrir la partie restante des composants MaxScale qui sont couramment utilisés dans un cluster MariaDB :

  • Gestion des filtres
  • Gestion MaxScale
  • Gestion de la journalisation

Toutes les commandes de ce billet de blog sont basées sur MaxScale 2.5.3.

Gestion des filtres

Le filtre est un module de MaxScale qui agit comme moteur de traitement et de routage pour un service MaxScale. Le filtrage se produit entre la connexion client à MaxScale et la connexion MaxScale aux serveurs de base de données principaux. Ce chemin (côté client de MaxScale vers les serveurs de base de données réels) peut être considéré comme un pipeline, des filtres peuvent ensuite être placés dans ce pipeline pour surveiller, modifier, copier ou bloquer le contenu qui le traverse.

De nombreux filtres peuvent être appliqués pour étendre les capacités de traitement d'un service MaxScale, comme indiqué dans le tableau suivant :

Nom du filtre

Description

Binlog

Replique sélectivement les événements du journal binaire sur des serveurs esclaves combinés avec un service binlogrouter.

Cache

Un cache simple capable de mettre en cache le résultat des SELECT, de sorte que les SELECT identiques suivants soient servis directement par MaxScale, sans que les requêtes soient acheminées vers aucun serveur.

Lecture critique cohérente

Permet d'effectuer des lectures critiques cohérentes via MaxScale tout en permettant la mise à l'échelle des lectures non critiques.

Pare-feu de base de données

Bloque les requêtes qui correspondent à un ensemble de règles. Ce filtre doit être considéré comme une solution optimale destinée à protéger contre les abus accidentels plutôt que contre les attaques malveillantes.

Astuce

Ajoute des conseils de routage à un service, demandant au routeur d'acheminer une requête vers un certain type de serveur.

Insérer un flux

Convertit les insertions en masse en flux de données CSV consommés par le serveur principal via le mécanisme LOAD DATA LOCAL INFILE

Lua

Appelle un ensemble de fonctions dans un script Lua.

Masquage

Obfusque la valeur renvoyée d'une colonne particulière

Maxrows

Restriction du nombre de lignes qu'un SELECT, une instruction préparée ou une procédure stockée peut renvoyer à l'application cliente.

Serveur nommé

Achemine les requêtes vers les serveurs en fonction des correspondances d'expressions régulières (regex).

Query Log All

Journalise le contenu de la requête dans un fichier au format CSV.

Regex

Réécrit le contenu de la requête à l'aide de correspondances d'expressions régulières et de substitution de texte.

Faire des copies des requêtes du client et envoyer les copies à un autre service au sein de MariaDB MaxScale.

Accélérateur

Remplace et étend la fonctionnalité limit_queries du filtre Database Firewall

Haut

Surveille les performances de la requête de l'instruction SQL sélectionnée qui passe par le filtre.

Surveillance des performances des transactions

Surveille chaque instruction SQL qui passe par le filtre, regroupée par transaction, pour l'analyse des performances des transactions.

Chaque filtre a ses propres façons de configurer. Les filtres sont généralement attachés à un service MaxScale. Par exemple, un filtre binlog peut être appliqué au service binlogrouter, pour ne répliquer qu'un sous-ensemble de données sur un serveur esclave, ce qui peut réduire considérablement l'espace disque pour les tables volumineuses. Consultez la documentation des filtres MaxScale pour savoir comment configurer correctement les paramètres du filtre correspondant.

Créer un filtre

Chaque filtre MaxScale a sa propre façon d'être configuré. Dans cet exemple, nous allons créer un filtre de masquage, pour masquer nos données sensibles pour la colonne "card_no" dans notre table "credit_cards". Le masquage nécessite un fichier de règles, écrit au format JSON. Tout d'abord, créez un répertoire pour héberger nos fichiers de règles :

$ mkdir /var/lib/maxscale/rules

Ensuite, créez un fichier texte :

$ vi /var/lib/maxscale/rules/masking.json

Spécifiez les lignes comme ci-dessous :

{
    "rules": [
        {
            "obfuscate": {
                "column": "card_no"
            }
        }
    ]
}

Les règles simples ci-dessus masqueront simplement la sortie de la colonne card_no pour toutes les tables, afin de protéger les données sensibles visibles par le client MariaDB.

Une fois le fichier de règles créé, nous pouvons créer le filtre à l'aide de la commande suivante :

maxctrl: create filter Obfuscates-card masking rules=/var/lib/maxscale/rules/masking.json
OK

Notez que certains filtres nécessitent des paramètres différents. En ce qui concerne ce filtre de masquage, le paramètre de base est "règles", où nous devons spécifier le fichier de règles de masquage créé au format JSON.

Attacher un filtre à un service

Un filtre ne peut être activé qu'en le rattachant à un service. La modification d'un service existant à l'aide de MaxCtrl n'est prise en charge que par certains paramètres, et l'ajout d'un filtre n'en fait pas partie. Nous devons ajouter le composant de filtre sous le fichier de configuration de service de MaxScale pour attacher essentiellement le filtre. Dans cet exemple, nous allons appliquer le filtre "Obfuscates-card" à notre service round-robin existant appelé rr-service.

Accédez au répertoire /var/lib/maxscale/maxscale.cnf.d et recherchez rr-service.cnf, ouvrez-le avec un éditeur de texte, puis ajoutez la ligne suivante :

filters=Obfuscates-card

Un redémarrage de MaxScale est nécessaire pour charger la nouvelle modification :

$ systemctl restart maxscale

Pour tester le filtre, nous allons utiliser un client MariaDB et comparer la sortie en nous connectant à deux services différents. Notre rw-service est attaché à un listener écoutant sur le port 3306, sans aucun filtre configuré. Par conséquent, nous devrions voir la réponse non filtrée de 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 |
+----+-----------+-----------------+-------------+-----------+---------+

Lors de la connexion à l'écouteur rr-service sur le port 3307, configuré avec notre filtre, notre valeur "card_no" est masquée par une sortie charabia :

$ 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 |
+----+-----------+-----------------+-------------+-----------+---------+

Ce filtrage est effectué par MaxScale, en suivant les règles de correspondance dans masking.json que nous avons créées précédemment.

Liste des filtres

Pour répertorier tous les filtres créés, utilisez la commande "list filter" :

maxctrl: list filters
┌─────────────────┬────────────┬─────────────┐
│ Filter          │ Service    │ Module      │
├─────────────────┼────────────┼─────────────┤
│ qla             │            │ qlafilter   │
├─────────────────┼────────────┼─────────────┤
│ Obfuscates-card │ rr-service │ masking     │
├─────────────────┼────────────┼─────────────┤
│ fetch           │            │ regexfilter │
└─────────────────┴────────────┴─────────────┘

Dans les exemples ci-dessus, nous avons créé 3 filtres. Cependant, seul le filtre Obfuscates-card est lié à un service.

Pour afficher tous les services en détail :

maxctrl: show filters

Ou si vous souhaitez afficher un service particulier :

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"                    │
│            │ }                                                    │
└────────────┴──────────────────────────────────────────────────────┘

Supprimer un filtre

Pour supprimer un filtre, il faut d'abord se dissocier des services associés. Par exemple, considérez les filtres suivants dans MaxScale :

 maxctrl: list filters
┌─────────────────┬────────────┬───────────┐
│ Filter          │ Service    │ Module    │
├─────────────────┼────────────┼───────────┤
│ qla             │            │ qlafilter │
├─────────────────┼────────────┼───────────┤
│ Obfuscates-card │ rr-service │ masking   │
└─────────────────┴────────────┴───────────┘

Pour le filtre qla, nous pouvons simplement utiliser la commande suivante pour le supprimer :

 maxctrl: destroy filter qla
OK

Cependant, pour le filtre Obfuscates-card, il doit être dissocié avec rr-service et malheureusement, cela nécessite une modification du fichier de configuration et un redémarrage de MaxScale. Accédez au répertoire /var/lib/maxscale/maxscale.cnf.d et recherchez rr-service.cnf, ouvrez-le avec un éditeur de texte, puis supprimez la ligne suivante :

filters=Obfuscates-card

Vous pouvez également supprimer la chaîne "Obfuscates-card" de la ligne ci-dessus et laisser la ligne "filters" égale à une valeur vide. Ensuite, enregistrez le fichier et redémarrez le service MaxScale pour charger les modifications :

$ systemctl restart maxscale

Ce n'est qu'alors que nous pourrons supprimer le filtre Obfuscates-card de MaxScale à l'aide de la commande "destroy filter" :

maxctrl: destroy filter Obfuscates-card
OK

Gestion MaxScale

Répertorier les utilisateurs

Pour lister tous les utilisateurs MaxScale, utilisez la commande "list users":

maxctrl: list users
┌───────┬──────┬────────────┐
│ Name  │ Type │ Privileges │
├───────┼──────┼────────────┤
│ admin │ inet │ admin      │
└───────┴──────┴────────────┘

Créer un utilisateur MaxScale

Par défaut, un utilisateur créé est un utilisateur en lecture seule :

 maxctrl: create user dev mySecret
OK

Pour créer un utilisateur administrateur, spécifiez la commande --type=admin :

 maxctrl: create user dba mySecret --type=admin
OK

Supprimer un utilisateur MaxScale

Pour supprimer un utilisateur, utilisez simplement la commande "destroy user" :

 maxctrl: destroy user dba
OK

Le dernier utilisateur administratif restant ne peut pas être supprimé. Créez un utilisateur administratif de remplacement avant de tenter de supprimer le dernier utilisateur administratif.

Afficher les paramètres MaxScale

Pour afficher tous les paramètres chargés pour l'instance MaxScale, utilisez la commande "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                                         │
│              │ }                                                                    │
└──────────────┴──────────────────────────────────────────────────────────────────────┘

Modifier les paramètres MaxScale

  • auth_connect_timeout
  • auth_read_timeout
  • auth_write_timeout
  • admin_auth
  • admin_log_auth_failures
  • passif

Le reste des paramètres doit être défini dans /etc/maxscale.conf, ce qui nécessite un redémarrage de MaxScale pour appliquer les nouvelles modifications.

Interface graphique MaxScale

MaxGUI est un nouvel outil basé sur un navigateur pour configurer et gérer MaxScale, introduit dans la version 2.5. Il est accessible via le port 8989 de l'hôte MaxScale sur l'interface localhost, 127.0.0.1. Par défaut, il est nécessaire de définir admin_secure_gui=true et de configurer les paramètres admin_ssl_key et admin_ssl_cert. Cependant, dans cet article de blog, nous allons autoriser la connectivité via HTTP simple en ajoutant la ligne suivante sous la directive [maxctrl] dans /etc/maxscale.cnf :

admin_secure_gui = false

Redémarrez le service MaxScale pour charger la modification :

$ systemctl restart maxscale

Étant donné que l'interface graphique écoute sur l'interface localhost, nous pouvons utiliser le tunnel SSH pour accéder à l'interface graphique depuis notre poste de travail local :

$ ssh -L 8989:localhost:8989 [email protected]<Maxscale public IP address>

Ensuite, ouvrez un navigateur Web, pointez l'URL vers http://127.0.0.1:8989/ et connectez-vous. MaxGUI utilise les mêmes informations d'identification que maxctrl, ainsi le mot de passe par défaut est "admin" avec le mot de passe "mariadb". Pour des raisons de sécurité, il convient de créer un nouvel utilisateur administrateur avec un mot de passe plus fort spécifiquement à cette fin. Une fois connecté, vous devriez voir le tableau de bord MaxGUI comme ci-dessous :

La plupart des commandes de gestion MaxCtrl que nous avons présentées dans cette série de blogs peuvent être effectuée directement à partir de cette interface graphique. Si vous cliquez sur le bouton "Créer nouveau", la boîte de dialogue suivante s'affichera :

Comme vous pouvez le voir, tous les composants MaxScale importants peuvent être gérés directement de l'interface graphique, avec un joli look épuré et intuitif, rend les choses beaucoup plus simples et plus simples à gérer. Par exemple, l'association d'un filtre peut être effectuée directement à partir de l'interface utilisateur, sans qu'il soit nécessaire de redémarrer le service MaxScale, comme indiqué dans la section "Attacher un filtre à un service" de cet article de blog.

Pour plus d'informations sur cette nouvelle interface graphique, consultez ce guide MaxGUI.

Gestion de la journalisation

Afficher les paramètres de journalisation

Pour afficher les paramètres de journalisation, utilisez la commande "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      │
│                    │     }                          │
│                    │ }                              │
└────────────────────┴────────────────────────────────┘

Modifier les paramètres de journalisation

Tous les paramètres de journalisation indiqués ci-dessus peuvent être configurés via la commande MaxCtrl au moment de l'exécution. Par exemple, nous pouvons activer le log_info en utilisant la commande "alter logging":

maxctrl: alter logging log_info true

Faire pivoter les journaux

Par défaut, MaxScale fournit un fichier de configuration de rotation des journaux sous /etc/logrotate.d/maxscale_logrotate. Sur la base de la configuration de rotation des journaux, le fichier journal fait l'objet d'une rotation mensuelle et utilise la commande "rotate logs" de MaxCtrl. Nous pouvons forcer la rotation des journaux à se produire immédiatement avec la commande suivante :

$ logrotate --force /etc/logrotate.d/maxscale_logrotate

Vérifiez avec la commande suivante :

$ 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

Conclusion

Nous avons atteint la fin de la série de déploiement et de gestion de MaxScale à l'aide du client MaxCtrl. Dans cette série de blogs, nous avons utilisé quelques versions différentes de MaxScale (par rapport à la date de rédaction) et nous avons constaté de nombreuses améliorations significatives dans chaque version.

Félicitations à l'équipe MariaDB MaxScale pour son travail acharné visant à faire de MaxScale l'un des meilleurs outils d'équilibrage de charge de base de données sur le marché.