Maestros del Web


Estás en Inicio / Editorial / Bases de Datos

11.07.2007

Memcached: un alivio para las bases de datos

Cuando la performance de un sistema web se torna crítica y el tiempo de respuesta puede quedar afectado por las numerosas visitas simultáneas, debemos echar mano a herramientas “poco convencionales”, este es el caso de Memcached.

¿Qué es Memcached?

Memcached es definido por Danga Interactive, la empresa que lo desarrollo y mantiene el proyecto bajo licencia BSD como un “sistema distribuido de alta performance para el cacheo de objetos en memoria, genérico por naturaleza, pero pensado para incrementar la velocidad de aplicaciones web dinámicas, aliviando la carga de las bases de datos”.

La idea es muy simple y a la vez muy efectiva: un servicio que escucha en un host y un port específico, que puede almacenar cadenas de bytes (strings). De esta manera, podríamos estar guardando en memoria una estructura serializada de PHP o Java, un string encodeado con Json, o un documento de cualquier formato (después de todo no dejan de ser cadenas de bytes).

Existe actualmente una implementacion de Memcached Server que corre en Win32. Si bien no es oficial, cuenta con el apoyo de varios desarrolladores de la comunidad.

Funcionamiento

A grandes rasgos, el Memcached Server almacena los strings (internamente denominados ítems), en una gran tabla de hash, y los mapea según la clave que le asociemos a dicho ítem.

Dicha tabla de hash adopta una estructura de porciones de memoria de tamaño variable (denominadas slabs), con el objetivo de optimizar la asignación del espacio de memoria.

Un dato no menor es el slab de mayor tamaño (1 Mb), siendo este por consiguiente el tamaño máximo que un ítem puede tener si quiere ser almacenado en Memcached Server (aunque este valor puede ser modificado desde el código fuente).

Su arquitectura escalable nos permite mantener un pool de Memcached servers, característica que bien puede ser explotada en momentos donde la cantidad de conexiones no puede ser gestionada por un único Server. En ese caso, el pool optará por otro Server, balanceando la carga de conexiones.

Protocolo

La comunicación de clientes con servidor es muy simple, y basada en comandos. El protocolo Memcached implementa 3 comandos de almacenamiento, con pequeñas diferencias en su funcionamiento:

  • SET: Actualiza el objeto si no existía anteriormente, o lo agrega en caso contrario.
  • ADD: Agrega el objeto solo si no existe.
  • REPLACE: Actualiza el objeto solo si existe.

Memcached permite controlar el tiempo de vida de un objeto, indicando el “tiempo de expiración” para el mismo, en el momento de realizar una operación de almacenamiento.

A su vez, posee un comando de recuperación: GET. Podemos eliminar un objeto mediante el comando DELETE. Además, el protocolo implementa comandos para recuperar estadísticas, vaciar el cache, utilizar algún tipo de compresión, entre otros.

Ejemplo de uso

<?php 

// Inicializamos y conectamos
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die("No podemos conectarnos"); 

// Creamos una estructura a cachear
$pichongol = new stdClass;
$pichongol->nombre = “Daniel”;
$pichongol->apellido = “Lopez”; 

// Almacenamos la estructura con una expiracion de 10 segundos
$memcache->set(“pichongol”, $pichongol, false, 10) or die ("No podemos guardar la estructura"); 

// Recuperamos la estructura
$result = $memcache->get(“pichongol”);
echo "Estructura recuperada:<br/>\n";
print_r($result); 

?>  

¿Quiénes usan Memcached?

El desarrollo inicial y sus posteriores mejoras nacen como una necesidad de incrementar velocidades de respuesta para las peticiones web, en sitios de tráfico masivo.

Actualmente, su uso continúa expandiéndose, a medida que el proyecto toma mayor fuerza con la ayuda de varios desarrolladores de la comunidad Open Source que revisan y agregan nuevas capacidades al proyecto.

La siguiente es una lista acotada de sitios que actualmente utilizan Memcached para resolver cuestiones de escalabilidad:

Memcached nace como un desarrollo para el backend de LiveJournal, y como tal, es el primer sitio que lo implementa.

Luego de tener ciertas falencias de performance (producto de tener que manejar en promedio, de 35 a 40 millones de page views diarios) implementaron Memcached, logrando una gran mejoría en la prestación del servicio.

Contribuyó al proyecto, aportando muchas mejoras relacionadas con el manejo de memoria y los algoritmos de hashing, principalmente. Es actualmente la mayor implementación conocida, compuesta de alrededor de 200 servers de 1GB de memoria cada uno.

Monitoreando su funcionamiento

En estado natural, a medida que el tiempo transcurre, se incrementa la cantidad de ítems almacenados:

imagen18.jpg

En el anterior ejemplo, podemos ver como la cantidad de ítems se va incrementando hasta la hora 8, momento en el cual se realizó un “restart” del Memcached Server. Luego de ese instante, los ítems vuelven a almacenarse progresivamente.

El “Hits Ratio” es el índice que nos indica la relacion de éxito entre las veces que solicitamos un ítem, y las veces que efectivamente esta cacheado y por ende recuperado.

Estadísticamente y dependiendo del proyecto, es muy comun que el Hits Ratio se ubique en la franja del 85% - 98%. Claramente podemos imaginarnos la mejora al rendimiento general que esto representa, si tenemos en cuenta la merma en la carga de las Bases de datos, así también el tiempo de respuesta de los web servers. El siguiente gráfico nos demuestra lo anteriormente dicho:
imagen21.jpg

Obviamente, en algún momento de “restart” del Memcached Server, todos los objetos cacheados se pierden, y por ende cae el Hit Ratio, para en poco tiempo ubicarse dentro de los niveles normales.

Conclusión

