alternativa a memcached que puede persistir en el disco


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 las escrituras están en memoria y no tocan el disco
  • es solo una tienda de clave/valor (ya que eso es todo lo que mi aplicación necesita)
  • se distribuye
  • utiliza la memoria de manera eficiente al tener cada objeto vivo en exactamente un servidor
  • no asume que los objetos son de un base de datos (ya que mis objetos no son objetos de base de datos)

Sin embargo, hay una cosa que me gustaría hacer que memcached no puede hacer. Quiero guardar periódicamente (tal vez una vez al día) el contenido de la caché en el disco. Y quiero ser capaz de restaurar la caché de la imagen de disco guardada.

El almacenamiento en disco no tiene por qué ser muy complejo. Si se agrega una nueva clave/valor mientras se realiza el guardado, no me importa si está incluido en el guardado o no. Y si un existente la clave / valor se modifica mientras se realiza el guardado, el valor guardado debe ser el valor antiguo o el nuevo, pero no me importa cuál.

¿Puede alguien 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 permita la capacidad de guardar y restaurar toda la caché desde el disco?

Author: Mike W, 2009-08-22

15 answers

Tal vez su 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 ser reiniciado, 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 cada una, pero eso no es rentable y no es exactamente "green IT";)

Para nuestra solución, construimos una capa de interfaz para el sistema de caché de una manera que los proveedores de sistemas de caché subyacentes puede ser anidado, como puede hacer con flujos, y escribió un proveedor de caché para memcached, así como nuestro propio proveedor de almacenamiento de clave-Valor-2-disco muy simple. Luego definimos un peso para los elementos de caché que representa lo costoso que es reconstruir un elemento si no se puede recuperar de la caché. La caché de disco anidado solo se utiliza para los elementos con un peso por encima de un cierto umbral, tal vez alrededor del 10% de todos los elementos.

Al almacenar un objeto en la caché, no perderemos tiempo al guardar uno o ambas cachés están en cola para la ejecución asíncrona de todos modos. Por lo tanto, escribir en la caché del disco no tiene que ser rápido. Lo mismo para reads: Primero vamos por memcached, y solo si no está allí y es un objeto "costoso", entonces revisamos la caché del disco (que es por magnitudes más lenta que memcached, pero aún así mucho mejor que recalcular 30 GB de datos después de que una sola máquina se cayera).

De esta manera obtenemos lo mejor de ambos mundos, sin reemplazar memcached por nada nuevo.

 14
Author: realMarkusSchmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-05 06:42:11

Nunca lo he probado, pero ¿qué pasa con redis ?
Su página de inicio dice (citando):

Redis es una base de datos clave-valor. 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 atómica operaciones para elementos push / pop.

Con el fin de ser muy rápido, pero en el persistente al mismo tiempo todo el conjunto de datos se toma en la memoria y del tiempo a tiempo y / o cuando un número de cambios al conjunto de datos se realizan es escrito asíncronamente en disco. Usted puede perdido las últimas consultas que es aceptable en muchas aplicaciones pero es tan rápido como una DB en memoria (Redis soporta maestro-esclavo sin bloqueo replicación para resolver esto problema por redundancia).

Parece responder a algunos puntos de los que habló, así que tal vez podría ser útil, en su caso?

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


Como nota al margen: si necesita escribir todo esto en el disco, tal vez un sistema de caché no sea realmente lo que necesita... después de todo, si está utilizando memcached como una caché , debería poder volver a rellenarla bajo demanda, siempre que sea necesario still aún así, admito, podría haber algunos problemas de rendimiento si todo el clúster de memcached cae a la vez...

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

 17
Author: Pascal MARTIN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-03 11:55:27

EhCache tiene un modo "disco persistente" que vuelca el contenido de la caché al disco al apagarse, y restablecerá los datos cuando se inicie de nuevo. 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 adaptarse a sus necesidades muy bien. También está todavía en desarrollo activo, lo que muchos otros marcos de almacenamiento en caché de Java no lo están.

 13
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-14 08:44:21

Try go-memcached - servidor memcache escrito en Go. Persiste los datos almacenados en caché en el disco fuera de la caja. Go-memcached es compatible con los clientes memcache. Tiene las siguientes características que faltan en el original memcached:

  • Los datos almacenados en caché sobreviven a los bloqueos y/o reinicios del servidor.
  • El tamaño de la caché puede exceder el tamaño de la RAM disponible en múltiples órdenes de magnitud.
  • No hay límite de 250 bytes en el tamaño de la clave.
  • No hay límite de 1Mb en tamaño del valor. El tamaño del valor en realidad está limitado por 2 Gb.
  • es más rápido que el original memcached. También utiliza menos CPU al servir 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 vinculados estáticamente para go-memcached y go-memcached-bench están disponibles en la página de descargas de .

 5
