MongoDB gegen Cassandra [geschlossen]

738

Ich prüfe, was die beste Migrationsoption sein könnte.

Derzeit bin ich auf einer Sharded MySQL (horizontale Partition), wobei die meisten meiner Daten in JSON-Blobs gespeichert sind. Ich habe keine komplexen SQL-Abfragen (die bereits nach der Partitionierung meiner Datenbank weg migriert wurden).

Im Moment scheinen sowohl MongoDB als auch Cassandra Optionen zu sein. Meine Situation:

  • Viele Lesevorgänge in jeder Abfrage, weniger regelmäßige Schreibvorgänge
  • Keine Sorge um "massive" Skalierbarkeit
  • Mehr Sorge um einfache Einrichtung, Wartung und Code
  • Minimieren Sie die Hardware- / Serverkosten
ming yeow
quelle
4
Eine offizielle Leistungsbenchmark-Statistik ist verfügbar. Cassandra vs MongoDB vs HBase
Ravi
1
> Viele Lesevorgänge in jeder Abfrage, weniger regelmäßige Schreibvorgänge => Suchen Sie nach CQRS (trennen Sie Ihre Lesevorgänge wahrscheinlich ohne Ereignisbeschaffung von Ihren Schreibvorgängen, prüfen Sie jedoch, ob Sie Ihr Lesemodell asynchron aktualisieren können. Die Synchronisierung funktioniert möglicherweise auch. Dies hängt von Ihrer Verwendung ab -Fälle)
Bodrin
2
Das ist eigentlich eine gute Frage. Ich frage mich, ob es eine aktualisierte Version davon gibt. Dieser ist jetzt sehr alt
Slashdottir

Antworten:

584

Viele Lesevorgänge in jeder Abfrage, weniger regelmäßige Schreibvorgänge

Beide Datenbanken funktionieren gut bei Lesevorgängen, bei denen der Hot-Datensatz in den Speicher passt. Beide betonen auch Datenmodelle ohne Verknüpfung (und fördern stattdessen die Denormalisierung), und beide stellen Indizes für Dokumente oder Zeilen bereit , obwohl die Indizes von MongoDB derzeit flexibler sind.

Die Speicher-Engine von Cassandra bietet Schreibvorgänge mit konstanter Zeit, unabhängig davon, wie groß Ihr Datensatz wird. Schreibvorgänge sind in MongoDB problematischer, teilweise aufgrund der B-Tree-basierten Speicher-Engine, aber mehr aufgrund der Multi-Granularity-Sperre .

Für die Analyse bietet MongoDB eine benutzerdefinierte Map / Reduce-Implementierung. Cassandra bietet native Hadoop-Unterstützung, einschließlich für Hive (ein SQL-Data-Warehouse, das auf Hadoop Map / Reduce basiert ) und Pig (eine Hadoop-spezifische Analysesprache, die nach Meinung vieler besser für Map / Reduce-Workloads geeignet ist als SQL). Cassandra unterstützt auch die Verwendung von Spark .

Keine Sorge um "massive" Skalierbarkeit

Wenn Sie sich einen einzelnen Server ansehen, ist MongoDB wahrscheinlich besser geeignet. Für diejenigen, die sich mehr mit Skalierung beschäftigen, ist die No-Single-Point-of-Failure-Architektur von Cassandra einfacher einzurichten und zuverlässiger. (Die globale Schreibsperre von MongoDB wird auch schmerzhafter.) Cassandra bietet außerdem eine wesentlich bessere Kontrolle über die Funktionsweise Ihrer Replikation, einschließlich der Unterstützung mehrerer Rechenzentren.

Mehr Sorge um einfache Einrichtung, Wartung und Code

Beide sind trivial einzurichten, mit angemessenen Standardeinstellungen für einen einzelnen Server. Cassandra ist in einer Konfiguration mit mehreren Servern einfacher einzurichten, da keine Knoten mit speziellen Rollen erforderlich sind.

Wenn Sie derzeit JSON-Blobs verwenden, passt MongoDB wahnsinnig gut zu Ihrem Anwendungsfall, da BSON zum Speichern der Daten verwendet wird. Sie können umfangreichere und abfragbarere Daten haben als in Ihrer aktuellen Datenbank. Dies wäre der bedeutendste Sieg für Mongo.

