Was soll ich wählen: MongoDB / Cassandra / Redis / CouchDB? [geschlossen]


74

Wir entwickeln ein wirklich großes Projekt und ich habe mich gefragt, ob mir jemand einen Rat geben kann, welches DB-Backend wir auswählen sollen.

Unser System besteht aus 1100 elektronischen Geräten, die ein Signal an einen zentralen Server senden, und dann speichert der Server die Signalinformationen (das Signal ist ungefähr 35 Byte lang). Diese Geräte senden jedoch jeweils etwa 3 Signale pro Minute. Wenn wir also Zahlen eingeben, sind dies 4,752.000 neue Datensätze pro Tag in der Datenbank und insgesamt 142,560.000 neue Datensätze pro Monat.

Wir brauchen ein DB-Backend, das schnell und zuverlässig leuchtet. Natürlich müssen wir ein komplexes Data Mining für diese Datenbank durchführen. Wir recherchieren derzeit über MongoDB / Cassandra / Redis / CouchDB, die Dokumentationswebsites befinden sich jedoch noch in einem frühen Stadium.

Irgendeine Hilfe? Ideen?

Danke vielmals!


2
Was sind Ihre Auswahlkriterien? Wie schnell ist die Datenbank? Suchen Sie eine bestimmte Funktion? Diese Frage ist sehr vage.
Nick Larsen


1
Was hast du letztendlich entschieden und wie läuft es ab?
user359996

12
Hallo zusammen, wir haben uns für Cassandra entschieden und es war wirklich toll. Wir haben noch keine Benchmarking-Plattform, aber die ersten Tests zeigen, dass Cassandra MySql übertrifft (ca. 3000% schneller für Schreibvorgänge). Wir verwenden Thrift, um mit Cassandra zu sprechen, und es ist eine wirklich aktive Community dahinter (hauptsächlich Twitter). Es gibt also nicht viele Artikel, aber die Artikel sind sehr nützlich. Ich werde dich wissen lassen, wie das endet.
Juanda

7
142.560.000 pro Monat ist eigentlich kein sehr großer Datensatz. Sie können zu diesem Zweck sogar RDMS verwenden.
DarthVader

Antworten:


101

Lassen Sie sich von der räumlichen Skala (über 1000 Geräte) nicht in Bezug auf die Rechen- und / oder Speicherskala irreführen. Ein paar Dutzend 35-Byte-Einfügungen pro Sekunde sind eine triviale Arbeitslast für jedes Mainstream-DBMS, selbst wenn es auf Low-End-Hardware ausgeführt wird. Ebenso liegen 142 Millionen Datensätze pro Monat nur in der Größenordnung von 1 bis 10 Gigabyte Speicherplatz pro Monat ohne Komprimierung, einschließlich Indizes.

In Ihrem Fragekommentar sagten Sie:

"Es geht um Zuverlässigkeit, Skalierbarkeit und Geschwindigkeit. Es ist sehr wichtig, dass die Lösung einfach skaliert werden kann (MongoDB-Autosharding?), Nur mehr Knoten einwerfen, und die Geschwindigkeit ist auch sehr wichtig

Verlässlichkeit? Jedes Mainstream-DBMS kann dies garantieren (vorausgesetzt, Sie meinen, es wird Ihre Daten nicht beschädigen und es wird nicht abstürzen - siehe meine Diskussion des CAP-Theorems am Ende dieser Antwort). Geschwindigkeit? Selbst mit einer einzelnen Maschine sollte das 10- bis 100-fache dieser Arbeitslast kein Problem sein. Skalierbarkeit? Bei der aktuellen Rate passen unkomprimierte oder sogar vollständig indizierte Daten für ein ganzes Jahr problemlos in 100 Gigabyte Festplattenspeicher (ebenfalls haben wir bereits festgestellt, dass die Einfügungsrate kein Problem darstellt).

Daher sehe ich keinen klaren Bedarf für eine exotische Lösung wie NoSQL oder sogar eine verteilte Datenbank - eine einfache, alte relationale Datenbank wie MySQL wäre in Ordnung. Wenn Sie sich Sorgen über ein Failover machen, richten Sie einfach einen Sicherungsserver in einer Master-Slave-Konfiguration ein. Wenn es sich um das 100- oder 1000-fache der aktuellen Skala handelt, partitionieren Sie einige Instanzen nur horizontal basierend auf der ID des Datenerfassungsgeräts ( dh {Partitionsindex} = {Geräte-ID} modulo {Anzahl der Partitionen}).

