seticonimage seticon java caching persistence memcached distributed

seticonimage - seticon java



alternativa a memcached que puede persistir en el disco (15)

¿Has mirado BerkeleyDB ?

  • Administración de datos rápida, integrada y en proceso.
  • Tienda clave / valor, no relacional.
  • Almacenamiento persistente.
  • Gratis, de código abierto.

Sin embargo, no cumple con uno de sus criterios:

  • BDB admite la replicación distribuida, pero los datos no están particionados. Cada nodo almacena el conjunto completo de datos.

Actualmente estoy usando memcached con mi aplicación java, y en general está funcionando muy bien.

Las características de memcached que son más importantes para mí son:

  • es rápido, ya que las lecturas y escrituras están en la memoria y no tocan el disco
  • es solo una tienda clave / valor (ya que eso es todo lo que necesita mi aplicación)
  • esta distribuido
  • usa la memoria de manera eficiente haciendo que cada objeto viva en exactamente un servidor
  • no supone que los objetos son de una base de datos (ya que mis objetos no son objetos de la base de datos)

Sin embargo, hay una cosa que me gustaría hacer que memcached no puede hacer. Deseo guardar periódicamente el contenido de la caché en el disco (quizás una vez al día). Y quiero poder restaurar la memoria caché desde la imagen de disco guardada.

El guardado del disco no necesita ser muy complejo. Si se agrega una nueva clave / valor mientras se lleva a cabo el guardado, no me importa si está incluido en el guardado o no. Y si se modifica una clave / valor existente mientras se lleva a cabo el guardado, el valor guardado debe ser el valor anterior o el nuevo, pero no me importa cuál.

¿Alguien puede recomendar otra solución de almacenamiento en caché (ya sea gratuita o comercial) que tenga todas (o un porcentaje significativo) de las características de memcached que son importantes para mí, y también permite la capacidad de guardar y restaurar todo el caché desde el disco?



Creo que membase es lo que quieres.


Eche un vistazo al Apache Java Caching System (JCS)

JCS es un sistema de caché distribuido escrito en java. Está destinado a agilizar las aplicaciones al proporcionar un medio para administrar datos en caché de varias naturalezas dinámicas. Al igual que cualquier sistema de almacenamiento en caché, JCS es más útil para aplicaciones de lectura alta y baja presentación. Los tiempos de latencia caen bruscamente y los cuellos de botella se alejan de la base de datos en un sistema efectivamente en caché. Aprenda cómo comenzar a usar JCS.

El JCS va más allá de simplemente almacenar objetos en la memoria caché. Proporciona numerosas características adicionales:

* Memory management * Disk overflow (and defragmentation) * Thread pool controls * Element grouping * Minimal dependencies * Quick nested categorical removal * Data expiration (idle time and max life) * Extensible framework * Fully configurable runtime parameters * Region data separation and configuration * Fine grained element configuration options * Remote synchronization * Remote store recovery * Non-blocking "zombie" (balking facade) pattern * Lateral distribution of elements via HTTP, TCP, or UDP * UDP Discovery of other caches * Element event handling * Remote server chaining (or clustering) and failover * Custom event logging hooks * Custom event queue injection * Custom object serializer injection * Key pattern matching retrieval * Network efficient multi-key retrieval


En mi experiencia, es mejor escribir una capa intermedia entre la aplicación y el almacenamiento de back-end. De esta forma puede emparejar instancias de memcached y, por ejemplo, compartirlas (básicamente el mismo almacén de clave-valor, pero basado en disco). La forma más básica de hacer esto es leer siempre de memcached y fail-back a shareddanced y siempre escribir a sharedanced y memcached.

Puede escalar escrituras mezclando entre varias instancias de partenudancia. Puede escalar las lecturas en pliegue N utilizando una solución como repcached (memcached replicado).

Si esto no es trivial para usted, puede usar sharedanced como un reemplazo básico para memcached. Es rápido, la mayoría de las llamadas al sistema de archivos se almacenan en caché, al usar memcached en combinación con sharedance solo se evita la lectura de sharedanced hasta que algunos datos caduquen en Memcache. Un reinicio de los servidores de memcached provocaría que todos los clientes leyeran al menos una vez desde la instancia de sharedance, lo cual no es realmente un problema, a menos que tenga una concurrencia extremadamente alta para las mismas claves y los clientes compitan por la misma clave.

