Integración de una caché

Nota: Requisitos de versión

Esta característica requiere el uso de PECL/mysqlnd_ms 1.3.0-beta o posterior y de PECL/mysqlnd_qc 1.1.0-alpha o posterior. PECL/mysqlnd_ms debe ser compilado para soportar esta característica. Se requiere PHP 5.4.0 o posterior.

Nota: Configuración: orden de caraga de las extensiones

PECL/mysqlnd_ms debe cargarse antes que PECL/mysqlnd_qc, cuando se utilizan extensiones compartidas.

Nota: Estabilidad de la característica

La integración de la caché es de calidad beta.

Nota: Clústeres de MySQL adecuados

Esta característica está pensada para usarla con la Repliación MySQL (copia primaria). Actualmente, no se admiten otros tipos de clústeres MySQL. Los usuarios de tales clústeres deben controlar PECL/mysqlnd_qc manualmente si están insteresados en el almacenamiento en caché de consultas en el lado del servidor.

El enfoque principal de PECL/mysqlnd_ms es el soporte para los clústeres de replicación MySQL (copia primaria asíncrona). Los esclavos de un clúster de replicación MySQL pueden o no reflejar las últimas actualizaciones del servidor. Los esclavos son asíncronos y pueden demorarse con respecto al maestro. Una lectura desde un esclavo se considera que es consistencia final desde una perspectiva total del clúster.

El mismo nivel de consistencia es ofrecido por el almacenamiento en caché, usando la estrategia de invalidación de tiempo de vida (TTL). Se pueden servir datos actuales o antiguos. Finalmente, los datos buscados en la caché no estarán disponibles, por lo que es necesario acceder al origen de la caché.

Dado que un esclavo de Replicación MySQL (secundario asíncrono) y una caché local que maneja TTL proporcionan el mismo nivel de servicio, es posible reemplzar de forma transparente un acceso a una base de datos remota con un acceso a la caché local para obtener mejores posibilidades.

A partir de PECL/mysqlnd_ms 1.3.0-beta, el complemento puede controlar de forma transparente PECL/mysqlnd_ms 1.1.0-alpha o posterior para almacenar en caché una consulta de solo lectura, si está explícitamente permitido, configurando una calidad de servicio apropiada a través de mysqlnd_ms_set_qos(). Por favor, lea la guía rápida para ver un ejemplo de código. Ambos complementos deben estar instalados, PECL/mysqlnd_ms debe ser compilado para soportar la característica de la caché y se ha de utilizar PHP 5.4.0 o posterior.

Las aplicaciones tienen control total sobre el uso de la caché y pueden solicitar datos actuales en cualquier momento si fuera necesario. Se puede habilitar y deshabilitar el uso de la caché durante la ejecución de un script. La caché se usará si mysqlnd_ms_set_qos() establece la calidad del servicio a consistencia final y habilita el uso de la caché. El uso de la caché se deshabilita solicitando niveles de consistencia superiores, por ejemplo, consistencia de sesión (lectura de sus datos). Una vez que la calidad del servicio ha vuelto a consistencia final, la caché se podrá usar de nuevo.

Si la caché está habilitada para sentencias de solo lectura, PECL/mysqlnd_ms podrá inyectar sugerencias SQL para controlar la caché mediante PECL/mysqlnd_qc. Se puede modificar la sentencia SQL si se obtiene de la aplicación. Se supone que los tratamientos de SQL subsiguientes ignorarán las sugerencias SQL. Una sugerencia SQL es un comentario SQL. Los comentarios no deben ser ignorados, por ejemplo, por el servidor de la base de datos.

El TTL de una entrada de la caché se calcula en función de cada sentencia. Las aplicaciones pueden establecer un máximo de edad para los datos que quieren recuperar mediante mysqlnd_ms_set_qos(). La edad establece un límite superior aproximado de los segundos que los datos devueltos pueden demorarse con respecto al maestro.

La siguietne lógica se utiliza para calcular el TTL real si la caché está habilitada. La lógica toma en cuenta la demora del esclavo aproximada para elegit un TTL. Si, por ejemplo, hay dos esclavos que se retrasan 5 y 10 y la edad máxima permitida es 60 segundos, el TTL se establece a 50 segundos. Observe que el establecimiento de la edad no es más que una aproximación.

  • Se comprueba si la sentencia es de solo lectura. Si no lo es, no se almacenará en caché.
  • Si la caché está habilitada, se comprueba la demora de todos los esclavos configurados. Se establecen las conexiones esclavas si no existieran hasta ahora y se utilizan conexiones retardadas.
  • Se envía la sentencia SHOW SLAVE STATUS a todos los esclavos. No se espera a que el primer esclavo replique antes de enviarla al segundo esclavo. Los clientes a menudo esperan bastante tiempo para las réplicas, por lo que se envían todas las peticiones de una vez antes obtenerlas en un segudo escenario.
  • Se itera sobre todos los esclavos. Para cada esclavo se espera su réplica. No se inicia la comprobación de otro esclavo antes de que el esclavo actual haya replicado. Se comprueba si Slave_IO_Running=Yes y Slave_SQL_Running=Yes. Si ambas condiciones son verdaderas, se obtiene el valor de Seconds_Behind_Master. En caso de cualquier error o de que las condiciones fallen, se establece un error en la conexión esclava. Se salta cualquier conexión esclava para el resto del filtrado de conexiones.
  • Se busca el valor máximo de Seconds_Behind_Master de todos los esclavos que hayan pasado las condiciones previas. Se resta el valor de la edad máxima de mysqlnd_ms_set_qos() proporcionada por el usuario. Se utiliza el resultado como un TTL.
  • El filtrado puede ordenar todos los esclavos. Si se hace, se usa la edad máxima como TTL, ya que la demora máxima encontrada es igual a cero. Es perfectamente válido ordenar todos los esclavos. En adelante, depende de filtro subsiguiente decidir qué hacer. El filtro de equilibrado de carga interno eligirá al maestro.
  • Se inyectan las sugerencias SQL apropiadas para habilitar el almacenamiento en caché por patre de PECL/mysqlnd_qc.
  • Se procede con el filtrado de conexiones, p.ej., se aplican las reglas del equilibrado de carga para escoger un esclavo.
  • PHP carga PECL/mysqlnd_qc después de PECL/mysqlnd_ms. Así, verá todas las modificaciones de consultas hechas por PECL/mysqlnd_ms y almacenará en caché la consulta, si se le ordenó hacerlo.

El algoritmo puede parecer costoso. SHOW SLAVE STATUS es una operación muy rápida. Dado un número suficiente de peticiones y de usos de la caché por segundo, el coste de comprobar la demora de los esclavos puede superar fácilmente el coste de la decisiones de la caché.

Las sugerencias sobre un algoritmo mejor siempre son bienvenidas.