Auswahl einer verteilten Shared Memory-Lösung
Ich habe eine Aufgabe zu bauen, einen Prototyp für ein Massiv skalierbares distributed shared memory (DSM) app. Der Prototyp würde nur dazu dienen als proof-of-concept, aber ich will meine Zeit damit verbringen, am effektivsten durch die Wahl der Komponenten, die verwendet werden würde in der realen Lösung später auf.
Ziel dieser Lösung ist die Daten-Eingang von einer externen Quelle, stößt Sie es und stellen Sie das Ergebnis in einer Vielzahl von Oberflächen. Solche "frontends" würden, nehmen Sie einfach die Daten aus dem cache, und servieren Sie es ohne zusätzliche Verarbeitung. Die Höhe der frontend-Zugriffe auf diese Daten können buchstäblich Millionen pro Sekunde.
Den Daten selbst ist sehr volatil, es kann (und tut) sich Recht schnell ändern. Aber die frontends sollten sehen, "alte" Daten, bis die neueste wurde verarbeitet und zwischengespeichert. Die Verarbeitung und das schreiben erfolgt durch einen einzelnen (redundanten) Knoten, während andere Knoten nur die Daten Lesen. In anderen Worten: kein read-through-Verhalten.
War ich auf der Suche nach Lösungen, wie memcached allerdings dieser Besondere, nicht erfüllen alle unsere Anforderungen, die nachstehend aufgeführt sind:
- Die Lösung muss mindestens Java-client-APIdie einigermaßen gut gepflegt wie der rest der app ist in Java geschrieben und wir sind erfahrene Java-Entwickler;
- Die Lösung muss vollständig elastischen: es sollte möglich sein, das hinzufügen neuer Knoten ohne Neustart die anderen Knoten im cluster;
- Die Lösung muss in der Lage sein zu handhaben failover. Ja, ich weiß, das bedeutet etwas Aufwand, aber insgesamt dienten Daten, die Größe ist nicht groß (1G max) also das sollte nicht das problem sein. Von "failover" ich meine, nahtlose Ausführung, ohne hardcoding/ändern von server-IP-Adresse(N) wie in memcached-clients wenn ein Knoten ausfällt;
- Im Idealfall sollte es möglich sein, geben Sie den Grad von Daten, die überlappende (z.B. wie viele Kopien der gleichen Daten, die gespeichert werden soll in der DSM-cluster);
- Es gibt keine Notwendigkeit, um dauerhaft speichern Sie alle Daten, aber könnte es erforderlich sein, von post-processing einige der Daten (z.B. Serialisierung der DB).
- Preis. Offensichtlich bevorzugen wir freie/open source-aber wir zahlen gerne einen angemessenen Betrag, wenn eine Lösung ist es Wert. In irgendeiner Weise bezahlt, 24 Stunden am Tag support-Vertrag ist ein muss.
- Die ganze Sache hat gehostet werden, in unsere Rechenzentrenso dass SaaS-Angebote wie Amazon SimpleDB sind out-of-scope. Würden wir nur dann berücksichtigen Sie dies, wenn keine anderen Optionen zur Verfügung stehen würde.
- Im Idealfall die Lösung wäre streng konsistente (in CAP), jedoch eventuelle Konsistenz kann betrachtet werden als eine option.
Vielen Dank im Voraus für alle Ideen.
InformationsquelleAutor der Frage mindas | 2010-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie einen Blick auf Hazelcast. Es ist reines Java, open source (Apache-Lizenz) hoch skalierbare in-memory-data-grid-Produkt. Es bietet einen 7X24-support. Und die gilt es zu lösen alle Ihre Probleme, die ich versuchte zu erklären, jede von Ihnen unter:
InformationsquelleAutor der Antwort Fuad Malikov
Ich schlage vor, Sie verwenden Redisson - Redis In-memory Data Grid für Java. Implementiert (
BitSet
BloomFilter
Set
SortedSet
Map
ConcurrentMap
List
Queue
Deque
BlockingQueue
BlockingDeque
ReadWriteLock
Semaphore
Lock
AtomicLong
CountDownLatch
Publish /Subscribe
RemoteService
ExecutorService
LiveObjectService
SchedulerService
) auf der Oberseite der Redis server! Es unterstützt die master/slave -, sentinel-und cluster-server-Modi. Automatische cluster/sentinel-Server topology discovery unterstützt auch. Diese lib ist eine freie und open-source.Perfekt funktioniert in der cloud Dank AWS RDS-Unterstützung
InformationsquelleAutor der Antwort Nikita Koksharov
Je nachdem, was Sie bevorzugen, ich würde sicher den anderen Folgen, indem Sie darauf hindeutet, Hazelcast, wenn Sie in Richtung AP aus dem CAP-Theorem, aber wenn Sie brauchen, CP, die ich wählen würde, Redis
InformationsquelleAutor der Antwort Kynao
Können Sie zur Kasse Java-spezifische Lösungen wie Kohärenz: http://www.oracle.com/global/ru/products/middleware/coherence/index.html
Allerdings halte ich solche Lösungen als zu Komplex und bevorzugen Lösungen, wie memcached. Großer Nachteil der memcached-für Ihren Zweck fehlt der Datensatz sperren, so scheint es, und es gibt keine eingebaute Möglichkeit, Daten zu replizieren, die für ein failover. Das ist, warum ich würde in den Schlüssel-Wert-Daten speichert. Viele von Ihnen erfüllen Ihren Bedarf vollständig.
Hier ist eine Liste von Schlüssel-Wert-Daten speichert, kann Ihnen bei Ihrer Aufgabe helfen:
http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores
Wählen Sie einfach eine, die Sie füllen bequem mit.
InformationsquelleAutor der Antwort Alexander Finn
Haben Sie einen Blick auf die Terrakotta-JVM clustering, es ist OpenSource 😉
Er hat keine API, während es arbeitet effizient auf JVM-Ebene, wenn Sie speichern den Wert in einem replizierten Objekts an alle anderen Knoten.
Auch sperren und all jene Dinge, die Arbeit transparent und ohne neuen code.
InformationsquelleAutor der Antwort Tobias P.
Ich arbeite gerade an einem ähnlichen Projekt, sondern das targeting .NET-Plattform. Abgesehen von den bereits erwähnten Lösungen, ich denke, Sie sollten einen Blick auf ScaleOut StateServer und Alachisoft NCache. Ich fürchte, keiner von diesen alternativen sind Billig, aber Sie sind sicherer als open source für kommerzielle Lösungen gemäß meinem Urteil.
ScaleOut StateServer
Alachisoft NCache
Insgesamt StateServer ist die beste option, wenn Sie möchten, überspringen Sie konfigurieren, jedes detail in dem cache-cluster, während NCache verfügt über sehr viele Funktionen und caching-Topologien zur Auswahl.
Je nach Verhalten der Daten an die clients (wenn die Daten gelesen wird, die viele Male von der gleichen client -) es könnte eine gute Idee sein, zu mischen, lokale caching auf den clients mit den verteilten caching cluster (verfügbar für beide NCache und StateServer), nur so ein Gedanke.
InformationsquelleAutor der Antwort Herber
Den angegebenen Anwendungsfall zu passen scheint in Netflix, der Hohl. Dies ist ein read-only-replicated-cache mit einem einzelnen Erzeuger und mehrere Verbraucher.
InformationsquelleAutor der Antwort Anirudh Jayakumar
Haben Sie sich Gedanken über die Verwendung einer standard-messaging-Lösung wie rabbitmq ?
RabbitMQ ist eine open source-Implementierung des AMQP-Protokoll.
Ihre Anwendung scheint mehr oder weniger wie ein Publish/subscribe-system.
Die Publisher-Knoten ist die eine, die nicht in der Verarbeitung und bringt Nachrichten (verarbeitete Daten) in einer Warteschlange auf dem Server.
Abonnenten können Nachrichten vom server auf verschiedene Weise. AMQP entkoppelt Erzeuger und Verbraucher von Nachrichten und ist sehr flexibel in, wie Sie können verbinden die beiden Seiten.
InformationsquelleAutor der Antwort filippo