Cómo hacer un volcado de información toda la información en memcached

A partir de la versión Memcached 1.4.31, se añade una nueva funcionalidad que permite dump de todosl los metadata de un slab class particular, una lista de slab clases o todos los slabs. Para poder hacer esto existe el comando lru_crawler metadump [all|1|2|3], para ejecutarlo desde el telnet.

https://github.com/memcached/memcached/pull/193

Para poder redireccionar la salida a un fichero hemos encontrado la opción de utilizar el comando tee:

 

telnet  ip puerto | tee -a log.log

#Almacenamos la clave.

set key 0 900 4

STORED

#Sacamos toda la información que está en la mmechached

lru_crawler metadump all

key=key exp=1483978211 la=1483977314 cas=1 fetch=no

quit

 

 

Caducidad de los datos en memcached

Hay dos tipo de caducidad de datos en memcached, uno porque no hay suficiente espacio para almacenar un nuevo valor, lo cual implica que memcached hará sitio utilizando el algoritmo LRU, como explicamos anteriormente,

Se puede cambiar este comportamiento iniciando memcached con la opción –M. Está opción fuerza a memcached a devolver un error cuando se quede sin memoria en vez de borrar los datos más antiguos.

El segundo mecanismo de caducidad de datos es un mecanismo explicito que puedes utilizar cuando insertas un valor en la cache o cuando borras un elemento de la esta-. Esto permite asegurarnos de cuando recuperemos un dato de la cache no está obsoleto y cumple nuestros requisitos.

El mecanismo de caducidad es el siguiente,  cuando tu solicitas un dato memcached lo compara con el momento actual y ve si ha caducado, si no ha caducado lo devuelve , si ha caducado lo borra. A nivel de las trazas de mecached se ve algo así:

FOUND KEY adios -nuked by expire – Lo encuentra y como está caducado lo borra.

Y por último se puede utilizar el comando delete para eliminar uno de los valores de la cache.

Cómo obtener un cachedump de los almacena memcached

pero que puede ser útil para ver que tenemos en memoria.

Desde una conexión telnet:

Ejecutar stats cachedump <slabs_id> <limit>

Obtenemos la información de un slab determinado, si queremos ontener toda la información del slab utilizaremos limit a 0. Si no se indica limite puede volcar demasiada información.

stats cachedump 1 0
ITEM estoy [4 b; 1414759880 s]                                                              ITEM adios [4 b; 1414759738 s]                                                              ITEM hola [4 b; 1414759649 s]                                                               ITEM key [4 b; 1414759490 s]

La salida de este comando es valor de la llave, el tamaño  y expiration_timestamp en segundos.

Para entender el timestamp utilizaremos el comando stats del servidor:

Si el timestamp es igual (stat.time – stat.uptime) el ítem no vence nunca.

stats                                                                                       STAT pid 27469                                                                              STAT uptime 12022                                                                           STAT time 1414759586                                                                        STAT version 1.4.20

Memcached algoritmo LRU

Antes de iniciar el proceso de memcached se le tiene que indicar cuanta memoria tiene que utilizar. Pero qué pasa si nosotros ocupamos toda la memoria que le hemos indicado a memcached que puede utilizar. ¿Qué pasa cuando queremos añadir más datos?.

Memcached borrará el dato más antiguo para hacer sitio a los nuevos datos. El dato que será borrado lo elegira memcached en function del algoritmo LRU: Last Recently Used, o sea que borra el dato que no ha sido utilizado durante más tiempo.

Iternamete todos los objetos tiene un contador, Este contador almacena un timestamp. Cada vez que se crea un nuevo objeto, el contador se actualiza con la hora del momento. Siempre que memcached necestia borrar un objeto para hacer espacio para un nuevo, busca el contador más antiguo. El objeto que no ha sido recuperado o que fue recuperado hace más tiempo (y que porbablemante no se necesita tanto). Recordar que este algoritmo lo utiliza por slab-class, no por el total de la memoria.

Encontré este enlace que me pareció muy interesante.

http://work.tinou.com/2011/04/memcached-for-dummies.html

Pequeña introdución sobre Memcahed

