Commencement de la documentation ProxySQL

This commit is contained in:
Eric Morino 2023-03-10 16:31:23 +01:00
parent 6007516e64
commit 3a9311f1dc

185
HowtoMySQL/ProxySQL.md Normal file
View file

@ -0,0 +1,185 @@
---
categories: databases
title: Howto ProxySQL : Outil de proxyfication et de haute disponibilité pour MySQL.
---
* Github ProxySQL : <https://github.com/sysown/proxysql>
* Documentation ProxySQL : <https://proxysql.com/Documentation/>
* Dépot packet Debian : <https://repo.proxysql.com/ProxySQL/>
ProxySQL est un proxy haute performance et haute disponibilité pour MySQL et ses dérivées comme Percona Server ou MariaDB
## Installation
Plusieurs méthodes d'installation de ProxySQL sont disponible, on va décrire comment l'installer via les dépots officiel pour Debian / Ubuntu
### Ajout du dépôt
~~~
# apt-get install -y --no-install-recommends lsb-release wget apt-transport-https ca-certificates gnupg
# curl -fsSL https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/repo_pub_key | tee /etc/apt/trusted.gpg.d/ProxySQL-keyring.asc
# echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.5.x/$(lsb_release -sc)/ ./ | tee /etc/apt/sources.list.d/proxysql.list
~~~
Voici les différentes release disponible de ProxySQL
* Pour la version 2.4.x releases https://repo.proxysql.com/ProxySQL/proxysql-2.4.x/$(lsb_release -sc)/ ./
* Pour la version 2.3.x releases https://repo.proxysql.com/ProxySQL/proxysql-2.3.x/$(lsb_release -sc)/ ./
* Pour la version 2.2.x releases https://repo.proxysql.com/ProxySQL/proxysql-2.2.x/$(lsb_release -sc)/ ./
### Installation de ProxySQL
~~~
# apt update
# apt install proxysql
~~~
## Configurer ProxySQL la première fois
Juste après l'installation de ProxySQL nous devons faire quelques opérations de configuration
Par défaut ProxySQL écoute sur le port 6032, on démarre le service comme ceci :
~~~
# systemctl start proxysql.service
~~~
Se connecter à l'interface d'admin de ProxySQL :
~~~
# mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt 'ProxySQL Admin> '
~~~
Vérifiez que la configuration est bien vierge en vérifiant qu'il n'y a aucune entrées dans les tables *mysql_servers, mysql_replication_hostgroups et mysql_query_rules*
~~~
ProxySQL Admin> SELECT * FROM mysql_servers;
Empty set (0.00 sec)
ProxySQL Admin> SELECT * from mysql_replication_hostgroups;
Empty set (0.00 sec)
ProxySQL Admin> SELECT * from mysql_query_rules;
Empty set (0.00 sec)
~~~
### Changement du mot de passe compte admin
Le mot de passe par défaut du compte admin est 'admin', on peux changer ça comme ceci dans l'interface d'admin :
~~~
ProxySQL Admin> set admin-admin_credentials="admin:admin;admin:IkjeevgujHus"
~~~
On sauvegarde la configuration de l'admin en mémoire :
~~~
ProxySQL Admin> LOAD ADMIN VARIABLES TO RUNTIME;
~~~
Puis rendre persistant les changement de l'admin sur le disque :
~~~
ProxySQL Admin> SAVE ADMIN VARIABLES FROM RUNTIME;
~~
Le datadir de ProxySQL est dans */var/lib/proxysql*, si pour une raison ou une autre on veux réinialisé toutes la configuration de proxysql :
~~~
# service proxysql stop && service proxysql initial
~~~
Ceci réinitialise le datadir de ProxySQL baser sur les fichiers de configuration qui sont dans */etc/proxysql/proxysql.cnf*
## Ajouter des Backend
Dans ProxySQL les backend sont les serveurs sql sur lequels ProxySQL doit se connecter.
Pour cet exemple on va ajouter 2 serveurs SQL, on doit les ajouter dans la table *mysql_servers*
~~~
ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'192.168.0.1',3306);
Query OK, 1 row affected (0.01 sec)
ProxySQL Admin> INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (1,'192.168.0.2',3306);
Query OK, 1 row affected (0.01 sec)
SELECT * FROM mysql_servers;
+--------------+-----------+------+--------+--------+-------------+-----------------+---------------------+
| hostgroup_id | hostname | port | status | weight | compression | max_connections | max_replication_lag |
+--------------+-----------+------+--------+--------+-------------+-----------------+---------------------+
| 1 | 192.168.0.1 | 3306 | ONLINE | 1 | 0 | 1000 | 0 |
| 1 | 192.168.0.2 | 3306 | ONLINE | 1 | 0 | 1000 | 0 |
+--------------+-----------+------+--------+--------+-------------+-----------------+---------------------+
2 rows in set (0.00 sec)
~~~
ProxySQL considère les backend configurer avec *read_only = 0* comme des instances d'écriture (WRITER), et les instances avec *read_only = 1* comme des répliques.
Il faut donc s'assurer ques ces variables soit définie correctement sur toutes les instances, car ProxySQL prendra les décisions de routage en fonction de cette valeur.
## Configuration du monitoring
ProxySQL surveille en permanence les backends du serveur MySQL configurés pour identifier l'état de santé.
Les informations d'identification pour la surveillance des backends doivent être créées dans MySQL et également configurées dans ProxySQL avec les intervalles de vérification spécifiques à l'environnement.
On créer un utlisateur sur le serveur SQL primaire :
~~~
MariaDB> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
Query OK, 1 row affected (0.00 sec)
~~~
Et on ajoute l'utilisateur et son mot de passe dans ProxySQL :
~~~
ProxySQL Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username';
Query OK, 1 row affected (0.00 sec)
ProxySQL Admin> UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_password';
Query OK, 1 row affected (0.00 sec)
~~~
On configure ensuite les différentes intervales de surveillance, en secondes :
~~~
ProxySQL Admin> UPDATE global_variables SET variable_value='2000' WHERE variable_name IN ('mysql-monitor_connect_interval','mysql-monitor_ping_interval','mysql-monitor_read_only_interval');
Query OK, 3 rows affected (0.00 sec)
ProxySQL Admin> SELECT * FROM global_variables WHERE variable_name LIKE 'mysql-monitor_%';
+----------------------------------------+---------------------------------------------------+
| variable_name | variable_value |
+----------------------------------------+---------------------------------------------------+
| mysql-monitor_history | 600000 |
| mysql-monitor_connect_interval | 2000 |
| mysql-monitor_connect_timeout | 200 |
| mysql-monitor_ping_interval | 2000 |
| mysql-monitor_ping_timeout | 100 |
| mysql-monitor_read_only_interval | 2000 |
| mysql-monitor_read_only_timeout | 100 |
| mysql-monitor_replication_lag_interval | 10000 |
| mysql-monitor_replication_lag_timeout | 1000 |
| mysql-monitor_username | monitor |
| mysql-monitor_password | monitor |
| mysql-monitor_query_variables | SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES |
| mysql-monitor_query_status | SELECT * FROM INFORMATION_SCHEMA.GLOBAL_STATUS |
| mysql-monitor_query_interval | 60000 |
| mysql-monitor_query_timeout | 100 |
| mysql-monitor_timer_cached | true |
| mysql-monitor_writer_is_also_reader | true |
+----------------------------------------+---------------------------------------------------+
17 rows in set (0.00 sec)
~~~
Les modifications apportées au moniteur MySQL dans la table global_variables seront appliquées après l'exécution de l'instruction *LOAD MYSQL VARIABLES TO RUNTIME* :
~~~
ProxySQL Admin> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
~~~
Pour conserver les modifications de configuration lors des redémarrages, *SAVE MYSQL VARIABLES TO DISK* doit également être exécuté :
~~~
ProxySQL Admin> SAVE MYSQL VARIABLES TO DISK;
Query OK, 54 rows affected (0.02 sec)
~~~