mysqlnd_ms_set_qos
(PECL mysqlnd_ms < 1.2.0)
mysqlnd_ms_set_qos — Définit la qualité de service désirée pour le cluster
Description
$connection
, int $service_level
[, int $service_level_option
[, mixed $option_value
]] )Définit la qualité de service désirée pour le cluster. Un cluster de base de données délivre une certaine qualité de service à l'utilisateur suivant son architecture. Un aspect majeur de la qualité de service est le niveau de consistence pouvant être offert par le cluster. Un cluster de réplication MySQL asynchrone a, par défaut, une consistence éventuelle pour les esclaves en lecture : un esclave peut servir des données non-mises à jour, des données courantes, ou il peut ne pas avoir du tout les données, car il n'est pas synchrone avec le maître. Dans un cluster de réplication MySQL, seul le maître peut fournir une consistence forte, garantissant à tous les clients de voir les modifications.
PECL/mysqlnd_ms cache le choix des noeuds appropriés pour arriver à un certain niveau de service depuis le cluster. Le filtre "Quality of Service" implémente la logique nécessaire. Ce filtre peut être soit configuré dans le fichier de configuration du plugin, soit au moment de l'exécution en utilisant la fonction mysqlnd_ms_set_qos().
Des résultats similaires peuvent être obtenus avec PECL mysqlnd_ms < 1.2.0, en utilisant des astuces SQL pour forcer l'utilisation d'un certain noeud, ou en utilisant l'option de configuration master_on_write du plugin. La première nécessite plus de code et plus de travaux côté applicatif. La dernière est moins raffinée que d'utiliser le filtre de qualité de service. La configuration via l'appel à la fonction peut être réservée, comme dans l'exemple ci-dessous. L'exemple switche temporairement vers un niveau de service supérieur (consistence de session, lecture de vos écritures) et retourne vers le cluster par défaut après avoir effectué toutes les opérations nécessitant un service meilleur. De cette façon, la charge en lecture sur le maître peut être optimisée par rapport à l'utilisation de master_on_write, qui fait que le maître continue d'être utilisé après la première écriture.
Depuis 1.5.0, les appels échoueront lorsqu'éffectués au milieu d'une transaction si la direction de configuration sur la rigidité des transactions est activée et que les limites de la transaction ont été détectées. properly.
Liste de paramètres
-
connection
-
Un gestionnaire de connexion PECL/mysqlnd_ms vers un serveur MySQL de type PDO_MYSQL, mysqli ou ext/mysql pour lequel un niveau de service doit être défini. Le gestionnaire de connexion est obtenu lors de l'ouverture d'une connexion avec un nom d'hôte qui correspond à l'entrée du fichier de configuration mysqlnd_ms, en utilisant n'importe laquelle des extensions MySQL ci-dessus.
-
service_level
-
Le niveau de service demandé :
MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL
,MYSQLND_MS_QOS_CONSISTENCY_SESSION
ouMYSQLND_MS_QOS_CONSISTENCY_STRONG
. -
service_level_option
-
Une option pour paramétrer le niveau de service demdandé. Cette option peut être
MYSQLND_MS_QOS_OPTION_GTID
ouMYSQLND_MS_QOS_OPTION_AGE
.L'option
MYSQLND_MS_QOS_OPTION_GTID
peut être utilisé pour définir le niveau de serviceMYSQLND_MS_QOS_CONSISTENCY_SESSION
. Il doit être combiné avec un 4ème paramètre,option_value
. Le paramètreoption_value
doit être un identifiant de transaction globale obtenu depuis la fonction mysqlnd_ms_get_last_gtid(). Si défini, le plugin considère qu'à la fois les serveurs maîtres et les esclaves asynchrones utiliseront une consistence de session (lecture de vos écritures). Sinon, seuls les maîtres seront utilisés pour la consistence de session. Un esclave est considéré à jour et il sera vérifié si il a déjà répliqué l'identifiant de transaction globale issu du paramètreoption_value
. Veuillez noter que la recherche d'esclaves appropriés est une opération couteuse et lente. Elle est donc à utiliser avec précaution, surtout si le maître ne peut pas gérer seul la charge des lectures.L'option
MYSQLND_MS_QOS_OPTION_AGE
peut être combinée avec le niveau de serviceMYSQLND_MS_QOS_CONSISTENCY_EVENTUAL
pour filtrer les esclaves asynchrones qui lag pendant plus deoption_value
secondes derrières le maître. Si défini, le plugin ne considèrera que les esclaves pour les lectures si SHOW SLAVE STATUS rapporte Slave_IO_Running=Yes, Slave_SQL_Running=Yes et Seconds_Behind_Master <= option_value. Veuillez noter que la recherche d'esclaves appropriés est une opération couteuse et lente. Elle est donc à utiliser avec précaution en version 1.2.0. Les futures versions devraient améliorer l'algorithme utilisé pour identifier les candidats. Reportez-vous au manuel de référence MySQL sur la précision, l'exactitude, et les limitations de la commande administrative MySQL SHOW SLAVE STATUS. -
option_value
-
La valeur optionnelle du niveau de service. Reportez-vous au paramètre
service_level_option
pour plus de détails.
Valeurs de retour
Retourne TRUE
si le niveau de service des connexions a pû
être atteint, FALSE
sinon.
Notes
Note:
mysqlnd_ms_set_qos() requière PHP >= 5.4.0 and PECL mysqlnd_ms >= 1.2.0. En interne, elle utilise une fonctionnalité de la bibliothèque C mysqlnd qui n'est pas disponible en PHP 5.3.
Exemples
Exemple #1 Exemple avec mysqlnd_ms_set_qos()
<?php /* Ouvre une connexion mysqlnd_ms en utilisant l'extension mysqli, PDO_MySQL ou mysql */ $mysqli = new mysqli("myapp", "username", "password", "database"); if (!$mysqli) /* Bien évidemment, votre gestionnaire d'erreur est meilleur... */ die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error())); /* Consistence de session : lecture de vos écritures */ $ret = mysqlnd_ms_set_qos($mysqli, MYSQLND_MS_QOS_CONSISTENCY_SESSION); if (!$ret) die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error)); /* Va utiliser le maître et retourner des données récentes, le client pourra voir ces dernières écritures */ if (!$res = $mysqli->query("SELECT item, price FROM orders WHERE order_id = 1")) die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error)); /* Retour vers le comportement par défaut : utilisation de tous les esclaves et maîtres autorisés, des données non-à-jour peuvent survenir */ if (!mysqlnd_ms_set_qos($mysqli, MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL)) die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error)); ?>
Voir aussi
- mysqlnd_ms_get_last_gtid() - Retourne le dernier identifiant de transaction globale
- Concepte sur le niveau de service et la consistence
- Concepte sur les filtres