2012-10-03 12 views
18

Ich versuche Cassandra zu verstehen und meine Spaltenfamilien (CF) zu strukturieren, aber es ist ziemlich hart, seit ich zu relationalen Datenbanken gewöhnt bin.Cassandra Spaltenschlüssel automatisches Inkrement

Zum Beispiel, wenn ich einfach users CF erstellen und ich versuche, neue Zeile einzufügen, wie kann ich einen inkrementellen Schlüssel wie in MySQL machen?

Ich sah viele Beispiele, wo Sie nur den Benutzernamen anstelle der eindeutigen ID setzen würde und das würde ein wenig Sinn machen, aber was ist, wenn ich möchte, dass Benutzer doppelte Benutzernamen haben?

Auch wie kann ich suchen, wenn von was ich verstehe, cassandra nicht > Operatoren unterstützt, so etwas wie select * from users where something > something2 würde nicht funktionieren.

Und wahrscheinlich die wichtigste Frage, was ist mit der Gruppierung? Muss ich alle Daten abrufen und dann mit der von mir verwendeten Sprache filtern? Ich denke, das würde mein System sehr verlangsamen.

Also im Grunde brauche ich eine kurze Erklärung, wie man mit Cassanda beginnt.

Antwort

16

Ihre Fragen sind ziemlich allgemein, aber lassen Sie mich einen Stich machen. Zunächst müssen Sie Ihre Daten in Bezug auf Ihre Abfragen modellieren. Mit einem RDBMS modellieren Sie Ihre Daten in einer normalisierten Form und optimieren sie später für Ihre spezifischen Abfragen. Du kannst das nicht mit Cassandra machen; Sie müssen Ihre Daten so schreiben, wie Sie beabsichtigen, sie zu lesen. Oft bedeutet das, es mehr als einmal zu schreiben. Im Allgemeinen hilft es, Ihr RDBMS-Denken komplett zu verwerfen, wenn Sie effektiv mit Cassandra arbeiten möchten.

Bezüglich Schlüssel:

  • Sie in Cassandra als Einheit der Verteilung über den Ring verwendet werden. Ihr Schlüssel wird also gehashed und ihm wird ein "Besitzer" zugewiesen. Verwenden Sie den RandomPartitioner, um eine gleichmäßige Verteilung zu gewährleisten

  • Wenn Sie RandomPartitioner verwenden (sollten Sie), werden die Schlüssel nicht sortiert. Dies bedeutet, dass Sie nicht nach einer Reihe von Schlüsseln fragen können. Sie können jedoch nach einer Liste von Schlüsseln in einer einzelnen Abfrage fragen.

  • Schlüssel sind in einigen Modellen und nicht in anderen relevant. Wenn für Ihr Modell eine Abfrage nach Schlüssel erforderlich ist, können Sie einen beliebigen eindeutigen Wert verwenden, der Ihrer Anwendung bekannt ist (z. B. eine UUID). Manchmal sind Schlüssel Sentinel-Werte, wie eine Unix-Epoche, die den Beginn des Tages darstellt. Auf diese Weise können Sie Cassandra eine Reihe bekannter Schlüssel übergeben und anschließend eine Reihe von Daten sortieren, die nach Spalten sortiert sind (siehe unten).

In Bezug auf Abfrage Prädikate:

  • Sie können Bereiche von Daten erhalten Sie es vorausgesetzt Modell korrekt Ihre Fragen zu beantworten.

  • Da Spalten in sortierter Reihenfolge geschrieben werden, können Sie einen Bereich von Spalte A bis Spalte n mit einer Segmentabfrage abfragen (was sehr schnell ist). Sie können auch zusammengesetzte Spalten verwenden, um diesen Mechanismus ein wenig zu abstrahieren.

  • Sie können Sekundärindizes für Spalten verwenden, in denen die Kardinalität niedrig ist. Dadurch erhalten Sie eine Abfragefunktionalität.

  • Sie können Ihre eigenen Indizes erstellen, in denen die Daten so sortiert sind, wie Sie sie benötigen.

In Bezug auf Gruppierung:

Ich nehme an Sie beziehen sich Aggregate zu schaffen. Wenn Sie Ihre Daten in Echtzeit benötigen, sollten Sie einen externen Mechanismus (wie Storm) verwenden, um Daten zu verfolgen und Ihre relevanten Aggregate ständig in einem CF zu aktualisieren. Wenn Sie Aggregate als Teil eines Batch-Prozesses erstellen, verfügt Cassandra über eine hervorragende Integration mit Hadoop, sodass Sie Jobs in Pig, Hive oder direkt in Ihrer bevorzugten Sprache schreiben/reduzieren können.

1

Sie können PlayOrm ausprobieren. Während ich zustimme, müssen Sie aus dem RDBMS ausbrechen und denken, dass manchmal Ihr Primärschlüssel als Benutzer-ID nur die falsche Wahl ist. Manchmal ist es die richtige Wahl (hängt von Ihren Anforderungen ab).

PlayOrm ist eine Mischung aus noSQL und relationalen Konzepten, da Sie beides benötigen und Scalable-SQL mit Joins und allem. Sie müssen nur die Tabellen, von denen Sie glauben, dass sie wachsen, in Milliarden/Billionen von Zeilen partitionieren, und Sie können diese Partitionen abfragen. Auch mit CQL müssen Sie Ihre Tabellen partitionieren. Worüber kannst du partitionieren? Die Zeit ist gut für einige Anwendungsfälle. Andere können von Clients partitioniert werden, da jeder Client tatsächlich eine Mini-Datenbank in Ihrem noSQL-Cluster ist.

PlayOrm generiert einzigartige "Cluster" -Schlüssel, die hostname-uniqueidinThatHost sind, im Prinzip wie eine TimeUUID, nur ein bisschen kürzer und besser lesbar, da wir Hostnamen in unserem Cluster von a1, a2, a3, etc verwenden . usw. um Ihre erste Frage

7

:

kann ich wie

Nein, nicht wirklich in mysql inkrementalen Schlüssel machen - nativer nicht zu Cassandra. How to create auto increment IDs in Cassandra - Sie können hier nach weiteren Informationen suchen: http://srinathsview.blogspot.ch/2012/04/generating-distributed-sequence-number.html

Ihre zweite Frage ist mehr darüber, wie Sie Ihre Cassandra-Daten speichern und modellieren.

Überprüfen Sie die Suchoption von stackoverflow. Viele interessante Fragen!

  1. Switching from MySQL to Cassandra - Pros/Cons?
  2. Cassandra Data Model
  3. Cassandra/NoSQL newbie: the right way to model?
  4. Apache Cassandra schema design
  5. Knowledge sources for Apache Cassandra

Am wichtigsten ist, When NOT to use Cassandra?

+0

Cassandra sup ports counters (https://cassandra.apache.org/doc/cql3/CQL.html#counters), es gibt jedoch einige Einschränkungen. –