(PECL mysqlnd_ms < 1.2.0)
mysqlnd_ms_set_qos — Establece la calidad de servicio necesaria de un clúster
$connection
, int $service_level
, int $service_level_option
= ?
, mixed $option_value
= ?
) : boolEstablece la calidad de servicio necesaria de un clúster. Un clúster de bases de datos proporciona una cierta calidad de servicio al usuario dependiendo de su arquitectura. Un aspecto muy importante de la calidad de servicio es el nivel de consistencia que el clúster puede ofrece. La consistencia predeterminada de un clúster de replicación MySQL asíncrono es la final para lecturas de esclavos: un esclavo puede servir datos antiguos, datos actuales, o podría no poseer la petición de datos, debido a que no está sincronizado con el maestro. En un clúster de replicación MySQL, únicamente los accesos al maestro pueden proporcionar consistencia fuerte, la cual promete que todos los clientes ven los cambios de los demás clientes.
PECL/mysqlnd_ms oculta la complejidad de la elección de los nodos apropiados para llevar a cabo un cierto nivel de servicio de un clúster. El filtro "Calidad de Servicio" implementa la lógica necesaria. El filtro puede configurarse tanto en el fichero de configuración del comlemento como en tiempo de ejecución usando mysqlnd_ms_set_qos().
Se pueden lograr resultados similares con PECL mysqlnd_ms < 1.2.0, si se usan
sugerencias SQL para forzar el uso de un tipo de nodo en particular, o usando la
opción de configuración master_on_write
del complemento. El primer método
requiere más código y causa más trabajo en el lado de la aplicación.
El segundo método es menos refinado que usar el filtro de calidad de servicio.
Los ajustes realizados a través de la llamada a la función se puden revertir, como se muestra en el
ejemplo de abajo. Éste cabia temporalmente a un nivel de servicio superior
(consistencia de sesión, lectura de sus escrituras) y vuelve
al predeterminado del clúster después de haber realizado todas las operaciones que requieren
el servicio mejor. De esta forma, la carga de lectura en el maestro se puede minimizar en comparación con
el uso de master_on_write
, el cual continuaría usando el maestro
después de la primera escritura.
Desde 1.5.0, las llamadas fallarán cuando se realizan en mitad de una transacción si la adhesión de transacciones está habilitada y se han detecetado límites en la transacción. properly.
connection
Un gestor de conexión de PECL/mysqlnd_ms hacia un servidor MySQL del tipo PDO_MYSQL, mysqli> o ext/mysql para el cual establecer un nivel de servicio. Este gestor de conexión se obtiene al abrir una conexión con un nombre de equipo anfitrión que coincide con la entrada del fichero de configuración de mysqlnd_ms usando cualquier de las tres extensiones del controlador de MySQL anteoriores.
service_level
El nivel de servicio solicitado: MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL
,
MYSQLND_MS_QOS_CONSISTENCY_SESSION
o
MYSQLND_MS_QOS_CONSISTENCY_STRONG
.
service_level_option
Una opción para parametrizar el nivel de servicio solicitado.
Esta opción puede ser MYSQLND_MS_QOS_OPTION_GTID
o MYSQLND_MS_QOS_OPTION_AGE
.
La opción MYSQLND_MS_QOS_OPTION_GTID
se puede usar
para refinar el nivel de servcicio MYSQLND_MS_QOS_CONSISTENCY_SESSION
.
Se debe combinar con un cuarto parámetro,
option_value
. Éste debería
ser un ID de transacciones global obtenido desde
mysqlnd_ms_get_last_gtid(). Si se establece, el
complemento considerará los servidores maestros y los esclavos asíncronos para la consistencia
de sesión (lectura de sus escrituras). Si no, solamente se usarán los
maestros para conseguir la consistencia de sesión. Un esclavo se considera acutalizado y
comprobado si ya ha replicado el ID de transacciones global de
option_value
. Observe que la búsqueda de esclavos apropiados
es una operación cara y lenta. Use con moderación esta característica, si el
maestro no puede manejar solo la carga de lectura.
La opción MYSQLND_MS_QOS_OPTION_AGE
se puede combinar
con el nivel de servicio MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL
,
para filtrar esclavos asíncronos que se demoren respecto al maestro
más segundos que option_value
. Si se establece, el complemento
solamente considerará a los esclavos para la lectura si
SHOW SLAVE STATUS
notifica que
Slave_IO_Running=Yes
,
Slave_SQL_Running=Yes
y
Seconds_Behind_Master <= option_value
. Observe que
la búsqueda de esclavos apropiados es una operación cara y lenta.
Use con moderación esta característica en la versión 1.2.0. En versiones futuras se podría
mejorar el algoritmo usado para identificar candidatos. Véase el manual de referencia de
MySQL para la precisión, exactitud y limitaciones del comando administrativo
SHOW SLAVE STATUS
de MySQL.
option_value
El valor del parámetro de la opción del nivel de servicio. Véase también el
parámetro service_level_option
.
Devuelve true
si el nivel de servicio de la conexión
ha sido cambiado en la solicitud. De otro modo, devuelve false
Nota:
mysqlnd_ms_set_qos() requiere PHP >= 5.4.0 y PECL mysqlnd_ms >= 1.2.0. Internamente, se utiliza una funcionalidad en C de la biblioteca
mysqlnd
no disponble en PHP 5.3.Observe que todas las versiones de producción de MySQL 5.6 no proporcionan clientes con suficiente información para usar GTID para forzar la consistencia de sesión. En el peor de los casos, el complemento eligirá solamente el maestro.
Ejemplo #1 Ejemplo de mysqlnd_ms_set_qos()
<?php
/* Abrir una conexión mysqlnd_ms usando la extensión mysqli, PDO_MySQL o mysql */
$mysqli = new mysqli("myapp", "nombre_usuario", "contraseña", "base_datos");
if (!$mysqli)
/* Por supuesto, su manejo de errores es mejor... */
die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error()));
/* Consistencia de sesión: lectura de sus escrituras */
$ret = mysqlnd_ms_set_qos($mysqli, MYSQLND_MS_QOS_CONSISTENCY_SESSION);
if (!$ret)
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
/* Se usará el maestro y se devolverán datos actuales, el cliente puede ver su última escritura */
if (!$res = $mysqli->query("SELECT item, price FROM orders WHERE order_id = 1"))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
/* Volver a lo predeterminado: usar todos los esclavos y maestros permitidos, se pueden obtener datos antiguos */
if (!mysqlnd_ms_set_qos($mysqli, MYSQLND_MS_QOS_CONSISTENCY_EVENTUAL))
die(sprintf("[%d] %s\n", $mysqli->errno, $mysqli->error));
?>