Frage

Für ein bisschen Hintergrund - dieser Frage befasst sich mit einem Projekt auf einem einzigen kleinen EC2-Instanz läuft, und ist etwa zu migrieren auf ein Medium ein. Die Hauptkomponenten sind Django, MySQL und eine große Anzahl von Werkzeugen individueller Analyse geschrieben in Python und Java, die die schweren tun Heben. Die gleiche Maschine läuft Apache als auch.

Das Datenmodell sieht wie folgt aus - eine große Menge von Daten in Echtzeit in von verschiedenen vernetzten Sensoren gestreamt kommen, und im Idealfall würde Ich mag einen lang Umfrage Ansatz zu etablieren, anstatt die aktuelle Umfrage alle 15 Minuten nähern ( eine Beschränkung von Statistiken und das Schreiben in die Datenbank selbst) zu berechnen. Sobald die Daten in kommt, speichere ich die Rohfassung in MySQL, lassen Sie die Analyse-Tools auf diesen Daten verlieren, und speichern Statistiken in einigen weiteren Tabellen. All dies wird Django gemacht werden.

Relational verfügt Ich müsste -

  • Sortieren nach [SliceRange in Cassandras API scheint diese satisy]
  • Gruppe von
  • ManyToMany Beziehungen zwischen mehreren Tabellen [Cassandra SuperColumns scheinen für eine zu viele gut zu tun]
  • Sphinx auf das gibt mir einen schönen vollen Text-Engine, so eine Notwendigkeit ist das ebenfalls. [Ein Cassandra, das Lucandra Projekt scheint dieses Bedürfnis zu befriedigen]

Mein Hauptproblem ist, dass die Daten lesen sind extrem langsam (und schreibt nicht so heiß entweder). Ich will nicht viel Geld und Hardware auf es jetzt werfen, und ich würde lieber etwas, das leicht mit der Zeit skalieren. Vertically Skalierung MySQL ist nicht trivial in diesem Sinne (oder billig).

So im Wesentlichen, nach viel über NoSQL und mit Dingen wie MongoDB, Cassandra und Voldemort experimentiert gelesen zu haben, meine Fragen sind,

  • Auf einem Medium EC2-Instanz, würde ich keine Vorteile gewinnen in liest / schreibt, indem wie Cassandra etwas verschieben ? Dieser Artikel (pdf) scheint auf jeden Fall, dass vor. Derzeit würde ich ein paar hundert Schreibvorgänge pro Minute sagen würden die Norm sein. Für liest - da die Daten alle 5 Minuten ändern oder so, haben Cache-Annullierungs ziemlich schnell passieren. An einem gewissen Punkt, sollte es in der Lage als auch eine große Anzahl gleichzeitiger Benutzer zu handhaben. Die Leistung App wird derzeit getötet auf MySQL einige tun tritt bei großen Tabellen, auch wenn Indizes erstellt werden - etwas in der Größenordnung von 32k Zeilen dauert mehr als eine Minute zu machen. (Dies kann ein Artefakt von EC2 seine virtualisiert I / O als auch). Größe der Tabellen ist etwa 4-5 Millionen Zeilen, und es gibt etwa 5 solche Tabellen.

  • Jeder spricht über Cassandra mit auf mehreren Knoten, angesichts der CAP-Theorem und Eventual Consistency. Aber für ein Projekt, das gerade zu wachsen beginnt, macht es Sinn, einen einen Knoten cassandra Server zu implementieren? Gibt es irgendwelche Einschränkungen? Zum Beispiel kann es MySQL als Backend für Django ersetzen? [Ist das zu empfehlen?]

  • Wenn ich Verschiebung tun, bin zu raten, ich werde ich Teile der App neu schreiben muß viel mehr „Administratives“ zu tun, da ich würde mehr Lookups tun Zeilen zu holen.

  • würde es keinen Sinn, nur die Verwendung von MySQL als Schlüsselwert speichert , anstatt ein relationalen Motor, und damit gehen? Auf diese Weise konnte ich eine große Anzahl von stabilen APIs zur Verfügung, sowie einen stabilen Motor (und gehe relational nach Bedarf) nutzen. (Brett Taylor Beitrag von Friend auf diese - http://bret.appspot.com/ Eintritt / wie-Friend-Uses-mysql )

Keine Erkenntnisse von Menschen, die eine Verschiebung getan haben würden sehr geschätzt werden!

Danke.

War es hilfreich?

Lösung

Cassandra und die anderen verteilten Datenbanken verfügbar heute bieten nicht die Art von Ad-hoc-Abfrage-Unterstützung, die Sie von SQL verwendet werden. Dies liegt daran, Sie können keine Abfragen verteilen mit performant verbinden, so dass der Schwerpunkt auf Denormalisierung ist statt.

Allerdings Cassandra 0.6 (Beta offiziell heraus morgen, aber man kann aus dem 0,6 Zweig selbst bauen, wenn Sie ungeduldig) Hadoop Karte unterstützt / reduzieren für die Analytik, die tatsächlich wie eine gute Passform für Sie klingt.

Cassandra bietet eine hervorragende Unterstützung für das Hinzufügen neuen Knoten schmerzlos, sogar zu einer ersten Gruppe von einem.

sagte, dass, um ein paar hundert schreibt / Minute Sie gehen für eine lange, lange Zeit fein auf MySQL sein. Cassandra ist viel besser ein Schlüssel / Wert-Speicher sein (noch besser, Schlüssel / columnfamily), aber MySQL ist viel besser in eine relationale Datenbank sein. :)

