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á:
SELECT 1 FROM DUAL
. Pasada a todos los filtros.
master_0
.
Nodos esclavo:slave_0
, slave_1
random
, argumento sticky=1
.
Elige un esclavo aleatorio una vez para utilizarlo para el resto de peticiones de PHP.
Salida: slave_0
.
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
.
roundrobin
. La lista de servidores consisten en
un solo servidor, la rotación siempre devolverá el mismo servidor.
(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.
SELECT sum(price) FROM orders WHERE order_id = 1
.
Pasada a todos los filtros.
master_0
.
Nodos esclavo: slave_0
, slave_1
,
slave_2
, slave_3
quality_of_service
, conjunto de reglas: session_consistency (lectura de sus escrituras)
Salida: master_0
master_0
y la sentencia a ejecutar
son pasadas como entrada al siguiente filtro, el cual es roundrobin
.
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 llamadaventas
(slave_0
,slave_1
). Si la aplicación pregunta a la base de datosesclavos
, el hipotético filtrotable
reduciría la lista de posibles servidores aslave_0
yslave_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.