Introduction
ProxySQL est un proxy SQL de haute performance. ProxySQL fonctionne comme un démon surveillé par un processus de contrôle. Le processus surveille le démon et le redémarre en cas de panne afin de minimiser le temps d'arrêt.
Le démon accepte le trafic entrant des clients MySQL et le transmet aux serveurs MySQL en arrière-plan.
Le proxy est conçu pour fonctionner en continu sans avoir besoin d'être redémarré. La plupart des configurations peuvent être effectuées au moment de l'exécution en utilisant des requêtes similaires aux instructions SQL. Il s'agit notamment des paramètres d'exécution, du regroupement de serveurs et des paramètres liés au trafic.
Installation
Sur notre systèmes nous ajoutons les packages si ces derniers ne sont pas présents.
# apt-get install default-mysql-client # apt-get install -y gnupg2
Nous ajoutons la clé GPG ainsi que le repository
# apt-get install -y lsb-release # wget -O - 'https://repo.proxysql.com/ProxySQL/repo_pub_key' | apt-key add - # echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.1.x/$(lsb_release -sc)/ ./ | tee /etc/apt/sources.list.d/proxysql.list
Nous installons le service ProxySQL
# apt-get update # apt install proxysql
Première connexion au service ProxySQL
Note:
Le mot de passe par défaut : admin
root@proxysql:~# mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> ' Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. ProxySQLAdmin>
Afficher les base de données
ProxySQLAdmin> SHOW DATABASES; +-----+---------------+-------------------------------------+ | seq | name | file | +-----+---------------+-------------------------------------+ | 0 | main | | | 2 | disk | /var/lib/proxysql/proxysql.db | | 3 | stats | | | 4 | monitor | | | 5 | stats_history | /var/lib/proxysql/proxysql_stats.db | +-----+---------------+-------------------------------------+ 5 rows in set (0.000 sec)
Afficher les tables
ProxySQLAdmin> SHOW TABLES; +----------------------------------------------------+ | tables | +----------------------------------------------------+ | global_variables | | mysql_aws_aurora_hostgroups | | mysql_collations | | mysql_firewall_whitelist_rules | | mysql_firewall_whitelist_sqli_fingerprints | | mysql_firewall_whitelist_users | | mysql_galera_hostgroups | | mysql_group_replication_hostgroups | | mysql_query_rules | | mysql_query_rules_fast_routing | | mysql_replication_hostgroups | | mysql_servers | | mysql_users | | proxysql_servers | | restapi_routes | | runtime_checksums_values | | runtime_global_variables | | runtime_mysql_aws_aurora_hostgroups | | runtime_mysql_firewall_whitelist_rules | | runtime_mysql_firewall_whitelist_sqli_fingerprints | | runtime_mysql_firewall_whitelist_users | | runtime_mysql_galera_hostgroups | | runtime_mysql_group_replication_hostgroups | | runtime_mysql_query_rules | | runtime_mysql_query_rules_fast_routing | | runtime_mysql_replication_hostgroups | | runtime_mysql_servers | | runtime_mysql_users | | runtime_proxysql_servers | | runtime_restapi_routes | | runtime_scheduler | | scheduler | +----------------------------------------------------+ 32 rows in set (0.000 sec) ProxySQLAdmin>
Note:
ProxySQL a 3 zones où la configuration peut résider :
- MEMORY (En cours d'utilisation)
- RUNTIME (la configuration de production)
- DISK (configuration durable, sauvegardée dans une base de données SQLITE)
Lorsque vous modifiez un paramètre, vous le modifiez dans la zone MEMORY. Cela est fait par conception pour vous permettre de tester les changements avant de les mettre en production (RUNTIME), ou de les sauvegarder sur le disque.
Service management
Systemctl service
Démarrage du service ProxySQL:
# systemctl start proxysql
Redémarrage du service ProxySQL:
# systemctl restart proxysql
Arrêt du service ProxySQL:
# systemctl stop proxysql
Admin interface
Arrêt du service ProxySQL:
$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='ProxySQLAdmin> ' Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 4 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. ProxySQLAdmin> proxysql stop
Redémarrage du service ProxySQL:
$ mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='ProxySQLAdmin> ' Warning: Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 4 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. ProxySQLAdmin> proxysql restart
Configuration Initiale
root@proxysql:~# mysql -u admin -p -h 127.0.0.1 -P 6032 --prompt='ProxySQLAdmin> ' Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.5.30 (ProxySQL Admin Module) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. ProxySQLAdmin>
Nous vérifions que la configuration est vide en nous assurant qu'il n'y a pas d'entrées dans les tables mysql_servers, mysql_replication_hostgroups et mysql_query_rules.
ProxySQLAdmin> SELECT * FROM mysql_servers; Empty set (0.00 sec) ProxySQLAdmin> SELECT * from mysql_replication_hostgroups; Empty set (0.00 sec) ProxySQLAdmin> SELECT * from mysql_query_rules; Empty set (0.00 sec)
Ajout de nœuds au pool de serveurs ProxySQL
Note:
Nous considérons que nous disposons déjà d'un cluster MariaDB/Galera
Pour ce faire, nous devons “INSERT” l’adresse IP et le groupe d’hôtes initial de chaque serveur dans la table “mysql_servers”, qui contient la liste des serveurs avec lesquels ProxySQL peut interagir.
Ajoutez chacun des trois serveurs MySQL/MariaDB, en veillant à remplacer les exemples d’adresses IP dans les commandes ci-dessous.
Note:
ProxySQL utilise le concept de groupes d'hôtes pour regrouper les nœuds de cluster. Cela vous permet d'équilibrer la charge dans un cluster en acheminant différents types de trafic vers différents groupes.
Il existe de nombreuses façons de configurer les groupes d'hôtes (par exemple source et replicas, read et write load, etc.) et chaque nœud peut être membre de plusieurs groupes d'hôtes.
ProxySQLAdmin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (0,'10.75.168.201',3306); Query OK, 1 row affected (0.01 sec) ProxySQLAdmin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (0,'10.75.168.202',3306); Query OK, 1 row affected (0.01 sec) ProxySQLAdmin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (0,'10.75.168.203',3306); Query OK, 1 row affected (0.00 sec) ProxySQLAdmin> SELECT * FROM mysql_servers; +--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | hostgroup_id | hostname | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment | +--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | 0 | 10.75.168.201 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 0 | 10.75.168.202 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 0 | 10.75.168.203 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | +--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ 3 rows in set (0.000 sec)
Note:
Pour supprimer un host
ProxySQLAdmin> delete from mysql_servers where hostname like '10.75.168.202'; Query OK, 1 row affected (0.000 sec)
ProxySQL Monitoring User
Création d'un utilisateur
Nous devons créer un utilisateur dédié avec le privilège USAGE qui sera utilisé par ProxySQL pour surveiller la santé des instances.
Ouvrez l’invite interactive MySQL/MariaDB, qui vous demandera à nouveau le mot de passe * root *.
# mysql -u root -p
Créez ensuite l’utilisateur dédié, que nous avons appelé * proxysql * ici. Assurez-vous de changer le mot de passe en un mot fort.
Note:
Cette action n'est à réaliser que sur un seul nœud de notre cluster.
MariaDB [(none)]> CREATE USER 'proxysql'@'%' IDENTIFIED BY 'My_P@ssw0rd'; Query OK, 0 rows affected (0.038 sec) MariaDB [(none)]> GRANT USAGE ON *.* TO 'proxysql'@'%'; Query OK, 0 rows affected (0.034 sec)
Enfin, appliquez les modifications.
mysql> FLUSH PRIVILEGES;
En raison de la réplication de groupe, une fois que vous avez ajouté l’utilisateur pour la surveillance de l’intégrité à un nœud MySQL/MariaDB, celui-ci est entièrement configuré sur les trois nœuds.
Ensuite, nous devons mettre à jour ProxySQL avec les informations de cet utilisateur afin qu’il puisse accéder aux nœuds MySQL/MariaDB.
Configuration de ProxySQL
Pour configurer ProxySQL afin qu’il utilise le nouveau compte d’utilisateur lors de la surveillance des nœuds, nous allons UPDATE la variable de configuration appropriée.
De retour dans l’interface d’administration ProxySQL, mettez à jour la variable “mysql-monitor_username” avec le nom d’utilisateur du nouveau compte.
ProxySQLAdmin> UPDATE global_variables SET variable_value='proxysql' WHERE variable_name='mysql-monitor_username'; Query OK, 1 row affected (0.002 sec) ProxySQLAdmin> UPDATE global_variables SET variable_value='My_P@ssw0rd' WHERE variable_name='mysql-monitor_password'; Query OK, 1 row affected (0.002 sec)
Pour charger cette configuration au moment de l'exécution, lancez la commande LOAD. Pour sauvegarder ces changements sur le disque (en s'assurant qu'ils persistent après l'arrêt de ProxySQL), lancez la commande SAVE.
ProxySQLAdmin> LOAD MYSQL VARIABLES TO RUNTIME; Query OK, 0 rows affected (0.002 sec) ProxySQLAdmin> SAVE MYSQL VARIABLES TO DISK; Query OK, 140 rows affected (0.016 sec)
Vérification de la santé des Backend
Une fois que la configuration est active, vérifiez le statut des backends MySQL dans les tables de la base de données de surveillance dans ProxySQL Admin :
ProxySQLAdmin> SHOW TABLES FROM monitor; +--------------------------------------+ | tables | +--------------------------------------+ | mysql_server_aws_aurora_check_status | | mysql_server_aws_aurora_failovers | | mysql_server_aws_aurora_log | | mysql_server_connect_log | | mysql_server_galera_log | | mysql_server_group_replication_log | | mysql_server_ping_log | | mysql_server_read_only_log | | mysql_server_replication_lag_log | +--------------------------------------+ 9 rows in set (0.000 sec)
Chaque type de contrôle a une table d'enregistrement dédiée, chacun doit être contrôlé individuellement :
ProxySQLAdmin> SELECT * FROM monitor.mysql_server_connect_log ORDER BY time_start_us DESC LIMIT 6; +---------------+------+------------------+-------------------------+---------------+ | hostname | port | time_start_us | connect_success_time_us | connect_error | +---------------+------+------------------+-------------------------+---------------+ | 10.75.168.202 | 3306 | 1620249978638316 | 1129 | NULL | | 10.75.168.203 | 3306 | 1620249977496438 | 1038 | NULL | | 10.75.168.201 | 3306 | 1620249976738190 | 885 | NULL | +---------------+------+------------------+-------------------------+---------------+ 3 rows in set (0.000 sec) ProxySQLAdmin>
ProxySQLAdmin> SELECT * FROM monitor.mysql_server_ping_log ORDER BY time_start_us DESC LIMIT 6; +---------------+------+------------------+----------------------+------------+ | hostname | port | time_start_us | ping_success_time_us | ping_error | +---------------+------+------------------+----------------------+------------+ | 10.75.168.202 | 3306 | 1620250016923040 | 320 | NULL | | 10.75.168.201 | 3306 | 1620250016803945 | 271 | NULL | | 10.75.168.203 | 3306 | 1620250016686059 | 412 | NULL | | 10.75.168.201 | 3306 | 1620250006866183 | 294 | NULL | | 10.75.168.202 | 3306 | 1620250006776718 | 348 | NULL | | 10.75.168.203 | 3306 | 1620250006682616 | 379 | NULL | +---------------+------+------------------+----------------------+------------+ 6 rows in set (0.000 sec) ProxySQLAdmin>
Note:
Une chose importante à noter ici est que la surveillance des connexions et des ping est effectuée sur la base mysql_servers configurés avant même que ceux-ci ne soient chargés dans RUNTIME.
Cette approche est intentionnelle, de cette façon, il est possible d'effectuer des contrôles de santé de base avant d'ajouter les nœuds en production.
Après avoir vérifié que les serveurs sont surveillés correctement et sont en bonne santé, activez la configuration :
ProxySQLAdmin> LOAD MYSQL SERVERS TO RUNTIME; Query OK, 0 rows affected (0.005 sec) ProxySQLAdmin> SAVE MYSQL SERVERS TO DISK; Query OK, 0 rows affected (0.005 sec) ProxySQLAdmin> SELECT * FROM mysql_servers; +--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | hostgroup_id | hostname | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment | +--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ | 0 | 10.75.168.201 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 0 | 10.75.168.202 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | | 0 | 10.75.168.203 | 3306 | 0 | ONLINE | 1 | 0 | 1000 | 0 | 0 | 0 | | +--------------+---------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+ 3 rows in set (0.000 sec)
Création User du client ProxySQL
ProxySQL doit avoir des utilisateurs qui peuvent accéder aux noeuds backend pour gérer les connexions.
Pour ajouter un utilisateur, insérez les informations d'identification dans la table mysql_users :
ProxySQLAdmin> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('root','',0); Query OK, 1 row affected (0.000 sec) ProxySQLAdmin> INSERT INTO mysql_users(username,password,default_hostgroup) VALUES ('stnduser','stnduser',0); Query OK, 1 row affected (0.000 sec) ProxySQLAdmin> SELECT * FROM mysql_users; +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+ | username | password | active | use_ssl | default_hostgroup | default_schema | schema_locked | transaction_persistent | fast_forward | backend | frontend | max_connections | attributes | comment | +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+ | root | | 1 | 0 | 0 | NULL | 0 | 1 | 0 | 1 | 1 | 10000 | | | | stnduser | stnduser | 1 | 0 | 0 | NULL | 0 | 1 | 0 | 1 | 1 | 10000 | | | +----------+----------+--------+---------+-------------------+----------------+---------------+------------------------+--------------+---------+----------+-----------------+------------+---------+ 2 rows in set (0.000 sec) ProxySQLAdmin>
Note:
ProxySQL ne crypte pas actuellement les mots de passe.
Chargez l'utilisateur dans l'espace d'exécution et enregistrez ces changements sur le disque (en vous assurant qu'ils persistent après la fermeture de ProxySQL) :
ProxySQLAdmin> LOAD MYSQL USERS TO RUNTIME; Query OK, 0 rows affected (0.000 sec) ProxySQLAdmin> SAVE MYSQL USERS TO DISK; Query OK, 0 rows affected (0.031 sec)
Pour confirmer que l'utilisateur a été correctement configuré, vous pouvez essayer de vous connecter :
root@proxysql:~# mysql -u stnduser -pstnduser -h 127.0.0.1 -P 6033 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 11 Server version: 5.5.30 (ProxySQL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
Pour fournir un accès en lecture/écriture au cluster pour ProxySQL, ajoutez cet utilisateur sur l'un des nœuds du cluster :
Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 112 Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10 Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE USER 'stnduser'@'10.75.168.204' IDENTIFIED BY 'stnduser'; Query OK, 0 rows affected (0.037 sec) MariaDB [(none)]> GRANT ALL ON *.* TO 'stnduser'@'10.75.168.204'; Query OK, 0 rows affected (0.029 sec)
Attention:
Troubleshooting: Si vous rencontrez l'erreur suivante lors de requête SQL: * ERROR 9001 (HY000) at line 1: Max connect timeout reached while reaching hostgroup 0 after 10000ms
Vérifier que le user fait partie du bon hostgroup. Dans l'exemple ci-dessous le user stnduser ne fait pas partie du bon hostgroup.
ProxySQLAdmin> SELECT username, default_hostgroup FROM mysql_users; +----------+-------------------+ | username | default_hostgroup | +----------+-------------------+ | root | 1 | | stnduser | 1 | +----------+-------------------+ 2 rows in set (0.000 sec) ProxySQLAdmin> SELECT hostgroup_id, hostname FROM mysql_servers; +--------------+---------------+ | hostgroup_id | hostname | +--------------+---------------+ | 0 | 10.75.168.201 | | 0 | 10.75.168.202 | | 0 | 10.75.168.203 | +--------------+---------------+ 3 rows in set (0.000 sec)