Author: valyala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-05 16:07:03

Echa un vistazo al Apache Java Caching System (JCS)

JCS es un sistema de almacenamiento en caché distribuido escrito en java. Está destinado a acelerar las aplicaciones proporcionando un medios para gestionar los datos almacenados en caché de varios naturalezas dinámicas. Como cualquier almacenamiento en caché sistema, JCS es el más útil para el alto leer, baja poner aplicaciones. Latencia los tiempos caen bruscamente y los cuellos de botella alejarse de la base de datos en un sistema efectivamente almacenado en caché. Aprenda cómo para empezar a usar JCS.

El JCS va más allá del simple almacenamiento en caché objetos en la memoria. 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
 4
Author: Mads Hansen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-22 20:16:20

Creo membase es lo que quieres.

 4
Author: Benjamin Nitlehoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-25 19:56:57

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

Puede escalar las escrituras dividiendo entre varias instancias de sharedance. Puede escalar lecturas N-fold usando un solución como repcached (memcached replicado).

Si esto no es trivial para usted, todavía puede utilizar 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é - el uso de memcached en combinación con sharedance solo evita la lectura de sharedanced hasta que algunos datos caduquen en memcache. Un reinicio de los servidores memcached provocaría que todos los clientes leyeran al menos una vez desde la instancia de sharedance , no es realmente un problema, a menos que tenga extremadamente alta concurrencia para las mismas claves y los clientes compiten por la misma clave.

Hay ciertos problemas si se trata de un entorno de tráfico muy alto, uno es la elección del sistema de archivos (reiserfs realiza 5-10x mejor que ext3 debido a algún almacenamiento en caché interno del árbol fs), no tiene soporte udp (TCP keepalive es una sobrecarga si solo utiliza sharedance, memcached tiene udp gracias al equipo de facebook) y el escalado generalmente se realiza en su aplicación (por sharding data across multiple instances of sharedance servers).

Si puede aprovechar estos factores, entonces esta podría ser una buena solución para usted. En nuestra configuración actual, un solo 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 cuando se trata de su aplicación.

Y ahora, un buen 2 años más tarde, Membase es un gran producto para esto. O Redis, si necesita funcionalidad adicional como Hashes, Listas, etc.

 3
Author: Tit Petric,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-20 13:21:16

¿Qué pasa con Terracota?

 2
Author: Artyom Sokolov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-27 00:17:43

Oracle NoSQL se basa en BerkeleyDB (la solución a la que Bill Karwin señaló), pero agrega sharding (partición del conjunto de datos) y elastic scale-out. Véase: http://www.oracle.com/technetwork/products/nosqldb/overview/index.html

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

En aras de la divulgación completa, trabajo en Oracle (pero no en el producto Oracle NoSQL). Las opiniones y puntos de vista expresados en este post son míos, y no reflejar necesariamente las opiniones o puntos de vista de mi empleador.

 2
Author: cpurdy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-12 14:32:55

Memcached puede ser sustituido por Couchbase - esta es una continuación de código abierto y 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 memcached, ¡por lo que no necesita cambiar el código de su aplicación cliente! Su producto muy eficaz y viene con 24/7 clustering y Cross Datacenter Replication (XDCR) incorporado. Ver technical paper.

 2
Author: user1697575,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-21 21:44:43

Podrías usar Tarantool ( http://tarantool.org ). Es una base de datos en memoria con persistencia, replicación maestro-maestro y reglas de caducidad de claves de scriptable - https://github.com/tarantool/expirationd

 2
Author: user3666759,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-27 23:36:06

¿Has mirado BerkeleyDB?

  • Gestión de datos rápida, integrada y en proceso.
  • Almacén de claves/valores, no relacional.
  • Almacenamiento persistente.
  • Libre, de código abierto.

Sin embargo, no cumple con uno de sus criterios:

  • BDB soporta replicación distribuida, pero los datos no están particionados. Cada nodo almacena el conjunto de datos completo.
 1
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-22 20:07:26

Estamos usando OSCache. Creo que satisface casi todas sus necesidades, excepto guardar caché periódicamente en el disco, pero debería poder crear 2 administradores de caché (uno basado en memoria y uno basado en disco duro) y ejecutar periódicamente java cronjob que pasa por todos los pares de clave/valor de caché en memoria y los coloca en la caché del disco duro. Lo bueno de OSCache es que es muy fácil de usar.

 1
Author: serg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-22 20:25:37

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

Guy Nirpaz, GigaSpaces

 1
Author: gnirpaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-14 12:03:02

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

 1
Author: rudi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-12 07:18:07