Quien haya tenido un sitio web con muchas visitas funcionando con un SGDB / frontend MySQL o MSSQL (este último no tiene remedio), se habrá dado cuenta de que con una avalancha de visitas o con un flujo grande y constante de accesos, se producen cuellos de botella en el acceso de lectura a la base de datos.
Se destacan varios puntos en común: los accesos de escritura son casi inexistentes, y los accesos de lecturas se repiten de forma múltiple ofreciendo siempre la misma respuesta durante cierto tiempo, a falta de una actualización.
Una opción que queda por ver es la de usar un servidor principal donde se realizarán las escrituras y luego una serie de servidores esclavos que vienen a ser replicas de la página web.
De ésta forma tenemos que ir escalando los servidores web y los servidores de bases de datos al mismo tiempo, puesto que si no se crearía un cuello de botella (más visitas = más conexiones a la base de datos = todo al garete).
Mas información y descarga después del salto.
Una solución es usar un sistema que haga de conector entre los servidores web y los de bases de datos. Esto ya existe, y se llama Database Access Layer, una implementación propia del New York Times (!).
Hagamos un ejemplo para entedernos mejor:
Ejemplo: EL PAÍS (diario)
- 4 servidores web Apache2
- 5 servidores MySQL
Las cifras son completamente arbitrarias, pero a mi parecer lo que mejor representa la solución LAMP que se suele implementar en estos casos.
Yo propondría lo siguiente:
Ejemplo 2 usando capas de abstracción
- 2 servidores web Apache2
- 1/2 servidor(es) sqlayer/dbslayer
- 1 servidor MySQL
De por sí viene a ser mucho más eficaz y económico. Aquí es cuando entra en juego una capa de abstracción. Lo que hace es mediante una conexión persistente intercambiar consultas entre el servidor web y el frontend de base de datos. Una buena opción es crear una caché en memoria de las consultas selects, que expire en un minuto (por ejemplo).
Visto que DBSlayer no encaja con mis necesidades, aquí es donde yo entro en juego. He programado SQLayer, que presenta como carácteristicas:
Ni más ni menos, basta con ejecutarlo:
$ php sqlayer.php
Empezará a escuchar en el puerto 8636 esperando conexiones realizadas desde un script. En el caso de ser una consulta de tipo select, show o list (mira que me repito…) la ejecuta y devuelve un escueto esquema en XML de los datos, además de guardarlos en cache. Y para la comodidad de todos, también acepta consultas de tipo update, insert y otros aunque este no se haya diseñado el programa para esto.
Destaca por su flexibilidad pues cualquiera puede alterar el código para ajustarlo a sus servidores o distribuir las consultas.
Al grano: veamos un ejemplo de conector:
function pool_query ($query){
global $sock;
$sock = fsockopen(’localhost’, 8636);
fputs($sock, $query);
$read = fread($sock, 1048576);
return $read;
}$sql_query = “SELECT * FROM wp_posts”;
pool_query($sql_query);fclose($sock);
Devuelve un esquema XML de los campos devueltos por la DB. Con este ejemplo se puede adaptar a cualquier lenguaje de programación que por rudimentario que sea implemente sockets. Es decir, prácticamente cualquiera.
Y finalmente… La descarga. Esta empaquetado para usarse en Windows aunque incluye el script para Linux. Hay que instalar, en Debian/Ubuntu/Mint el paquete php5-cli de los repositorios.
Y una nota de pie en cuanto a rendimiento: junto a usar una capa de abstracción hay que tener en cuenta que NO hay que abusar del sistema. Hay que evitar acceder a cada uno de los recursos disponibles guardando copias locales de ellos y usando el mínimo de querys. Por ejemplo, más allá de 50 querys con este sistema puede empezar a ralentizar la página. Según los benchmarks que he hecho, se pueden hacer 50 querys en 293 MS mediante red mientras que de forma directa (pila TCP/IP) se pueden llegar a hacer en 178 MS, pero la ventaja del balancing y caching es un punto a tener en cuenta.
» Descargar (07/12/07: Nuevo cliente / Soporte Winsock / Pequeños cambios)
4 comentarios en "Capa de abstracción para MySQL"
Todavía no tengo ese problema; pero tomo nota.
@Valentín Pedrosa Rivas yo tampoco tengo ese problema, pero visto que estoy trabajando con cosas que necesitan ser facilmente escalables, esto es un buen ejercicio o autochuleta. Y si vas a usar un sitio web grande, muy buena idea.
[...] anti incendios: Tornado artificial Escaleras mecánicas suspendida a 167 metros de altura Capa de abstracción para MySQL Servidor web de ejemplo en PHP Brainfuck, Ook! y otros lenguajes de programación para orangutanes [...]
[...] Esto ya existe, y se llama Database Access Layer, una implementaci?n propia del New York Times.Mas: http://blog.adrinavarro.com/2007/12/06/capa-de-abstraccion-para-mysql/ [...]
Comentar