Denken Sie daran, dass das Verlassen der sicheren und bequemen Grenzen der relationalen Datenbankwelt bedeutet, sowohl das Repräsentationsmodell als auch das umfangreiche Toolset aufzugeben . Dies wird Ihre "komplexe Datenerfassung" erheblich erschweren - Sie müssen nicht nur Daten in die Datenbank einfügen, sondern sie auch herausholen.

Trotzdem sind MongoDB und CouchDB ungewöhnlich einfach bereitzustellen und zu bearbeiten. Sie machen auch sehr viel Spaß und machen Sie für eine beliebige Anzahl von Menschen attraktiver (nicht nur für Programmierer, sondern auch für Führungskräfte!).

Es ist allgemein bekannt, dass Cassandra von den drei von Ihnen vorgeschlagenen NoSQL-Lösungen die beste für ein hohes Insert-Volumen ist (relativ gesehen glaube ich natürlich nicht, dass Sie ein hohes Insert-Volumen haben - dies wurde für die Verwendung durch Facebook entwickelt ). ;; Dem wird dadurch entgegengewirkt, dass es schwieriger ist, damit zu arbeiten. Wenn Sie also keine seltsamen Anforderungen haben, die Sie nicht erwähnt haben, würde ich dies für Ihren Anwendungsfall empfehlen.

Wenn Sie sich positiv auf eine NoSQL-Bereitstellung eingestellt haben, sollten Sie den CAP-Satz berücksichtigen. Dies hilft Ihnen bei der Entscheidung zwischen MongoDB und CouchDB. Hier ist ein guter Link: http://blog.nahurst.com/visual-guide-to-nosql-systems . Alles hängt davon ab, was Sie unter "Zuverlässigkeit" verstehen: MongoDB tauscht Verfügbarkeit gegen Konsistenz, während CouchDB Konsistenz gegen Verfügbarkeit tauscht . (Mit Cassandra können Sie diesen Kompromiss pro Abfrage verfeinern , indem Sie angeben , wie viele Server geschrieben / gelesen werden müssen, damit ein Schreiben / Lesen erfolgreich ist. UPDATE: CouchDB jetzt auch mit BigCouch ! Sehr aufregend ...)

Viel Glück bei Ihrem Projekt.


Obwohl die Frage Riak nicht beinhaltete, was denkst du darüber in diesem Szenario?
Mark

+1 für "MongoDB tauscht Verfügbarkeit gegen Konsistenz, während CouchDB Konsistenz gegen Verfügbarkeit tauscht."
Dom Vinyard

28

Ein Großteil der Antwort hängt davon ab, was Sie damit tun möchten, nachdem es gesammelt wurde. Das Speichern vieler Daten ist einfach: Legen Sie sie einfach in Protokolldateien ab, ohne dass eine Datenbank erforderlich ist. Wenn Sie dagegen komplexe Analysen und Data Mining durchführen möchten, ist eine Datenbank hilfreich.

Die nächste Frage ist, welche Art von Analyse Sie durchführen werden. Wird es für eine Teilmenge der Daten ausgeführt, die eine bestimmte Eigenschaft haben, nur die letzte Stunde / Tag / Woche / Monat, können die Daten aggregiert oder irgendwie vorberechnet werden? Mit anderen Worten: Benötigen Sie Zugriff auf den gesamten Datensatz in der Form, in der er erfasst wird? Können Sie Daten archivieren, wenn sie zu alt werden, um interessant zu sein? Können Sie die Daten aggregieren und die Analyse für die Aggregation durchführen?

Nach meiner Erfahrung aus der Arbeit mit Werbeanalysen (Sammeln von Milliarden von Datenpunkten zu Anzeigenrisiken) ist die Aggregation der Schlüssel. Sie sammeln Rohdaten, bereinigen sie und speichern sie in einer Datenbank wie MongoDB, Cassandra oder sogar MySQL, mit der Sie Aktualisierungen und Abfragen durchführen können. Anschließend aggregieren Sie die Daten regelmäßig und entfernen sie aus der Datenbank (aber archivieren Sie die Rohdaten, möglicherweise benötigen Sie sie später).

Die Aggregation stellt im Wesentlichen alle Fragen, die Sie zu den Daten stellen möchten, und speichert sie in einer Form, die das Abrufen der Antwort auf eine bestimmte Frage erleichtert. Angenommen, Sie möchten wissen, an welchem ​​Wochentag das meiste X vorhanden ist. Die naive Implementierung besteht darin, alle aufgezeichneten Signale in einer großen Tabelle zu speichern und eine Abfrage durchzuführen, die alle Zeilen mit X summiert. Als Anzahl der gesammelten Signale wachsen Diese Abfrage wird immer länger dauern. Dabei hilft keine Indizierung, kein Sharding oder keine Optimierung. Stattdessen sehen Sie sich jeden Tag / jede Stunde / Minute (abhängig vom genauen Anwendungsfall und der Aktualität Ihrer Berichterstellung) die neuen Signale an, die Sie aufgezeichnet haben, und erhöhen für jedes X den Zähler, der festhält, wie viele X gab es am Montag, wenn es ein Montag ist, Dienstag, wenn es ein Dienstag ist und so weiter. Auf diese Weise können Sie später die Anzahl für jeden Wochentag abrufen und vergleichen. Sie tun dies für alle Fragen, die Sie beantworten möchten, und entfernen dann die Signale aus der Datenbank (behalten jedoch die Rohdaten bei).

