wiki/HowtoMySQL/ProxySQL.md

8.3 KiB

categories: databases title: Howto ProxySQL : Outil de proxyfication et de haute disponibilité pour MySQL.

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

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)