systemadmin.es > LAMP y web > Uso de memcached como cache de contendio de Apache para soportar el efecto Barrapunto

Uso de memcached como cache de contendio de Apache para soportar el efecto Barrapunto

Mediante memcached y el modulo mod_memcache_cache de Apache 2.2 podemos usar como cache de contenido memcached, permitiendo compartir el contenido en cache entre todos los frontales web.

Por todos es conocido el efecto Barrapunto o su equivalente en cuaquier otro site con gran cantidad de usuarios como meneame o el mismo Slashdot.

Si un artículo de un site passa a la portada de alguno de ellos, las visitas se multiplican de tal forma que lo que con pocos usuarios no es problema (una query sin índices, un buscador fulltext, php sin eAccelerator o equivalente, un apache configurado “por defecto”…) acaba provocando que el site se caiga, de timeout de forma intermitente o vaya muy lento.

Evidentemente, la optimización de queries, una buena configuración del servidor web o el uso de uno lijero como nginx o lighttpd debería ser la prioridad. Si el problema persiste por la cantidad de visitas, o simplementen tenemos que solucionar el problema “ahora“, podemos optar por usar una cache de contenido.

En apache esta disponible el modulo mod_cache, el cual permite realizar esta tarea mediuante diferentes modulos de almacenaje. Los que vienen con el mismo apache són:

  • mod_disk_cache: Almacena el contenido en disco y lo sirve desde allí
  • mod_mem_cache: Almacenando el contenido en la memória local del frontal

Otra opción es usar el mod_memcache_cache, el cual permite el uso de memcached para el almacenaje de los datos, por lo que la memória dispónible es la suma de todos los nodos que dispongan de este daemon, por lo tanto augmentando el tamaño de memória disponible.

Para su instalación, primero de todo necesitamos tener instalado un Apache 2.2 con el modulo cache. Por ejemplo:

# ./configure --prefix=/usr/local/apache22 \
              --exec-prefix=/usr/local/apache22 \
              --enable-so --disable-autoindex \
              --enable-rewrite --enable-cache
# make && make install

Debemos instalar apr_memcache. Su instalación resulta simple:

# ./configure --with-apr=/usr/local/apache22/ \
             --with-apr-util=/usr/local/apache22/ \
             --prefix=/usr/local/ \
             --exec-prefix=/usr/local/
# make && make install

A continuación instalamos el modulo con las siguientes instrucciones:

# CFLAGS="-I/usr/local/src/httpd-2.2.9/modules/cache/" \
./configure --with-apxs=/usr/local/apache22/bin/apxs \
             --with-apr-memcache=/usr/local/
# make && make install

Finalmente sólo debemos añadir al VirtualHost que deseemos que use la cache las siguientes directivas:

LoadModule memcached_cache_module modules/mod_memcached_cache.so
<IfModule mod_memcached_cache.c>
        CacheEnable memcached /
        MemcachedCacheServer localhost:11211
        MemcachedMaxServers 10
        MemcachedMinConnections 10
        MemcachedSMaxConnections 10
        MemcachedMaxConnections 10
        MemcachedConnectionTTL 10
        MemcachedCacheMinFileSize 1
        MemcachedCacheMaxFileSize 2097152

        CacheDisable /admin/
</IfModule>

Són especialmente importantes las directivas:

  • MemcachedCacheMinFileSize: Define el tamaño mínimo para que un fichero se almacene en memcached
  • MemcachedCacheMaxFileSize: Define el tamaño a partir del cual ya no se usará la cache. Es especialmente importante evitar que se nos llene memcached de contenido estático, como pueden ser videos o fotos, para permitir que entren contendio dinámico que consume más recursos.
  • CacheDisable: Permite deshabilitar ciertas zonas del site que no nos interesa que se haga cache

One comment to “Uso de memcached como cache de contendio de Apache para soportar el efecto Barrapunto”

  1. Yo cambiaría el nombre del artículo por “efecto meneame” 🙂

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>