Der Datenbanktyp, in dem Sie die Aggregate aufzeichnen, kann mit dem identisch sein, in dem Sie die eingehenden Signale speichern, muss jedoch nicht sehr ausgefallen sein. Es werden Schlüssel gespeichert, die eine bestimmte Antwort darstellen, und Werte, die normalerweise nur Zahlen sind.

Im Data Warehousing der alten Schule wird die Datenbank, in der Sie die eingehenden Signale speichern, als OLTP (für die Online-Transaktionsverarbeitung) und die Datenbank, in der Sie die Aggregate speichern, als OLAP (für die Online-Analyseverarbeitung) bezeichnet. OLTP ist für das Einfügen optimiert und OLAP ist für das Abfragen optimiert. Die Begriffe sind alt und wenn die Leute sie hören, neigen sie dazu, sofort an SQL und Starschemas und all das zu denken. Vielleicht sollte ich sie nicht verwenden, aber sie sind bequeme Begriffe.

Auf jeden Fall möchten Sie für OLTP etwas, das sich schnell in Daten einfügen lässt, aber auch etwas, das das Indizieren der Daten und das Suchen nach Dingen unterstützt. Die Aggregation wird durch eine Datenbank erheblich unterstützt, die die Hälfte der Arbeit zum Summieren und Finden von Maxima und Minima erledigt. Ich mag MongoDB wirklich, weil es so einfach einzurichten und damit zu arbeiten ist. Die Daten, mit denen ich arbeite, sind in der Regel unübersichtlich und nicht alle Elemente haben die gleichen Eigenschaften. Daher ist die verzeihende Unschärfe von Mongo ein Segen. Auf der anderen Seite klingen Ihre Daten viel einheitlicher, sodass Mongo Ihnen möglicherweise nicht so viele Vorteile bietet. Übersehen Sie jedoch noch nicht die guten alten relationalen Datenbanken. Wenn Sie viel summieren und so weiter, dann ist SQL großartig, dafür ist es gebaut.