Hay ciertos problemas si se trata de un entorno de tráfico extremadamente grave, uno es la elección del sistema de archivos (reiserfs realiza 5-10 veces mejor que ext3 debido a algún almacenamiento interno del árbol fs), no tiene soporte udp (TCP keepalive) es bastante costoso si usas solo sharedance, memcached tiene udp gracias al equipo de Facebook) y el escalado generalmente se realiza en tu aplicación (fragmentando datos en múltiples instancias de servidores de partidas).

Si puede aprovechar estos factores, esta podría ser una buena solución para usted. En nuestra configuración actual, un único servidor sharedanced / memcache puede escalar hasta aproximadamente 10 millones de páginas vistas al día, pero esto depende de la aplicación. No utilizamos el almacenamiento en caché para todo (como Facebook), por lo que los resultados pueden variar en lo que respecta a su aplicación.

Y ahora, dos años después, Membase es un gran producto para esto. O Redis, si necesita funcionalidad adicional como Hashes, listas, etc.


Estamos usando OSCache . Creo que cumple con casi todas sus necesidades, excepto guardar periódicamente el caché en el disco, pero debería poder crear 2 gestores de caché (uno basado en memoria y uno en disco duro) y ejecutar periódicamente cronjob java que atraviesa todas las claves de caché en memoria / pares de valores y los coloca en la memoria caché de hdd. Lo bueno de OSCache es que es muy fácil de usar.


Memcached puede ser sustituido por couchbase : esta es una fuente abierta y una continuación comercial de esta línea de productos. Tiene persistencia de datos a disco (muy eficiente y configurable). También los autores originales de memcached han estado trabajando en Couchbase y es compatible con el protocolo de memcached, por lo que no necesita cambiar el código de su aplicación cliente. Es un producto con un rendimiento excelente y viene con agrupamiento 24/7 y Cross Datacenter Replication (XDCR) integrados. Consulte el documento técnico .


Nunca lo he intentado, pero ¿y redis ?
Su página de inicio dice (citando):

Redis es una base de datos de valores-clave. Es similar a memcached pero el conjunto de datos no es volátil, y los valores pueden ser cadenas, exactamente como en memcached, pero también listas y conjuntos con operaciones atómicas para elementos push / pop.

Para ser muy rápido pero al mismo tiempo persistente, todo el conjunto de datos se toma en la memoria y, de vez en cuando, y cuando se realizan varios cambios en el conjunto de datos, se escribe de forma asíncrona en el disco. Puede perder las últimas consultas aceptables en muchas aplicaciones pero es tan rápido como una base de datos en memoria (Redis admite la replicación maestro-esclavo no bloqueante para resolver este problema por redundancia).

Parece responder algunos de los puntos que mencionaste, ¿entonces tal vez podría ser útil en tu caso?

Si lo intentas, estoy bastante interesado en lo que descubres, por cierto ;-)


Como nota al margen: si necesita escribir todo esto en el disco, tal vez un sistema de caché no es realmente lo que necesita ... después de todo, si está utilizando memcached como caché , debería poder volver a llenarlo en -demand, siempre que sea necesario, aún así, lo admito, puede haber algunos problemas de rendimiento si todo el clúster de memcached cae al mismo tiempo ...

Entonces, ¿tal vez algún software "más" orientado a la tienda clave / valor podría ayudar? Algo como CouchDB , por ejemplo?
Probablemente no sea tan rápido como memcached, ya que los datos no se almacenan en la RAM, sino en el disco, aunque ...


Oracle NoSQL se basa en BerkeleyDB (la solución a la que se refirió Bill Karwin), pero agrega fragmentación (división del conjunto de datos) y escalado elástico. Ver: http://www.oracle.com/technetwork/products/nosqldb/overview/index.html

Creo que cumple con todos los requisitos de la pregunta original.

