Fonctions Mysqlnd_ms
PHP Manual

mysqlnd_ms_set_qos

(PECL mysqlnd_ms < 1.2.0)

mysqlnd_ms_set_qosDéfinit la qualité de service désirée pour le cluster

Description

bool mysqlnd_ms_set_qos ( mixed $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.

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 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.

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($mysqliMYSQLND_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($mysqliMYSQLND_MS_QOS_CONSISTENCY_EVENTUAL))
  die(
sprintf("[%d] %s\n"$mysqli->errno$mysqli->error));
?>

Voir aussi


Fonctions Mysqlnd_ms
PHP Manual