Für OLAP funktioniert etwas viel Einfacheres, ein Schlüsselwertspeicher ist alles, was Sie brauchen. Ich benutze Redis, weil es auch sehr einfach ist, damit zu arbeiten und es einzurichten. Außerdem können Sie mehr als skalare Werte speichern, was praktisch ist. Manchmal ist Ihr Wert tatsächlich eine Liste oder ein Hash. In den meisten Schlüsselwertspeichern müssen Sie solche Werte codieren, aber Redis behandelt sie nativ. Der Nachteil von Redis ist, dass Sie keine Abfragen durchführen können ("wie in" Geben Sie mir alle Zeilen, die diesen Wert für Y haben "). Sie müssen die Indizes für Ihre Daten selbst beibehalten. Auf der anderen Seite benötigen Sie nicht viel Indizes, da die Antworten auf alle Ihre Fragen vorberechnet wurden. Sie müssen lediglich die Antwort mit einem Schlüssel nachschlagen, der durch die Frage definiert wird. Für die obige Frage, welcher Wochentag das meiste X hat, suchen Sie die Anzahl der X-Arbeiten am Montag, Dienstag usw. nach.

Fazit: MongoDB und Redis funktionieren hervorragend für mich. Ich denke nicht, dass MongoDB für Ihren Anwendungsfall sehr gut ist, stattdessen denke ich, dass Sie tatsächlich mehr von einer herkömmlichen SQL-Datenbank profitieren könnten (aber es hängt davon ab, ob Ihre Daten wirklich einfach sind, Sie könnten Redis möglicherweise vollständig verwenden). Das Wichtigste ist, nicht den Fehler zu machen, zu denken, dass Sie die Daten in einer Datenbank haben und für immer aufbewahren müssen. Aggregation und Wegwerfen alter Daten ist der Schlüssel.


13

CouchDB ist sehr zuverlässig, bietet eine hervorragende Haltbarkeit und eine sehr geringe CPU-Auslastung. Es eignet sich auch hervorragend zum Replizieren zwischen mehreren Knoten, entweder bei Bedarf oder kontinuierlich.

Dank seiner Replikationsfähigkeiten und der RESTful-API (für die API wird HTTP verwendet) können Sie mit ausgereiften Tools recht einfach horizontal skalieren. (Nginx oder Apache für Reverse Proxy, HTTP Load Balancer usw.)

Sie schreiben Map / Reduce-Funktionen in JavaScript, um Abfragen vorab zu berechnen. Die Ergebnisse werden schrittweise auf der Festplatte erstellt, was bedeutet, dass sie nur einmal pro Signal berechnet werden müssen. Mit anderen Worten, Abfragen können sehr schnell sein, da nur Berechnungen für die Signaldaten durchgeführt werden müssen, die seit dem letzten Ausführen der Abfrage aufgezeichnet wurden.

CouchDB tauscht Speicherplatz gegen Leistung, sodass Sie davon ausgehen können, dass viel Speicherplatz benötigt wird. Ihre Abfragen können blitzschnell sein und Speicherplatz sparen, wenn Sie sie ordnungsgemäß implementieren.

Probieren Sie CouchDB aus.

Erfahren Sie, warum Large Hadron Collider-Wissenschaftler CouchDB und CouchDB bei der BBC als fehlertoleranten, skalierbaren Schlüsselwertspeicher für mehrere Rechenzentren verwenden


9

~ 3000 Signale / Minute = 50 Schreibvorgänge / s, die jedes dieser Systeme problemlos verarbeiten kann.

Cassandra funktioniert wahrscheinlich am besten, wenn Ihr Datensatz größer als der Speicher wird und die Hadoop-Integration Sie beim Data Mining unterstützt.


Vielen Dank für Ihre Antwort. Ich werde den Hadoop genauer prüfen, da ich in Wahrheit nicht damit vertraut bin. Danke vielmals!
Juanda

4

Sie speichern also Daten in einer zentralen Datenbank für die Datenerfassung? Keine Online-Transaktionsverarbeitung?

Ich denke nicht, dass MongoDB einen guten Job macht, wenn es um Haltbarkeit geht. Siehe http://nosql.mypopescu.com/post/392868405/mongodb-durability-a-tradeoff-to-be-aware-of .

Vielleicht können Sie Analytics db Infobright verwenden, es hat eine Community-Edition: http://www.infobright.org/ ?


Vielen Dank für die Antwort. Ich brauche keine Online-Transaktionsverarbeitung, nur das Speichern für die Datenerfassung. Ich werde infobright auschecken und dich wissen lassen.
Juanda

4

Sie suchen nach einem Datenspeicher, der blitzschnelle Schreibvorgänge ermöglicht (Daten bleiben auf der Festplatte erhalten), und das Data Mining wird zu einem späteren Zeitpunkt durchgeführt (dies ist der READ-Zyklus). In Anbetracht der von Ihnen angegebenen Zahlen stellt sich heraus, dass Sie alle 159 MB Informationen pro Tag oder ca. 5 GB pro Monat sammeln.

Schauen Sie sich in diesem Fall Redis an.

Sie können die tägliche Redis-Datendatei jederzeit archivieren und später darauf zugreifen (wenn Sie Bedenken haben, 5 GB oder mehr RAM-Speicherplatz zu laden, kann diese Archivierung eine Problemumgehung sein).

Redis ist ziemlich schnell, basierend auf den auf dieser Site veröffentlichten Zahlen. Hoffe das hilft. Kiran


2

Ich habe MongoDB von Incanter verwendet und es hat mir gefallen. Obwohl ich mit so großen Datenmengen nicht mit der Geschwindigkeit sprechen kann, ist Clojure (auf dem Incanter basiert) in Bezug auf das Transaktionsmanagement sehr zuverlässig. Incanter bietet auch einige großartige Analysetools. Wenn Sie also vorhaben, all diese Daten zu analysieren, könnte MongoDB + Incanter eine leistungsstarke Kombination sein.


1
Clojure bietet native Unterstützung für Software-Transaktionsspeicher , nicht für Datenbanktransaktionen (geschweige denn für verteilte Datenbanktransaktionen).
user359996

2

Wenn Sie das Aussehen von Cassandra aufgrund seiner von Anfang an entworfenen Fähigkeit zur horizontalen Skalierung, zur Abstimmung der Konsistenz auf die Verfügbarkeit usw. mögen, sollten Sie sich auch Riak ansehen , das über ähnliche Funktionen, aber einen anderen Ansatz verfügt .


Riak war mir nicht bewusst. Ich werde es versuchen und dich wissen lassen. Danke für deine Antwort!
Juanda
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.