Memcached y escalabilidad van de la mano, y todos podemos sacar jugo de esta interesante herramienta. Nuevamente se demuestra que las ideas brillantes son simples por naturaleza.

Califica esta nota:

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (8 votos, promedio: 4.25 de 5)
Loading ... Loading ...
Pichongol (Daniel López)

Sobre el autor

Pichongol (Daniel López)
Desarrollador Senior PHP, estudiante de Ing. en Sistemas de Información y Lic. en Biotecnología. Actualmente, reside en Argentina trabajando con PHP y J2EE.

Si eres nuevo en Maestros del Web y te agradan nuestras publicaciones, te invitamos a suscribirte a nuestro Feed.

Sindícanos en: Google Reader, Bloglines, My Yahoo o My MSN | ¿Qué es el Feed?

Comentarios

13 comentarios en total.

  1. Manuel lagar 11.07.2007 - 03:52 - #

    Interesante articulo.Pero estas caracteristicas ya deben ser implementadas nativamente por las bases de datos, me consta que Oracle y Sqlserver si lo hacen (se que son propietarias y caras), no se si mysql lo hace…

  2. Rodrigo 11.07.2007 - 09:09 - #

    Bueno el aporte! saludos

  3. Pichongol 11.07.2007 - 09:11 - #

    “Pero estas caracteristicas ya deben ser implementadas nativamente por
    las bases de datos, me consta que Oracle y
    Sqlserver si lo hacen (se que son propietarias y caras), no se si mysql lo hace…”

    Hola Manuel, como bien apuntas, las bases de datos deberian implementar un “Query cache” (me imagino
    que a esto te refieres), el tema es que no siempre es conveniente usarlo.
    Un cacheo de los queries inyecta un overhead en el motor de las bases de datos, que muchas veces implica
    lockeos de tablas, y por ende ralentiza las IO (entradas/salidas).
    Cuando se manejan volumenes de trafico del orden de los millones, no es tan bueno tener este tipo de overhead.
    Fijate que los ejemplos de sitios que usan memcached son sitios que manejan trafico por millones,
    rankeados en algunos casos Top 50, en algunos casos Top 10 en la escala mundial de manejo de trafico.

    Saludos!

  4. Pempas 13.07.2007 - 03:03 - #

    Interesante para una implementación de altas prestaciones, a tener en cuenta.

    Saludos

  5. xunilzita 17.07.2007 - 03:03 - #

    Interesantísimo, de hecho últimamente estaba buscando alternativas para aliviar bases de datos. De hecho voy a probarlo en esta semana.

    Gracias!

  6. Pablo 19.07.2007 - 04:13 - #

    Por qué pones “performance” en vez de “funcionamiento” ??
    Me ha tocado buscar en el diccionario…

    saludos.

  7. Alvaro Pereyra 19.07.2007 - 21:10 - #

    Más que funcionamiento, una traducción más acertada sería “desempeño”.

    ¡Muy buen artículo! Y la explicación sobre cache en las queries fue muy buena también.

    Normalmente un stored procedure permite eso, pero lo que hace es guardar el orden de ejecución de un query pero es memcached realiza el cache de la data en sí que es la que finalmente se llamará varias veces.

  8. marceloj 23.07.2007 - 18:46 - #

    muy bien, herramienta a considerar.

  9. Jose 04.09.2007 - 07:33 - #

    Excelente artículo,

    Muy aclaratorio y muy bien explicado.

    Me consta que en entornos donde se utilizan lenguajes de scripting tipo PHP, etc. usar memcached es garantía de rendimiento y escalabilidad.

    Un saludo.

  10. Fray 05.09.2007 - 11:11 - #

    Adhiero, pero pienso que para ser del todo útil hay que ubicar las llamadas al cache en lugares bien determinados.
    A demás para un mismo juego de claves puede haber distintos resultados, por ejemplo: una consulta del estado de la cuenta corriente de un cliente. Si bien podríamos cachear la consulta por la clave de la cuenta corriente, en la siguiente consulta nos devolvería información posiblemente vieja.
    Tal vez seria bueno que dieras casos prácticos concretos para poder hacer una valoración mas exacta de la herramienta.
    Saludos.

  11. Matias Gonzalez - Gaita 13.09.2007 - 19:11 - #

    Fray, la utilización de la tecnología memcached no implica que los datos NO estén actualizados. Lo ideal para esos casos es que en el momento de modificaciones en las db se actualicen los objetos del memcached correspondiente al caso y cuando se hace una consulta, esta ya esta cargada. Pero para un caso como el que planteas hay que estudiar el uso de esta tecnología, se usan mas que nada para trafico masivo.

    Suerte Pichongol! y un Abrazo

  12. Qsc 13.09.2007 - 21:21 - #

    amigo Pichongol !!! un saludo !!! ahorita estoy culminando un curso intensivo de desarrollador y estoy terminando mi proyecto en J2EE pero el mismo el patrocinado por IBM y por defecto nos obligan a trabajar con rational que es la herramienta de ellos !! ya q tu desarrollas en el mismo lenguaje con que framework lo trabajas con la misma ? Gracias de antemano !!!

  13. Qsc 13.09.2007 - 21:22 - #

    O mejor dicho me podrias dar referencia de otra que fuera Libre !!!

Deja tu Comentario


Maestros del Web se reserva el derecho de moderación de los comentarios. Evita utilizar palabras soeces, ataques directos, descalificativos, insultos, de lo contrario tu comentario será eliminado.


Boletín

Agrega nuestro feed a  Netvibes
wikio Add to Technorati Favorites

-


Maestros del Web es el punto de encuentro para los entusiastas de la red.

© Copyright 1997 - 2008 Maestros del Web. | CMS: Wordpress