Sobre Memcached, Apache2 y Drupal

Enviado por el 06/04/2011

Sobre Memcached, Apache2 y Drupal

Llega un momento en la vida de un sitio web levantado con Drupal(este es mi caso) en que, bien por el número de visitas o por la complejidad de las consultas, se hace necesario instalar y configurar un sistema de cacheo de contenido que agilice el proceso de envío de información.
No voy a entrar en que si proxy inverso, APC o mil gaitas, sólo trataré el proceso de instalación y configuración de memcache ejecutado en una máquina corriendo Debian GNU/Linux 6.0 Squeeze y Apache2 un sitio web con Drupal 6. Comenzamos descargando y activando el módulo "Memcache API and Integration" del sitio drupal.org.
A continuación, lo primero que debemos hacer es actualizar las fuentes de nuestra distribución Debian GNU/Linux:
[root@localhost] aptitude update
Una vez finalizado el proceso instalaremos dos paquetes:
  • memcached: "daemon" o servicio de cacheo diseñado específicamente para que los sitios web dinámicos decrementen la carga de las bases de datos almacenados objetos en memoria. Danga Interactive desarrolló memcached para mejorar la velocidad de LiveJournal.com un sitio que tuvo más de 20 millones de vistas de páginas dinámicas cada día para 1 millón de usuarios con un puñado de servidores web y un puñado de servidores de base de datos. memcached reduce la carga de la base de datos a casi nada, mejorando los tiempos de carga de las páginas para los usuarios, la utilización de los recursos y haciendo más rápido el acceso a las bases de datos.
  • php5-memcache y php5-memcached: Extensión que permite a las aplicaciones escritas en PHP5 comunicarse con los servidores memcache.
Como (casi) siempre en Debian GNU/Linux:
[root@localhost] aptitude -y install php5-memcached php5-memcache memcached
Si este paso se ha ejecutado correctamente debemos configurar qué tipo de estrategia hash utilizará memcache para manejar los objetos de la caché. Dos opciones : standard o consistency. Por lo que leído la tendencia es utilizar esta última, ya que si estamos trabajando con varios servidores memcache evitaríamos problemas al tener que compartir una misma instancia de ejecución de PHP-Apache2. Resumiendo:
Añadimos:
memcache.hash_strategy="consistent"
al fichero /etc/php5/apache2/php.ini.
Modificamos el fichero settings.php de nuestro sitio Drupal y añadimos:

$conf = array(
// The path to wherever memcache.inc is. The easiest is to simply point it
// to the copy in your module's directory.
'cache_inc' => './sites/default/modules/memcache/memcache.inc',

'memcache_servers' => array(
'localhost:11211' => 'default',
'localhost:11212' => 'content',
'localhost:11213' => 'filter',
'localhost:11214' => 'menu',
'localhost:11215' => 'page',
'localhost:11216' => 'views',
),
'memcache_bins' => array(
'cache' => 'default',
'cache_content' => 'content',
'cache_filter' => 'filter',
'cache_menu' => 'menu',
'cache_page' => 'page',
'cache_views' => 'views',
),

Lo realmente curioso de esta configuración para Drupal6, o por lo menos a mi llama mucho la atención, es la posibilidad de dedicar distintas máquinas a diferentes objetos de cache: views, menús...Intentaré darle una vuelta a este tema.
Para finalizar, he visto en este blog, que hay gente que reemplaza el fichero /etc/init.d/memcached por un con contenido similar a este:


#!/bin/bash
prog="memcached"
start() {
echo -n $"Starting $prog "
# Sessions cache.
memcached -m 16 -l 0.0.0.0 -p 11211 -d -u nobody
# Default cache.
memcached -m 32 -l 0.0.0.0 -p 11212 -d -u nobody
# Block cache.
memcached -m 32 -l 0.0.0.0 -p 11213 -d -u nobody
# Content cache. Holds fully loaded content type structures.
memcached -m 16 -l 0.0.0.0 -p 11214 -d -u nobody
# Filter cache. Usually the busiest cache after the default.
memcached -m 32 -l 0.0.0.0 -p 11215 -d -u nobody
# Form cache.
memcached -m 32 -l 0.0.0.0 -p 11216 -d -u nobody
# Menu cache.
memcached -m 32 -l 0.0.0.0 -p 11217 -d -u nobody
# Page cache. Bigger than most other caches.
memcached -m 128 -l 0.0.0.0 -p 11218 -d -u nobody
# Views definition cache.
memcached -m 1 -l 0.0.0.0 -p 11219 -d -u nobody
# Views data cache (may need to be increased if heavily used).
memcached -m 32 -l 0.0.0.0 -p 11220 -d -u nobody

# More caches that might be added later:
# Users table.
#/usr/bin/memcached -m 24 -l 0.0.0.0 -p 11219 -d -u nobody
# Path source cache.
#/usr/bin/memcached -m 4 -l 0.0.0.0 -p 11220 -d -u nobody
# Path destination cache.
#/usr/bin/memcached -m 6 -l 0.0.0.0 -p 11221 -d -u nobody
RETVAL=$?
echo
return $RETVAL
}

stop() {
if test "x`pidof memcached`" != x; then
echo -n $"Stopping $prog "
killall memcached
echo
fi
RETVAL=$?
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;

restart)
stop
start
;;
condrestart)
if test "x`pidof memcached`" != x; then
stop
start
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart}"
exit 1
esac

¿Por que digo similar? Pues muy sencillo, basta con teclear:
memcached -h
y observar todos los parámetros de configuración que acepta en la línea de comandos. En mi opinión se debe tener especial cuidado a la hora de manejar la cantidad de memoria máxima a utilizar, el protocolo de escucha, el número máximo de conexiones simultáneas. 



[ Memcache funcionando en Drupal 6 ]