Michael
quelle
86
Ganz anders, ein Kommentar ist nicht groß genug, aber ... Cassandra ist ein linear skalierbarer (amortisierter Lese- und Schreibvorgang mit konstanter Zeit) Dynamo / Google Bigtable-Hybrid, der unabhängig von der Datengröße schnelle Schreibvorgänge bietet. Der Funktionsumfang ist minimalistisch und geht kaum über den eines geordneten Schlüsselwertspeichers hinaus. MongoDB ist ein stark ausgestatteter (und schneller) Dokumentenspeicher auf Kosten der Haltbarkeit und garantiert, dass Schreibvorgänge bestehen bleiben (da sie nicht sofort auf die Festplatte geschrieben werden). Sie sind verschiedene Bestien mit unterschiedlichen Philosophien, MongoDB ist näher an einem RDMS-Ersatz ...
Michael
28
Cassandra ist zwar niedriger, erlaubt aber eine übermäßige Skalierung (siehe Twitter / Digg / Facebook), aber Sie müssen überlegen, wie Sie Ihre Daten auslegen, Sekundärindizes erstellen usw., da keine flexible Abfrage zulässig ist.
Michael
11
Da alle hier Twitter in Bezug auf Cassandra erwähnt haben: Sie verwenden Cassandra nicht für persistente Tweets, verwenden sie hier immer noch MySQL ( engineering.twitter.com/2010/07/cassandra-at-twitter-today.html ). Ok, aber ich kann mir vorstellen, dass sie in Cassandra immer noch viele Daten für andere Zwecke speichern.
H6.
7
Es sieht so aus, als ob die globale Schreibsperre in Mongo 2.2 entfernt wurde ...
Matt Farmer
16
Noch bevor mein Projekt live ging, spüre ich die Schmerzpunkte von Mongodb. Hot Backup ist eine Grundvoraussetzung. Um eine Hot-Sicherung auf einem Linux-Server durchzuführen, müssen Sie zuerst eine LVM-Partition einrichten (nicht so häufig) und vor jeder Sicherungssitzung einen Snapshot erstellen. Ein weiterer einfacher Weg ist die Verwendung des kostenpflichtigen Mongodb-Backup-Dienstes. Dieser Service ist jedoch teuer (2,3 $ / GB / Monat). Bald benötigen Sie ein Replikat für die Fehlertoleranz. In der Open Source-Version können die Knoten Daten nur als Klartext austauschen. Für SSL müssen Sie sich für die Entprise Edition entscheiden. Und das sind 10.000 $. Auf Wiedersehen Mongodb. Überarbeitung meines Codes an Cassandra.
Karthik Sankar
146

Ich habe MongoDB (in den letzten 6 Monaten) ausgiebig genutzt und ein hierarchisches Datenverwaltungssystem aufgebaut. Ich kann sowohl für die einfache Einrichtung (installieren, ausführen, verwenden!) Als auch für die Geschwindigkeit bürgen. Solange Sie sorgfältig über Indizes nachdenken, kann es in Bezug auf die Geschwindigkeit absolut mitschreien.

Ich stelle fest, dass Cassandra aufgrund seiner Verwendung bei Großprojekten wie Twitter eine bessere Skalierungsfunktionalität hat, obwohl das MongoDB-Team dort an Parität arbeitet. Ich sollte darauf hinweisen, dass ich Cassandra nicht über die Testphase hinaus verwendet habe, daher kann ich nicht für Details sprechen.

Der eigentliche Swinger für mich, als wir NoSQL-Datenbanken bewerteten, war die Abfrage - Cassandra ist im Grunde genommen nur ein riesiger Schlüssel- / Wertspeicher, und die Abfrage ist etwas umständlich (zumindest im Vergleich zu MongoDB), also müssten Sie für die Leistung Duplizieren Sie eine ganze Reihe von Daten als eine Art manuellen Index. MongoDB verwendet dagegen ein "Query by Example" -Modell.

Angenommen, Sie haben eine Sammlung (MongoDB-Sprache für das Äquivalent zu einer RDMS-Tabelle), die Benutzer enthält. MongoDB speichert Datensätze als Dokumente, bei denen es sich im Grunde um binäre JSON-Objekte handelt. z.B:

{
   FirstName: "John",
   LastName: "Smith",
   Email: "[email protected]",
   Groups: ["Admin", "User", "SuperUser"]
}

Wenn Sie alle Benutzer mit dem Namen Smith finden möchten, die über Administratorrechte verfügen, erstellen Sie einfach ein neues Dokument (an der Administrationskonsole mit Javascript oder in der Produktion mit der Sprache Ihrer Wahl):

