2010-06-15 50 views
23

Tengo una tarea para construir un prototipo para una aplicación de memoria compartida distribuida (DSM) masivamente escalable. El prototipo solo serviría como una prueba de concepto, pero quiero pasar el tiempo de la manera más efectiva seleccionando los componentes que se usarían en la solución real más adelante.Elegir una solución de memoria compartida distribuida

El objetivo de esta solución es tomar la entrada de datos de una fuente externa, batir y hacer el resultado disponible para un número de interfaces. Esas "interfaces" simplemente tomarían los datos del caché y lo servirían sin procesamiento adicional. La cantidad de visitas frontend a esta información puede ser literalmente de millones por segundo.

Los datos en sí son muy volátiles; puede (y lo hace) cambiar bastante rápido. Sin embargo, las interfaces deberían ver datos "antiguos" hasta que se haya procesado y almacenado el más nuevo. El procesamiento y la escritura se realizan mediante un único nodo (redundante) mientras que otros nodos solo leen los datos. En otras palabras: sin comportamiento de lectura.

que estaba buscando en soluciones como memcached sin embargo éste en particular no cumple con todos los nuestros requisitos que se enumeran a continuación:

  1. La solución debe tener al menos Java API del cliente que es razonablemente bien mantenido ya que el resto de la aplicación está escrita en Java y somos experimentados desarrolladores de Java;
  2. la solución debe ser totalmente elástico: debe ser posible añadir nuevos nodos sin reiniciar otros nodos en el cluster;
  3. La solución debe ser capaz de manejar conmutación por error. Sí, me doy cuenta de que esto significa un poco de sobrecarga, pero el tamaño total de los datos servidos no es grande (1G máximo), así que esto no debería ser un problema. Por "conmutación por error" me refiero a la ejecución sin fisuras sin codificación/cambio de dirección (es) IP del servidor, como en los clientes memcached cuando un nodo deja de funcionar;
  4. Idealmente, debería ser posible especificar el grado de superposición de datos (por ejemplo, cuántas copias de los mismos datos deben almacenarse en el clúster de DSM);
  5. No es necesario almacenar permanentemente todos los datos, pero puede haber una necesidad de procesamiento posterior de algunos de los datos (por ejemplo, serialización a la base de datos).
  6. Precio. Obviamente, preferimos la fuente gratuita/abierta, pero nos complace pagar una cantidad razonable si la solución vale la pena. En cualquier caso, el contrato de soporte 24 horas al día es obligatorio.
  7. Toda cosa tiene que ser alojado en nuestros centros de datos ofertas de modo SaaS como Amazon SimpleDB están fuera de alcance. Solo consideraríamos esto si no hubiera otras opciones disponibles.
  8. Idealmente, la solución sería estrictamente consistente (como en CAP); sin embargo, consistencia eventual se puede considerar como una opción.

Gracias de antemano por cualquier idea.

Respuesta

25

Eche un vistazo a Hazelcast. Se trata de un producto de cuadrícula de datos en memoria de gran tamaño, Java de código abierto (licencia Apache). Ofrece soporte 7X24. Y resuelve todos sus problemas. Intenté explicar cada uno de ellos a continuación:

  1. Tiene un cliente Java nativo.
  2. Es 100% dinámico. Agregue y elimine nodos dinámicamente. No hay necesidad de cambiar nada.
  3. Nuevamente todo es dinámico.
  4. Puede configurar la cantidad de nodos de respaldo.
  5. Persistencia del soporte de Hazelcast.
  6. Todo lo que Hazelcast ofrece es gratuito (código abierto) y ofrece soporte de nivel empresarial.
  7. Hazelcast es un archivo jar individual. super fácil de usar. Solo agregue jar a su classpath. Eche un vistazo al elenco de la pantalla en la página principal.
  8. Hazelcast es estrictamente consistente. Nunca puedes leer datos obsoletos.
+0

Gracias, en realidad estamos usando Hazelcast en uno de nuestros otros proyectos.Hablando honestamente, esperaba que alguien sugiriera usar algo como Project Voldemort y dar una idea de cómo funciona esa escala (para los requisitos que he mencionado), principalmente porque Hazelcast parece ser una biblioteca de amplio uso mientras que proyectos como Voldemort son DSM específicos basados ​​en mapas. Por supuesto, no estoy tratando de decir que Hazelcast no soportará la carga, esto necesita ser medido y probado. – mindas

+0

Acaba de darse cuenta de que eres uno de los autores de Hazelcast. Whoops :) – mindas

+0

Sí, soy uno de los autores :) Hazelcast Distributed Map es un DSM basado en un mapa específico. Para obtener la escalabilidad, consulte nuestra demostración de clúster de 100 nodos en http://java.dzone.com/articles/running-hazelcast-100-node. –

1

Eche un vistazo a la agrupación JVM de Terracotta, es OpenSource;) No tiene API mientras funciona eficientemente a nivel JVM, cuando almacena el valor en un objeto replicado, se envía a todos los demás nodos. Incluso el bloqueo y todas esas cosas funcionan de manera transparente y sin agregar ningún código nuevo.

2

Es posible que desee a la caja de soluciones de Java-específicos como coherencia: http://www.oracle.com/global/ru/products/middleware/coherence/index.html

Sin embargo, considero que dichas soluciones sean demasiado complejos y prefieren utilizar soluciones como memcached. La gran desventaja de memcached para su propósito es la falta de bloqueo de registros, y no existe una forma integrada de replicar datos para failover. Es por eso que buscaría en las tiendas de datos clave-valor. Muchos de ellos satisfarían tu necesidad por completo.

