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:
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:
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.
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…
Bueno el aporte! saludos
“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!
Interesante para una implementación de altas prestaciones, a tener en cuenta.
Saludos
Interesantísimo, de hecho últimamente estaba buscando alternativas para aliviar bases de datos. De hecho voy a probarlo en esta semana.
Gracias!
Por qué pones “performance” en vez de “funcionamiento” ??
Me ha tocado buscar en el diccionario…
saludos.
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.
muy bien, herramienta a considerar.
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.
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.
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
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 !!!
O mejor dicho me podrias dar referencia de otra que fuera Libre !!!
[…] Escalabilidad en Digg Maestros del web sobre memcached. […]
[…] Memcached de Danga Interactive es 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” como explica perfectamente Daniel López en Maestros del Web. […]
[…] criterio: los administradores de los trackers pueden eliminar todos los datos de estos a traves de memcached cerrado, y todo esto aunque el tracker no tenga conexion a la red. Te preguntaras ¿por que es la […]
Muy buen artículo. Me gutaría saber algo, en el artículo se muestar una imagen que son el resultado de monitorear memcached, ¿que programa es?.
Saludos y gracias 😀
Realmente es de lo mejor, combinado con un buen PHP Cacher como XCache hace maravillas
[…] http://www.maestrosdelweb.com/editorial/memcached-un-alivio-para-las-bases-de-datos/ a few seconds ago from IdentiFox […]