Balanceando la cargar en nuestra base de datos

Cuando nuestra aplicación es pequeña (numero de peticiones)  o simplemente no tenemos recursos es común que esta este alojada en un solo servidor (apache,mysql, y otros servicios). el problema es que con ello se le deja toda la tarea al un solo server por lo que de escalabilidad ni hablar.

 

Por otro lado si sabemos que la aplicación tendrá demasiadas (“demasiadas peticiones” esto ira en otro blog para saber a cuantas se refiere), y si hacemos un uso exhaustivo de nuestra base de datos, entonces debemos de prever y elegir la configuración mas adecuada para nuestra aplicación.

 

Suponiendo que tenemos una configuración de maestro-esclavo para una base de datos mysql, Entonces una sugerencia seria usar el servidor maestro únicamente para las consultar que afecten la base de datos (insert, delete, update, alter, etc) y tomar de los esclavos los datos que necesitemos (select´s).

De esta manera el servidor maestro no estará tan saturado permitiéndonos atender a un mayor numero de peticiones la base de datos.

Debemos tener en cuenta que hay un tiempo (puede ser muy corto como milisegundos), en lo que los datos insertados en el maestro se ven reflejados en el esclavo. independiente mente de las configuración este tiempo existirá, así que debemos tener en cuenta esto para los casos en los que necesitamos insertar e inmediatamente consultar por ejemplo:

$master->exec('update users set posts += 1');
$results = $slave->query('select posts from users');

 

Ya que corremos el riesgo de que los datos a un no estén en el esclavo, por lo que en este script si es conveniente leer desde el maestro.

Entonces la utilización de la lectura de los datos del esclavo se debería de usar para aquellos datos que no han sido insertados recientemente (estamos hablando de milisegundos o segundos si gustan).

Esto es una solución pero antes de aplicar algo así, deberemos revisar la complejidad de nuestra aplicación y arquitectura.

Leave a Reply

Your email address will not be published. Required fields are marked *