Memcahed es una cache simple y escalable que almacena datos y objetos en RAM para un rápido acceso de las aplicaciones. Para utilizarlo se debe ejecutar el comando memcache en uno o más servidores y utilizar la cache compartida para almacenar objetos. Las ventajas que tiene la utilización de memcached son:

  • La información se almacena en RAM, lo que permite un rápido acceso a ella.
  • No tiene restricciones de tipos de datos se pueden almacenar estructuras complejas, documentos, imagines o una mezcla de cosas. La única restricción es el tamaño hasta 1 mega.
  • En memcached se tiene que almacenar información temporal o de solo lectura que no tiene persistencia. Normalmente la aplicación lee de memcached y si no se encuentra ahí se acude a una base de datos, donde la lee y la sube a memcached para futuras búsquedas.

Memchached consiste en dos componentes un memcache servidor y memcache cliente.

Es una base de datos tipo Key –Value

La asignación de memoria en Memcached.

Memcached utiliza para la asignación de memoria lo que llama Slab allocation. Cuando inicializas memcached  parte la memoria asignada en pequeñas partes llamadas páginas. Cada página ocupa 1Mb (coincide con el tamaño máximo de un objeto que puede ser almacenado en memcached). Cada una de estas páginas puede estar asignada una slab-class o puede estar desasignada (ser un página free)  Una slab-class  decide el tamaño de los objetos a almacenar en una página en particular. Cada página que es asignada a una slab-class especificase divide en pequeñas partes llamadas chunks. Los chunks de slab tienen el mismo tamaño y no puede haber dos chunks de diferente tamaño dentro de una página. Por instancia puede haber una página con chunks de 80byte (slab class 1), una página con chunks de 100 bytes (slab class 2)y así en adelante hasta llegar a slab más grande que tiene un solo chunk (de 1MB). Puede haber múltiples páginas por slab-class, pero una vez que una página ha sido asignada a slab-class (y por tanto divida en chunks) no puede ser asignada a otra slab-class.

El chunk más pequeño comienza con un tamaño de 80 bytes y va aumentando con un factor de 1.25, con lo cual el siguiente tamaño de chunk sería de 100 y así en adelante. Se puede ver la distribución de los chunks con la opción –vv cuando inicias el memcached. Se puede modificar el factor de incremento del tamaño de los chunks con (.-f) pero no es muy recomendable.

slab class   1: chunk size        96 perslab   10922                                        slab class   2: chunk size       120 perslab    8738                                        slab class   3: chunk size       152 perslab    6898                                        slab class   4: chunk size       192 perslab    5461                                        slab class   5: chunk size       240 perslab    4369                                        slab class   6: chunk size       304 perslab    3449                                        slab class   7: chunk size       384 perslab    2730                                        slab class   8: chunk size       480 perslab    2184

Con la opción –vv se ve cuantas slab-class hay, el tamaño de los chunks dentro de ellas y cuantos chunks tiene (cuanto mayor sea el tamaño de los chuks, menor será el número de estos. Memcached crea inicialmente 1 página por slab-class y el resto de las páginas las deja libres. Cuando un slab necesita una página la coge, Una vez que memcached ha particionado la memoria, añade los datos al slab. Imagínate que tienes un objeto de 105 bytes, mencached lo almacena en el slab 3. Lo cual implica 23 bytes serán inutilizados. Nunca estos 23 bytes se podrán utilizar. Así evita mencached que la memoria se fragmente.

Cuando toda la página este uilizada (todos los chuncks están llenos) y necesitamos insertar más datos, se cogera un nueva página y se asignara al slab-class correspondiente, particionado lo en chunks y cogiendo el primer chunk disponible para almacenar los datos. Pero cuando no tengamos más páginas disponibles para asignarlas a nuestro slab-class, se utilizara el algoritmo LRU para limpiar uno de los chuks existentes y hacer sitio. Esto significa que cuando necesitemos un chunk de 128 bytes, eliminaremos un chunk de 128 bytes, a pesar de que pueda existir un chunk de 256bytes que sea más antiguo. Cada slab-class tiene su propio algoritmo de LRU.

Se puede obtener por telnet estadísticas de los slabs con el comando stats slabs

Esta información está traducida de este artículo. https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/