(PECL mysqlnd_ms < 1.2.0)
mysqlnd_ms_set_qos — Définit la qualité de service désirée pour le cluster
$connection
, int $service_level
, int $service_level_option
= ?
, mixed $option_value
= ?
) : boolDé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.
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
ou
MYSQLND_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
ou MYSQLND_MS_QOS_OPTION_AGE
.
L'option MYSQLND_MS_QOS_OPTION_GTID
peut être utilisé pour
définir le niveau de service MYSQLND_MS_QOS_CONSISTENCY_SESSION
.
Il doit être combiné avec un 4ème paramètre, option_value
.
Le paramètre option_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ètre
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, 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 service MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL
pour filtrer les esclaves asynchrones qui lag pendant plus de
option_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.
Retourne true
si le niveau de service des connexions a pû
être atteint, false
sinon.
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.Veuillez noter que toues les versions de production de MySQL 5.6 ne fournissent pas aux clients des informations suffisantes pour l'utilisation des GTIDs permettant de renforcer la consistence des sessions. Dans un tel cas, le plugin choisira uniquement le maître.
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));
?>