2013-08-13 18 views
9

Ich möchte 1M + verschiedene Zeitreihen in Amazon DynamoDb-Datenbank speichern. Jede Zeitreihe wird ungefähr 50K Datenpunkte haben. Ein Datenpunkt besteht aus einem Zeitstempel und einem Wert.Speichern von Zeitreihen in AWS DynamoDb

Die Anwendung fügt den Zeitreihen häufig neue Datenpunkte hinzu (die ganze Zeit) und ruft von Zeit zu Zeit (für gewöhnlich die gesamte Zeitreihe) Zeitreihen für Analysen ab.

Wie soll ich die Datenbank strukturieren? Soll ich für jede Zeitreihe eine eigene Tabelle anlegen? Oder sollte ich alle Datenpunkte in eine Tabelle setzen?

+4

Was haben Sie am Ende benutzt? – Hugo

+3

Welches Design hast du am Ende benutzt? – Narayan

Antwort

12

Angenommen, Ihre Daten sind unveränderlich und die Größe gegeben, möchten Sie möglicherweise Amazon Redshift betrachten; Es ist für Petabyte-große Berichtslösungen geschrieben.

In Dynamo kann ich mir ein paar brauchbare Designs vorstellen. Im ersten Fall könnten Sie eine Tabelle mit einem zusammengesetzten Hash-/Bereichsschlüssel (beide Zeichenfolgen) verwenden. Der Hash-Schlüssel wäre der Zeitreihenname, der Bereichsschlüssel wäre der Zeitstempel als eine ISO8601-Zeichenfolge (die die angenehme Eigenschaft hat, dass die alphabetische Reihenfolge auch eine chronologische Reihenfolge ist), und es würde ein zusätzliches Attribut für jedes Element geben; ein Wert'. Dies gibt Ihnen die Möglichkeit, alles aus einer Zeitreihe (Abfrage auf HashKey-Gleichheit) und einer Teilmenge einer Zeitreihe (Abfrage auf HashKey-Gleichheit und rangeKey-BETWEEN-Klausel) auszuwählen. Ihr Hauptproblem ist jedoch das "Hotspot" -Problem: intern partitioniert Dynamo Ihre Daten nach HashKey und verteilt Ihre ProvisionedReadCapacity auf alle Ihre Partitionen. Sie haben also vielleicht 1000 KB Lesezugriffe pro Sekunde, aber wenn Sie 100 Partitionen haben, dann haben Sie nur 10 KB pro Sekunde für jede Partition, und das Lesen aller Daten einer einzelnen Zeitreihe (single HashKey) trifft nur eine Partition. Sie können also denken, dass Ihre 1000 KB Lesevorgänge 1 MB pro Sekunde ergeben, aber wenn Sie 10 MB gespeichert haben, kann es viel länger dauern, sie zu lesen, da Ihre einzelne Partition Sie viel stärker drosseln wird.

Auf der Oberseite hat DynamoDB eine extrem hohe, aber kostspielige Obergrenze für die Skalierung; Wenn Sie möchten, können Sie 100.000 Read Capacity-Einheiten bezahlen und haben Antwortzeiten für alle Daten in Sekundenbruchteilen.

Ein anderes theoretisches Design wäre, jede Zeitreihe in einer separaten Tabelle zu speichern, aber ich denke nicht, dass DynamoDB auf Millionen von Tabellen skaliert werden soll, also ist dies wahrscheinlich ein No-Go.

Sie könnten versuchen, Ihre Zeitreihe über 10 Tabellen zu verteilen, wo "hoch gelesene" Daten in Tabelle 1, "fast nie gelesene Daten" in Tabelle 10 und alle anderen Daten dazwischen liegen. Auf diese Weise können Sie die Regeln für die Durchsatz- und Partitionsdrosselung "ausspielen", allerdings mit einem hohen Grad an Komplexität in Ihrem Design. Insgesamt ist es wahrscheinlich nicht wert; Wo machst du neue Zeitreihen? Wie erinnerst du dich, wo sie alle sind? Wie verschiebst du eine Zeitreihe?

Ich denke DynamoDB unterstützt einige interne "Bursting" auf diese Art von liest aus meiner eigenen Erfahrung, und es ist möglich, meine Zahlen sind aus, und Sie werden eine angemessene Leistung erhalten. Mein Urteil lautet jedoch Redshift.

+0

Ich kann 100K Zeitreihen auf einer einzelnen kleinen EC2-Instanz in einer MySQL-Datenbank verarbeiten. Das ist sehr billig. Redshift benötigt extra große EC2-Instanzen, die sehr teuer sind ... – jQguru

0

Wie wäre es, jede Zeitreihe in JSON oder ähnliches zu tropfen und in S3 zu speichern. Du brauchst höchstens eine Suche von irgendwo wie Dynamo.

Sie müssen möglicherweise noch eine Rotverschiebung vornehmen, um Ihre Eingaben zu verarbeiten.

Verwandte Themen