Es gibt keine django Unterstützung für Cassandra (oder andere NoSQL-Datenbank) vor. Sie sprechen über nach 1.2 etwas für die nächste Version zu tun, sondern basiert auf Gesprächen mit django Devs bei PyCon, niemand ist wirklich sicher, was das wie noch aussehen wird.

Andere Tipps

Wenn Sie einen relationalen Datenbank-Entwickler sind (wie ich), ich würde vorschlagen / point out:

  • Holen Sie sich einige Erfahrung mit Cassandra arbeiten, bevor Sie seine Verwendung auf einem Produktionssystem begehen ... vor allem, wenn das Produktionssystem eine harte Frist für den Abschluss hat. verwenden Sie es als Backend für etwas unwichtig vielleicht zuerst.
  • Es erweist sich schwieriger als ich erwartet hatte einfache Dinge zu tun, dass ich für über Datenmanipulation gewährt nehmen SQL-Engines. Insbesondere Daten Indexieren und Ergebnismengen Sortierung ist nicht trivial.
  • Datenmodellierung hat als bewährte Frage zu stellen. Als relationaler Datenbank-Entwickler Sie mit vielen Gepäck auf den Tisch kommen ... müssen Sie, wie Modelldaten sehr unterschiedlich zu lernen bereit sein.

Diese Dinge gesagt, ich empfehle den Aufbau etwas in Cassandra. Wenn Sie wie ich sind, dann so tun, wird Ihr Verständnis der Datenspeicherung in Frage stellen und Sie zu überdenken eine relationale Datenbank-fits-all-Situationen Aussichten, dass ich nicht einmal ahnten hielt ich.

Einige gute Ressourcen, die ich gefunden habe, sind:

Das Django-Cassandra ist ein früher Beta-Modus. Auch Django nicht für No-SQL-Datenbanken aus. Der Schlüssel in Django ORM basiert auf SQL (Django empfiehlt PostgreSQL zu verwenden). Wenn Sie nur nicht-SQL verwenden müssen (SQL und No-SQL in derselben App mische) Sie müssen riskanten Einsatz nicht-SQL-ORM (es deutlich langsamer als herkömmliche SQL-orm oder direkte Verwendung von No-SQL Speichern). Oder Sie django ORM ganz voll Rewrite müssen. Aber in diesem Fall kann ich nicht davon ausgehen, warum Sie Django benötigen. Vielleicht können Sie etwas anderes, wie Tornado benutzen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top