Filtro

Nota: Requisitos de versión

Los filtros existen a partir de la versión 1.1.0-beta de mysqlnd_ms.

filtros. Las aplicaciones de PHP que implementen un clúster de replicación MySQL deben identificar primero un grupo de servidores en el clúster que podrían ejecutar una sentencia antes de que ésta sea ejecutada por uno de los candidatos. En otras palabras: se debe filtrar una lista de servidores definidos hasta que esté disponible solamente un servidor.

El proceso de filtrado puede incluir el uso de uno o más filtros, los cuales pueden estar encadenados. Son ejecutados en el orden en el que están definidos en el fichero de configuración del complemento.

Nota: Aclaración: comparación entre cadena de filtros y tuberías

El concepto de filtros encadenados puede ser comparado con el uso de tuberías para conectar utilidades de línea de comandos en un sistema operativo intérprete de comandos. Por ejemplo, un flujo de entrada se pasa al procesador, se filtra, y luego se transfiere para su salida. Entonces, la salida se pasa al siguiente comando, el cual está conectado al anterior mediante el operador de tubería.

Filtros disponibles:

El filtro random implementa las políticas de equilibrado de carga 'aleatoria' y 'aleatorio una vez'. El equilibrado de carga 'rotacional' se puede configurar a través del filtro roundrobin. Estblecer una 'llamada de retorno definida por el usuario' para la selección del servidor es posible con filtro user. El filtro quality_of_service busca nodos del clúster capaces de cumplir con un cierto servicio, por ejemplo, la lectura de sus escrituras, o no demorar más segundos de lo permitido con respecto al maestro.

Los filtros puede aceptar parámetros para cambiar su comportamiento. El filtro random acepta el parámetro opcional sticky. Si se establece a 'true', el filtro cambia el equilibrado de carga de 'aleatorio' a 'aleatorio una vez'. 'Aleatorio' escoge un servidor aleatorio cada vez qeu se vaya a ejecutar una sentencia. 'Aleatorio una vez' escoge un servidor aleatorio cuando la primera sentencia va a ser ejecutada y utiliza el mismo servidor para el resto de peticiones de PHP.

Una de los puntos fuertes del concepto de filtro es la posibilidad de encadenar filtros. Este punto fuerte no se hace inmediatamente visible debido a que los filtros random, roundrobin y user deben de producir no más de un servidor. Si un filtro reduce la lista de candidatos para la ejecución de una sentencia a un único servidor, tiene poco sentido usar ese servidor como entrada de otro filtro para reducir aún más la lista de candidatos.

Un ejemplo de una secuencia de filtros que fallará:

  • Sentencia a ejecutar: SELECT 1 FROM DUAL. Pasada a todos los filtros.
  • Todos los nodos configurados son pasados como entrada al primer filtro. Nodos maestro: master_0. Nodos esclavo:slave_0, slave_1
  • Filtro: random, argumento sticky=1. Elige un esclavo aleatorio una vez para utilizarlo para el resto de peticiones de PHP. Salida: slave_0.
  • La salida de slave_0 y la sentencia a ejecutar son pasadas como entradas al siguiente filtro. Aquí: roundrobin, la lista de servidores pasada para filtrar es: slave_0.
  • Filtro: roundrobin. La lista de servidores consisten en un solo servidor, la rotación siempre devolverá el mismo servidor.
Si se intenta usar esta secuencia de filtros, el complemento puede emitir una advertencia como (mysqlnd_ms) Error while creating filter '%s' . Non-multi filter '%s' already created. Stopping in %s on line %d. Además, se puede establecer un error apropiado para el gestor de conexión.

Existe un segundo tipo de filtro: el filtro múltiple. Un filtro múltiple emite cero, uno o múltiples servidores después del procesamiento. El filtro quality_of_service es un ejemplo. Si la calidad de servicio solicitada establece un límite superior para la demora del esclavo y más de un esclavo se demora menos que el número de segundos permitido, el filtro devuelve más de un nodo del clúster. Un filtro múltiple debe ser seguido de otro para reducir aún más la lista de candidatos para la ejecución de sentencias hasta que se encuentre un candidato.

Una secuencia de filtros con el filtro múltiple quality_of_service seguido por un filtro de equilibrado de carga.

  • Sentencia a ejecutar: SELECT sum(price) FROM orders WHERE order_id = 1. Pasada a todos los filtros.
  • Todos los nodos configurados son pasados como entrada para el primer filtro. Nodos maestro: master_0. Nodos esclavo: slave_0, slave_1, slave_2, slave_3
  • Filtro: quality_of_service, conjunto de reglas: session_consistency (lectura de sus escrituras) Salida: master_0
  • La salida de master_0 y la sentencia a ejecutar son pasadas como entrada al siguiente filtro, el cual es roundrobin.
  • Filtro: roundrobin. La lista de servidores consiste en un servidor. La rotación selecciona master_0.

Una secuencia de filtros no debe finalizar con un filtro múltiple. Si se intenta usar una sencuencia de filtros que finaliza con un filtro múltiple, el complemento puede emitir una advertencias como (mysqlnd_ms) Error in configuration. Last filter is multi filter. Needs to be non-multi one. Stopping in %s on line %d. Además, se puede establecer un error apropiado para el gestor de conexión.

Nota: Especulación sobre el futuro: filtrado de replicación MySQL

En futuras versiones, pueden existir filtros múltiples adicionales. Por ejemplo podría existir un filtro table para soportar el filtrado de replicación MySQL. Esto podría permitir la definición de reglas para qué base de datos o tabla van a ser replicadas a cual nodo de un clúster de replicación. Se asume que el clúster de replicación consiste en cuatro esclavos (slave_0, slave_1, slave_2, slave_3), dos de los cuales replican una base de datos llamada ventas (slave_0, slave_1). Si la aplicación pregunta a la base de datos esclavos, el hipotético filtro table reduciría la lista de posibles servidores a slave_0 y slave_1. Ya que la salida y la lista de candidatos consiste en más de un servidor, es posible y necesario añadir filtros adicionales a la lista de candidatos, por ejemplo, usando un filtro de equilibrado de carga para identificar un servidor para la ejecución de sentencias.