2013-04-16 16 views
5

Ich bin auf der Suche nach einer Cassandra-Zeitreihe-Datenbank für die Speicherung von Millionen von Serien von täglichen Daten, die potenziell insgesamt bis zu 100B Datenpunkte haben können.Entwerfen von Zeitreihen-Datenbank in Cassandra

ich in diesem Artikel angesehen: http://rubyscale.com/blog/2011/03/06/basic-time-series-with-cassandra/

Dieser Entwurf sehr gesund ist. Im Wesentlichen kann ich die täglichen Zeitstempel als Spalten setzen und ggf. die Spalten durch Anhängen des Tages an die Zeile zerlegen.

Zwei Fragen, die ich habe:

  • ich die Speicherung von bis zu 20.000 timestamped Suche (täglich) Spalten. Ist es sogar notwendig, Zeilen zu zerteilen, z. Jahr mit dieser Anzahl von Spalten? Gibt es einen Vor-/Nachteil beim Shardern von Zeilen, um die Anzahl der Spalten auf 365 pro Jahr zu reduzieren.
  • Eine andere Idee, die ich habe, ist, anstatt Spalten für Zeile zu sharten, um Spaltenfamilie pro Jahr zu erstellen. Auf diese Weise müsste ich beim Zugriff auf die Daten aus mehreren Jahren mehrere Spaltenfamilien anstatt einer Spaltenfamilie abfragen und die Ergebnisse auf der Clientseite zusammenführen. Würde dieser Ansatz die Dinge beschleunigen oder eher verlangsamen?

Antwort

4

Wenn Sie jemals große Mengen von Schreibvorgängen verwalten werden, gibt es ein Problem mit Ihrem Ansatz.

Schreiben immer auf 1 bedeutet, dass alle Schreibvorgänge für diesen Schlüssel zu einem Knoten gehen. Im Grunde werden Sie einen Knoten pro Tag aus Ihrem Cluster heraus verwenden, so dass Sie lieber eine große Instanz von Cassandra haben, anstatt sich um die Einrichtung eines Clusters zu kümmern. Wenn Ihre Schreibfrequenz sehr hoch wird, könnten Sie die für diesen Tag/Schlüssel verantwortlichen Knoten herunterfahren.

Mein Rat ist, einen Tag in mehreren Reihen, die gleichzeitig verwendet werden, Eimer. Time Bucketing könnte gefährlich sein, da ein plötzlicher Anstieg während eines Eimers alles zusammenbrechen lassen könnte.

Sie könnten Ihre Eimer (Zeilenschlüssel) wie folgt erstellen:

  • [ROW_BASE_NAME] + [DAY] + someHashFunction (Zeitstempel)% 10
  • [ROW_BASE_NAME] + [DAY] + random.nextInt (10)
  • [ROW_BASE_NAME] + [DAY] + nextbucket < --- das ist, wenn Sie eine sichere Art und Weise haben Sie den Eimer zu drehen, sich

es gibt viele Möglichkeiten, es zu tun. Sie können auch ein Element der zu speichernden Spalte dazu verwenden. Aber ich denke, es sollte wichtig sein, dies zu tun, um den gesamten Cassandra-Cluster zu jeder Zeit zu nutzen.

Meine Antwort ist nur gültig für schwere Anwendung schreiben/Funktionalität, da Sie eine multi_get (mehrere Schlüssel ganze Reihe liest) verwenden müssen, um alle Daten zu lesen und die gesamte Zeitlinie für diesen Tag neu zu erstellen.

+0

Sie denken also, dass es keine Punkte gibt, wenn Tabellen/Spaltenfamilien in separate Spaltenfamilien aufgeteilt werden, sondern eher nach Zeilen? Gibt es einen Nachteil, wenn Sie zu viele Zeilen in einer einzelnen Spaltenfamilie haben? – datageek

+2

Spaltenfamilie ist nur eine zusätzliche Schlüsselebene.Wenn meine Daten von der gleichen Art sind und die gleichen Einstellungen in Bezug auf Zwischenspeicherung, Vergleich (Spaltennamen) usw. benötigen, dann lege ich sie in die gleiche Spaltenfamilie. Plus-Säulenfamilien sind nicht so leicht zu verwalten. Wenn Sie nur auf einen neuen Schlüssel schreiben, wird es erstellt. UND Sie können nicht aus separaten CFs in einer Abfrage lesen. –

1

Sie sollten diesen Artikel auch auf Advanced Time Series with Cassandra lesen.

+0

Ich sah es danke, eigentlich mag ich diese Lösung aus dem erweiterten Zeitreihe Artikel. Wenn ich es verstanden habe, erfordert dies, Daten als Json zu setzen? – datageek