{
   LastName: "Smith",
   Groups: "Admin"
}

... und führen Sie dann die Abfrage aus. Das ist es. Es gibt Operatoren für Vergleiche, RegEx-Filterung usw., aber alles ist ziemlich einfach und die Wiki-basierte Dokumentation ist ziemlich gut.

Richard K.
quelle
54
Update (8. August 2011): Das irische EC2-Rechenzentrum von Amazon hatte gestern Abend einen blitzbedingten Vorfall. Bei der Sortierung unserer Serverwiederherstellung habe ich einen ziemlich entscheidenden Punkt entdeckt: Wenn Sie einen Replikationssatz von zwei Servern haben (und diese) Stellen Sie sicher, dass Sie einen Arbiter-Knoten haben. Wenn einer ausfällt, gerät der andere nicht in Panik und bleibt im sekundären Modus stehen! Vertrauen Sie mir, es ist ein Problem, mit einer großen Datenbank zu klären.
Richard K.
8
Um hinzuzufügen, was @Richard K gesagt hat, sollten Sie einen Arbiter-Knoten haben, wenn Sie eine gerade Anzahl von Knoten (primär + sekundär) in einem Replikatsatz haben.
Amareswar
Hinzu kommt, dass Mongodb berücksichtigt wird, wenn mehr Aggregation für Datenanalysen durchgeführt werden muss.
user1503117
As long as you think about indexes carefully, it can absolutely scream along, speed-wise.Warten Sie, bis Ihr physischer Speicher voll ist und das Betriebssystem einen Seitenfehler beginnt.
Lol
117

Warum zwischen einer herkömmlichen Datenbank und einem NoSQL-Datenspeicher wählen? Verwende beide! Das Problem bei NoSQL-Lösungen (über die anfängliche Lernkurve hinaus) ist das Fehlen von Transaktionen. Sie führen alle Aktualisierungen von MySQL durch und lassen MySQL einen NoSQL-Datenspeicher zum Lesen füllen. Dann profitieren Sie von den Stärken jeder Technologie. Dies erhöht zwar die Komplexität, aber Sie haben bereits die MySQL-Seite - fügen Sie einfach MongoDB, Cassandra usw. hinzu.

NoSQL-Datenspeicher skalieren im Allgemeinen viel besser als eine herkömmliche Datenbank für dieselben ansonsten Spezifikationen - es gibt einen Grund, warum Facebook, Twitter, Google und die meisten Start-ups NoSQL-Lösungen verwenden. Es sind nicht nur Geeks, die auf neue Technologien setzen.

Jason Grant Taylor
quelle
8
Ich bin vollkommen einverstanden. Ich verwende Mongodb + MySQL in einem der kommenden Produkte, die ich entwerfe. Es ist eine bevorstehende Finanzproduktwolke. MySQL wird dort verwendet, wo wir unbedingt Transaktionsfunktionen benötigen. mongodb wird verwendet, um nicht rechnergestützte komplexe Datenstrukturen zu speichern, die nur bei Bedarf abgerufen werden müssen. bisher gut funktioniert. :)
Ram auf Rails-n-React
Ich habe in den meisten meiner Projekte auch einen solchen doppelten Ansatz verwendet, und in einigen anderen wurde das NFS-gemountete Dateisystem zusammen mit PostgreSQL für seismische Blobs verwendet, die in einigen Fällen nahe 1 GB liegen. Ein Pfad ist eine Art Abfrage zur Schlüsselwertdatenbank.
Audrius Meskauskas
1
Hier ist ein Link zu einer Frage, die ich gestellt habe, wie man sowohl SQL- als auch NOSQL-Datenbanken erstellt: dba.stackexchange.com/questions/102053/… Ich könnte einige Erkenntnisse gebrauchen, die Sie möglicherweise haben
j wird
Er ist bereits endgültig aus Transaktionen entkommen => Jetzt könnte eine unendliche Skalierbarkeit möglich sein. Andernfalls -> nicht :)
Bodrin
1
Dies ist keine gute Lösung, wenn Ihre Daten verteilt werden
Esteban Verbel
60

Ich werde wahrscheinlich ein seltsamer Mann sein, aber ich denke, Sie müssen bei MySQL bleiben. Sie haben kein wirkliches Problem beschrieben, das Sie lösen müssen, und MySQL / InnoDB ist selbst für Blob / JSON-Daten ein hervorragendes Speicher-Back-End.