En aras de una divulgación completa, trabajo en Oracle (pero no en el producto Oracle NoSQL). Las opiniones y opiniones expresadas en este post son mías y no reflejan necesariamente las opiniones o opiniones de mi empleador.


Pruebe go-memcached - servidor de Memcache escrito en Go . Persiste los datos almacenados en la memoria caché al salir de la caja. Go-memcached es compatible con los clientes de Memcache. Tiene las siguientes características que faltan en el memcached original:

  • Los datos almacenados en caché sobreviven los bloqueos y / o reinicios del servidor.
  • El tamaño de la caché puede exceder el tamaño de RAM disponible en varios órdenes de magnitud.
  • No hay un límite de 250 bytes en el tamaño de la clave.
  • No hay un límite de 1 Mb en el tamaño del valor. El tamaño del valor en realidad está limitado por 2Gb.
  • Es más rápido que el memcached original. También usa menos CPU al atender solicitudes entrantes.

Aquí están los números de rendimiento obtenidos a través de go-memcached-bench :

----------------------------------------------------- | | go-memcached | original memcached | | | v1 | v1.4.13 | | workerMode ---------------------------------------- | | Kqps | cpu time | Kqps | cpu time | |---------------------------------------------------- | GetMiss | 648 | 17 | 468 | 33 | | GetHit | 195 | 16 | 180 | 17 | | Set | 204 | 14 | 182 | 25 | | GetSetRand | 164 | 16 | 157 | 20 | -----------------------------------------------------

Los binarios enlazados estáticamente para go-memcached y go-memcached-bench están disponibles en la página de descargas .


Puede usar GigaSpaces XAP, que es un producto comercial maduro que responde a sus necesidades y más. Es la cuadrícula de datos en memoria más rápida distribuida (caché ++), está completamente distribuida y admite múltiples estilos de métodos de persistencia.

Guy Nirpaz, GigaSpaces



Solo para completar esta lista, acabo de encontrar couchbase . Sin embargo, aún no lo he probado.


Tal vez tu problema como el mío: solo tengo unas pocas máquinas para memcached, pero con mucha memoria. Incluso si uno de ellos falla o necesita reiniciarse, afecta seriamente el rendimiento del sistema. De acuerdo con la filosofía original de Memcached, debería agregar muchas más máquinas con menos memoria, pero eso no es rentable y no es exactamente "TI verde";)

Para nuestra solución, construimos una capa de interfaz para el sistema de caché de manera que los proveedores de sistemas de caché subyacentes puedan anidarse , como lo hace con las secuencias, y escribimos un proveedor de caché para memcached, así como nuestro propio valor-clave muy simple Proveedor de almacenamiento de -2 discos. A continuación, definimos un peso para los elementos de la memoria caché que representa qué tan costoso es reconstruir un elemento si no se puede recuperar de la memoria caché. El caché de disco anidado solo se usa para artículos con un peso por encima de un cierto umbral, tal vez alrededor del 10% de todos los artículos.

Al almacenar un objeto en la memoria caché, no perderemos tiempo ya que el guardar en una o ambas memorias caché se pone en cola para la ejecución asincrónica de todos modos. Por lo tanto, escribir en la memoria caché de disco no necesita ser rápido. Lo mismo para las lecturas: Primero vamos a memcached, y solo si no está allí y es un objeto "costoso", entonces verificamos la caché del disco (que es por magnitudes más lentas que las memcached, pero aún mucho mejor que recalcular 30 GB de datos después de que una sola máquina se cayó).

De esta forma, obtenemos lo mejor de ambos mundos, sin reemplazar los objetos dañados por nada nuevo.


EhCache tiene un modo "persistente en el disco" que vacia el contenido de la caché en el disco al apagarlo, y restablecerá los datos cuando se vuelva a iniciar la copia de seguridad. En cuanto a sus otros requisitos, cuando se ejecuta en modo distribuido, replica los datos en todos los nodos, en lugar de almacenarlos en solo uno. aparte de eso, debe ajustarse a tus necesidades. También está aún en desarrollo activo, lo que muchos otros frameworks de caché de Java no lo están.