Es posible volcar partes de la caché usando "stats dump ..." para obtener algunas de las claves de la caché (y luego puedes seguir adelante y obtener cada valor). Aquí tienes un ejemplo de cómo hacerlo: stats dump 1 10 xxxx get ¿No sería mejor si pudieras espiar al servidor memcached? La gente que ejecuta memcached en Solaris ya puede hacerlo usando DTrace. Pero sería bueno crear una solución que funcione también para otros. Dustin Sallings y yo nos unimos y empezamos a diseñar una interfaz que te permitiera obtener un flujo de notificaciones de tu servidor memcached. Entre los requisitos para la solución estaban:

  • Motor neutral. La gente puede tener sus propios motores especializados de almacenamiento memcached, y de qué sirve una nueva interfaz si no puede funcionar con sus motores especializados. Esto significa que el protocolo tiene que ser extensible.
  • Utilice el protocolo binario para obtener la máxima portabilidad. El protocolo binario es inequívoco, neutral en cuanto a hardware, sistema operativo y lenguaje de programación. Utilizando el protocolo binario podemos intervenir en servidores remotos.

La interfaz tap abre muchas posibilidades a los desarrolladores de software memcached:

  • Observabilidad: podemos conectar un cliente de escucha al servidor y ver cuándo se añaden/modifican/eliminan elementos.
  • Replicación - ¿Por qué no dejar que un servidor memcached escuche los eventos de tap de otro servidor? ¿Por qué limitarse a uno? Creemos un círculo de 10 servidores y dejemos que hagan tap en el siguiente del círculo (ten en cuenta que esto crea una ventana de inconsistencia desde que realizas una operación en el primer nodo hasta que se "replica" en todo el círculo).
  • Persistencia - Esta es una de las peticiones más populares que veo estos días. En lugar de crear un motor especializado que haga persistencia, podemos conectar un tap stream que reciba todos los eventos de mutación del servidor memcached y almacene los datos en un medio persistente.

¿Cómo funciona la interfaz Tap? Funciona aprovechando la implementación del motor memcached. En esta implementación, el núcleo de memcached es responsable de la gestión del protocolo y de la entrada/salida de red, y el motor es responsable de alimentar el núcleo con un flujo de eventos. Veamos un ejemplo: Cuando el servidor recibe un mensaje "TAP Connect" del cliente, el núcleo memcached intentará obtener un flujo tap del motor de almacenamiento llamando a get_tap_iterator(). Con el iterador en su lugar, el núcleo memcached intentará obtener el siguiente evento para enviarlo al cliente tap siempre que el socket sea escribible. Si el motor no tiene ningún evento que enviar al cliente, el iterador debería devolver TAP_PAUSE (y llamar a notify_io_complete para notificar al núcleo que comience a recorrer el iterador de nuevo). ¿Qué aspecto tiene el iterador? A primera vista puede parecer demasiado complejo, pero echemos un vistazo más de cerca al prototipo: tap_event_t tap_iterator(ENGINE_HANDLE* handle, const void *cookie, item **item, void **engine_specific, uint16_t *nengine_specific, uint8_t *ttl, uint16_t *flags, uint32_t *seqno); La documentación de la API da información detallada sobre cada parámetro, pero me gustaría destacar uno de los parámetros. El parámetro engine_specific permite a cada motor de almacenamiento pasar información extra en cada mensaje TAP para que el motor receptor pueda recrear el evento (por ejemplo, podría ser información de bucket utilizada por el motor de bucket, o información extra de seguridad si creas un motor consciente de la seguridad). El servidor memcached también es capaz de recibir mensajes TAP y pasarlos al motor de almacenamiento. Cada vez que reciba un mensaje TAP, llamará a la función tap_notify en la interfaz del motor: ENGINE_ERROR_CODE tap_notify(ENGINE_HANDLE* handle, const void *cookie, void *engine_specific, uint16_t nengine, uint8_t ttl, uint16_t tap_flags, tap_event_t tap_event, uint32_t tap_seqno, const void *key, size_t nkey, uint32_t flags, uint32_t exptime, uint64_t cas, const void *data, size_t ndata); Parece fácil, ¿verdad? Si te parece interesante, échale un vistazo al proyecto TAP.

Autor

Publicado por Trond Norbye, Desarrollador Senior, Couchbase

Trond Norbye es Arquitecto de Software en Couchbase. Colaborador principal de los proyectos Couchbase y Memcached. Creó las bibliotecas de cliente C/C++ y node.js de Couchbase.

3 Comentarios

  1. ¿Saben cómo puedo hacer esto en la versión Windows? Necesito enumerar todas las claves utilizando el cliente .net.

  2. Matt Ingenthron marzo 11, 2012 a 4:28 am

    libcouchbase se construye bajo MSVC, por lo que en realidad se puede hacer esto con C en Windows, pero no hay actualmente una opción .NET. El otro cliente principal es el cliente Java.

    Nunca lo he probado, pero es posible que la muestra tap.py que viene con el servidor puede ser adaptado para funcionar con IronPython. Utilícelo bajo su propio riesgo. Tenga cuidado, como TAP con el registro puede conducir a condiciones OOM si no tienes cuidado.

Dejar una respuesta