Groupe de connexions et bascule entre les connexions
Le plugin de réplication et répartition de charge change la sémantique d'une connexion MySQL de PHP. Les API existantes des extensions PHP pour MySQL (mysqli, mysql et PDO_MYSQL) sont inchangées, mais leur comportement est modifié lorsque le plugin est utilisé. Les applications existantes n'ont pas de changement à opérer pour utiliser la nouvelle API, mais elles devront peut-être être modifiées en ce qui concerne le comportement du plugin.
Le plugin casse la relation un-à-un entre une connexion mysqli, mysql et PDO_MYSQL et la connexion réseau à MySQL. Lorsque le plugin est utilisé, la connexion de mysqli, mysql, PDO_MYSQL représente en fait un groupe de connexions vers un serveur maitre MySQL et des serveurs esclaves. Le plugin aiguille les requêtes vers le serveur maitre ou un des esclaves. A un moment donné, une connexion vue depuis PHP peut pointer vers le maitre et juste après vers un esclave, ou alors toujours le maitre. La manipulation et le remplacement d'une connexion réseau référencée par un gestionnaire de connexion PHP MySQL n'est pas une opération transparente.
Chaque connexion MySQL possède un état, et les différentes connexions, gérées dans un groupe par le plugin, peuvent avoir chacune des états différents. Lorsque le plugin bascule d'une connexion à une autre, l'état est susceptible de changer. L'application doit prendre cela en compte.
La liste suivante indique ce qui est caractérisé par un état de connexion. Cette liste peut ne pas être totalement complète.
- Les statuts des transactions
- Les tables temporaires
- Les verrous des tables
- Les variables de session système ou utilisateur
- Le jeu de bases de données courantes, utilisant USE ainsi que d'autres commandes de statut SQL
- Les requêtes préparées
- Les variables HANDLER
- Les verrous retournés par GET_LOCK()
Le changement de connexions intervient juste avant l'exécution de la requête. Le plugin ne change la connexion courante qu'au moment où la prochaine requête est exécutée.
Note: Problèmes liés à la réplication
Voyez aussi le manuel de référence de MySQL concernant » la réplication et ses problématiques. Certaines restrictions ne sont pas dûes au plugin PHP mais sont des caractéristiques du mécanisme de réplication de MySQL.
Messages diffusés
La philosophie du plugin est d'aligner le statut des connexions dans la file d'attente uniquement si le statut est sous le contrôle total du plugin, ou si c'est nécessaire d'un point de vue de la sécurité. Seulement quelques actions modifiants le statut de la connexion rentrent dans cette catégorie.
Voici la liste des appels diffusés de la bibliothèques clientes qui modifient le statut de toutes les connexions contenus dans la file d'attente.
Si un des appels listés ci-dessous est exécuté, le plugin parcourt toutes les connexions actuellement ouvertes vers le maître et les esclaves. Le parcourt continue tant que tous les serveurs n'ont pas été contactés. Le parcourt ne s'interrompt pas lorsqu'un des serveurs indique une erreur. Si possible, l'erreur sera propagée pour appeler la fonction de l'API utilisateur. Suivant cette fonction, qui a été lancée par la fonction de la bibliothèque sous-jacente, l'utilisateur peut être capable de détecter l'erreur.
Appel de la bibliothèque | Notes | Version |
---|---|---|
change_user() | Appelé par l'appel de l'API utilisateur mysqli_change_user(). Également émise lors de la réutilisation d'une connexion mysqli persistante. | Depuis la version 1.0.0. |
select_db | Appelé par les appels de l'API utilisateur suivants : mysql_select_db(), mysql_list_tables(), mysql_db_query(), mysql_list_fields(), mysqli_select_db(). Notez que USE n'est pas surveillé. | Depuis la version 1.0.0. |
set_charset() | Appelé par les appels de l'API utilisateur suivants : mysql_set_charset(). mysqli_set_charset(). Notez que SET NAMES n'est pas surveillé. | Depuis la version 1.0.0. |
set_server_option() | Appelé par les appels de l'API utilisateur suivants : mysqli_multi_query(), mysqli_real_query(), mysqli_query(), mysql_query(). | Depuis la version 1.0.0. |
set_client_option() | Appelé par les appels de l'API utilisateur suivants : mysqli_options(), mysqli_ssl_set(), mysqli_connect(), mysql_connect(), mysql_pconnect(). | Depuis la version 1.0.0. |
set_autocommit() | Appelé par les appels de l'API utilisateur suivants : mysqli_autocommit(), PDO::setAttribute(PDO::ATTR_AUTOCOMMIT). | Depuis la version 1.0.0. PHP >= 5.4.0. |
ssl_set() | Appelé par les appels de l'API utilisateur suivants : mysqli_ssl_set(). | Depuis la version 1.1.0. |
Les connexions diffusées et paresseuses
Le plugin n'utilise pas de proxy ou bien ne se "souvient" pas de toutes les configurations à appliquer aux futures connexions. Il est important de se rappeler de cela lors de l'utilisation des connexions paresseuses. Les connexions paresseuses sont des connexions qui ne sont pas ouvertes tant que le client n'envoie pas la première connexion. Le plugin utilise par défaut de telles connexions.
Les appels de la bibliothèque modifiant la configuration et le statut des connexions ci-après sont enregistrés pour être utilisés lors de l'ouverture d'une connexion paresseuse afin de s'assurer que le statut de cette connexion est comparable avec le statut de toutes les connexions de la file d'attente.
Appel de la bibliothèque | Notes | Version |
---|---|---|
change_user() | Utilisateur, mot de passe et base de données sont enregistrés pour une utilisation ultérieure. | Depuis la version 1.1.0. |
select_db | Base de données enregistré pour utilisation ultérieure. | Depuis la version 1.1.0. |
set_charset() | Appel set_client_option(MYSQL_SET_CHARSET_NAME, charset) sur les connexions paresseuses pour s'assurer que charset sera utilisé lors de l'ouverture d'une connexion paresseuse. | Depuis la version 1.1.0. |
set_autocommit() | Ajoute SET AUTOCOMMIT=0|1 à la liste des commandes d'initialisation pour une connexion paresseuse utilisant set_client_option(MYSQL_INIT_COMMAND, "SET AUTOCOMMIT=...%quot;). | Depuis la version 1.1.0. PHP >= 5.4.0. |
Statut de connexion
Notez que le statut de la connexion n'est pas changé que par des appels API. Aussi, même si PECL mysqlnd_ms surveille tous les appels API, l'application a toujours besoin de maintenir le statut de la connexion, si besoin.
Jeux de caractères et échappement des chaînes
En raison de l'utilisation des connexions paraisseuses, qui sont actives par défaut, il peut survenir qu'une application tente d'échapper une chaîne pour une utilisation dans une requête SQL avant qu'une connexion ne soit établie. Dans ce cas, l'échappement de la chaîne n'est pas possible. La fonction d'échappement de chaînes ne connait pas le jeu de caractères à utiliser avant qu'une connexion ne soit établie.
Pour éviter ce problème, une nouvelle option de configuration server_charset a été introduite en version 1.4.0.
Une attention particulière doit être portée lors de l'échappement de chaînes avec un certain jeu de caractères, mais utilisant le résultat sur une connexion qui utilise un jeu de caractères différent. Notez que PECL/mysqlnd_ms manipule les connexions et qu'une connexion au niveau applicatif représente une file de plusieurs connexions qui peuvent avoir différents jeux de caractères par défaut. Il est recommandé de configurer le serveur pour utiliser le même jeu de caractères par défaut. L'option de configuration server_charset va être utile dans cette situation. Si vous utilisez l'option server_charset, le plugin va définir le jeu de caractères fourni sur toutes les nouvelles connexions ouvertes.