Arquitectura

El complemento de replicación y equilibrado de carga de mysqlnd está implementado como una extensión de PHP. Está escrito en C y opera bajo PHP. Durante el arranque del intérprete de PHP, en la fase de inicialización de módulos del motor de PHP, es registrado como un complemento de mysqlnd para reemplazar los métodos en C de mysqlnd seleccionados.

Durante la ejecución de PHP, inspecciona las consultas enviadas desde mysqlnd (PHP) al servidor MySQL. Si una consulta se reconoce como de solo lectura, será enviada a uno de los servidores esclavos configurados. Una sentencia es considerada de solo lectura si comienza con SELECT, con la sugerencia SQL /*ms=slave*/, o se ha elegido un esclavo para ejecutar la consulta anterior y la consulta comienza con la sugerencia SQL /*ms=last_used*/. En los demás casos, la consulta será enviada al servidor maestro de replicación MySQL.

Para una mejor portabilidad, las aplicacioines deberían usar las constantes predefinidas de mysqlnd_ms MYSQLND_MS_MASTER_SWITCH, MYSQLND_MS_SLAVE_SWITCH, y MYSQLND_MS_LAST_USED_SWITCH en lugar de sus valores literales, tales como /*ms=slave*/.

El complemento maneja la apertura y el cerre de conexiones de bases de datos a los servidores maestros y esclavos. Desde el punto de vista de la aplicación, continua existiendo solamente un gestor de conexión. Sin embargo, internamente, este gestor de conexión público representa una agrupación de conexiones de red que son gestionadas por el complemento. Éste delega las consultas al sevidor maestro y a los esclavos usando múltiples conexiones.

Las conexiones a la bases de datos tienen un estado que consiste en, por ejemplo, el estado de las transacciones, configuración de las transacciones, configuración del conjunto de caracters, y tablas temporales. El complemento intentará mantener el mismo estado entre todas las conexiones internas, siempre que se pueda realizar de una forma automática y transparente. En los casos donde sencillamente no es posible mantener el estado entre conexiones, como al usar BEGIN TRANSACTION, el complemento lo deja en manos del usuario.