Webingenieure haben häufig den Trick, mehr NoSQL zu verwenden, sobald sie feststellen, dass nicht alle Funktionen eines RDBMS verwendet werden. Dies allein ist kein guter Grund, da NoSQL-Datenbanken meistens eher schlechte Daten-Engines haben (was MySQL als Speicher-Engine bezeichnet).

Wenn Sie nicht von dieser Art sind, geben Sie bitte an, was in MySQL fehlt und was Sie in einer anderen Datenbank suchen (z. B. Auto-Sharding, automatisches Failover, Multi-Master-Replikation, eine schwächere Datenkonsistenzgarantie in Cluster zahlt sich bei höherem Schreibdurchsatz aus usw.).

Kostja
quelle
13
Er verwendet Sharding, was bedeutet, dass seine Daten manuell auf mehrere Server verteilt werden. Mongodb kann das Sharding automatisieren, was von Vorteil sein kann.
Fabspro
18
Er speichert auch hauptsächlich JSON-Blobs in RDBMS, wodurch relationales Design (Features) unbrauchbar wird.
Damir Sudarevic
4
Das Datenmodell und das automatische Sharding sind zwar unterschiedlich, aber bei der Auswahl einer Datenbank müssen Sie zuerst die Speicher-Engine und dann den Rest der Schnickschnack betrachten. Wie wird sich die Speicher-Engine unter einem Lastanstieg verhalten? Wie wird die Autosharding-Funktion unter einer Datenzuflussspitze ausgeführt? Bevor Sie die Kontrolle über diese wichtigen Aspekte an die Datenbank abgeben, sollten Sie sicherstellen, dass diese für die Aufgabe geeignet ist.
Kostja
7
Das relationale Modell ist eines der am besten durchdachten, effizient zu implementierenden und sparsamsten Datenmodelle. "Relationale Entwurfsmerkmale unbrauchbar machen" kann sich auf Einschränkungen, Auslöser oder referenzielle Integrität beziehen - aber alle sind Pay-per-Use.
Kostja
20

Ich habe Cassandra nicht benutzt, aber ich habe MongoDB benutzt und finde es großartig.

Wenn Sie nach einer einfachen Einrichtung suchen, ist dies das Folgende: Sie entpacken MongoDB einfach und führen den Mongod-Daemon aus, und das war's ... es läuft.

Natürlich ist das nur ein Anfang, aber es ist einfach, Ihnen den Einstieg zu erleichtern.

Dalton
quelle
22
AFAIK, das gilt auch für Cassandra. Untar, führen Sie den Daemon aus. Der Testcluster ist eingerichtet und produktionsbereit!
Asgs
13

Ich habe gestern eine Präsentation über Mongodb gesehen. Ich kann definitiv sagen, dass das Setup "einfach" war, so einfach wie es auszupacken und zu starten. Erledigt.

Ich glaube, dass sowohl Mongodb als auch Cassandra auf praktisch jeder normalen Linux-Hardware laufen werden, so dass Sie in diesem Bereich nicht zu viele Barrieren finden sollten.

Ich denke, in diesem Fall wird es am Ende des Tages darauf ankommen, mit wem Sie sich persönlich wohler fühlen und welches Toolset Sie bevorzugen. In Bezug auf die Präsentation zu Mongodb gab der Moderator an, dass das Toolset für Mongodb ziemlich leicht war und dass es nicht viele (sie sagten wirklich) Tools gab, die denen für MySQL ähnelten. Dies war natürlich ihre Erfahrung so YMMV. Eine Sache, die ich an Mongodb mochte, war, dass es anscheinend viel Sprachunterstützung dafür gab (Python und .NET sind die beiden, die ich hauptsächlich benutze).

Die Liste der Websites, die Mongodb verwenden, ist ziemlich beeindruckend , und ich weiß, dass Twitter gerade auf Cassandra umgestellt hat.

GrayWizardx
quelle
4
Am Ende des Tages ist es ein Vergleich zwischen Äpfeln und Orangen. Beide Datenbanken haben ihre eigenen Stärken. Hier sind einige Dinge zu beachten - Objektmodell, Sekundärindizes, Schreibskalierbarkeit, hohe Verfügbarkeit usw. In einem Blogbeitrag werden die strategischen Unterschiede zwischen Mongodb und Cassandra auf hoher Ebene hier erläutert
Dharshan