Aquí es una lista de los almacenes de datos de valores clave que pueden ayudarle con su tarea: http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores Sólo tiene que elegir uno que llene cómodo.

0

¿Ha pensado en usar una solución de mensajería estándar como rabbitmq? RabbitMQ es una implementación de código abierto del AMQP protocol.

Su aplicación parece más o menos como un sistema de publicación/suscripción. El nodo Publicador es el que procesa y coloca los mensajes (datos procesados) en una cola en los servidores. Los suscriptores pueden recibir mensajes del servidor de varias maneras. AMQP desacopla al productor y al consumidor de mensajes y es muy flexible en cuanto a cómo puede combinar los dos lados.

+0

Este es un enfoque interesante, pero ¿estas soluciones de mensajería pueden mantener los mensajes durante un tiempo no determinado? Tuve la impresión de que el marco de mensajería solo se preocupa por un mensaje hasta que se entrega, ¿verdad? Mientras que aquí tenemos datos que podrían cambiar o _might_not_ y los suscriptores deberían poder recuperarlo después de, digamos, unas pocas horas. Además, también es necesario lo contrario: ¿estas soluciones de mensajería respaldan el enjuague de datos como lo hacen la mayoría de los DSM? – mindas

+0

Si recuerdo bien en rabbitmq, las colas también pueden ser persistentes, es decir, los mensajes se guardan en el disco y se pueden bloquear de forma segura. Lo primero que se le viene a la mente a la descarga es tener consumidores dedicados que solo hacen eso: esperar el mensaje que dice limpieza, eliminar todas las colas y luego escribir los datos nuevos. Ha pasado un tiempo desde que leí las especificaciones para que haya mejores soluciones. – filippo

+0

Me temo que cualquier cosa relacionada con el disco no es una opción, ya que necesito una latencia mínima aquí. También dudo que rabbitmq me permita hacer O (1) búsquedas arbitrarias como lo hacen los DSM basados ​​en mapas. Pero gracias por tu entrada de todos modos! – mindas

1

Estoy haciendo un proyecto similar, pero en lugar de apuntar a la plataforma .NET. Además de las soluciones ya mencionadas, creo que debería echar un vistazo a ScaleOut StateServer y Alachisoft NCache. Me temo que ninguna de estas alternativas es barata, pero son una apuesta más segura que la fuente abierta para soluciones comerciales según mi criterio.

  1. Ambos proporcionan API cliente de Java, aunque solo he jugado con las API de .NET.
  2. StateServer presenta autodescubrimiento de nuevos nodos de caché, y NCache tiene una consola de administración donde se pueden agregar nuevos nodos de caché.
  3. Ambos deben ser capaces de manejar failovers sin problemas.
  4. StateServer puede tener 1 o 2 copias pasivas de los datos. NCache presenta más topologías de caché para elegir.
  5. Si se refiere a write-through/write-behind a una base de datos que está disponible en ambos.
  6. no tengo ni idea de cuántos servidores de caché que planean usar, pero aquí están las especificaciones de precio completo: ScaleOut StateServer Alachisoft NCache
  7. Ambos están instalados y configurados de forma local en el servidor y ambos tienen GUI de administración.
  8. No estoy seguro exactamente lo que implica estrictamente coherente, así que lo dejo para que investigue ..

En general, StateServer es la mejor opción si desea omitir la configuración de cada pequeño detalle en la memoria caché clúster, mientras que NCache presenta muchas características y topologías de almacenamiento en caché para elegir.

Dependiendo del comportamiento de los datos hacia los clientes (si los datos se leen muchas veces del mismo cliente) podría ser una buena idea mezclar el caché local en los clientes con el caché distribuido en el clúster (disponible para ambos NCache y StateServer), solo un pensamiento.

+0

Gracias Herber, definitivamente voy a ver estas ofertas. El proyecto ha estado en pausa por un tiempo, pero prometo "aceptar la respuesta" sobre mi elección de selección cuando llegue el momento. Actualmente Hazelcast parece ser el camino a seguir, principalmente debido a su natividad a Java. Te mantendré informado. – mindas

+0

Veo los beneficios de usar una solución que ya está siendo utilizada en su organización. Buena suerte con su proyecto, y avíseme si puedo brindarle más ayuda. – Herber

3

Dependiendo de lo que usted prefiere, siempre resulta interesante seguir a los demás por lo que sugiere Hazelcast si estás hacia AP de la PAC Teorema pero si necesita CP, elegiría Redis

5

Sugiero que usted utilice Redisson - Red de datos en memoria basada en Red Grid para Java. Implementos (BitSet, BloomFilter, Set, SortedSet, Map, ConcurrentMap, List, Queue, Deque, BlockingQueue, BlockingDeque, ReadWriteLock, Semaphore, Lock, AtomicLong, CountDownLatch, Publish/Subscribe, RemoteService, ExecutorService, LiveObjectService, SchedulerService) en la parte superior de Redis servidor! Admite los modos maestro/esclavo, centinela y servidor de clúster. Detección automática de topología de servidor cluster/sentinel también soportada. Esta lib es gratuita y de código abierto.

funciona perfectamente en la nube gracias al apoyo de AWS ElastiCache

1

El caso de uso especificada parece encajar en Netflix de Hollow. Esta es una caché replicada de solo lectura con un solo productor y múltiples consumidores.

Cuestiones relacionadas