2013-08-13 21 views
9

Vorrei memorizzare 1 milione di serie temporali diverse nel database DynamoDb di Amazon. Ogni serie temporale avrà circa 50.000 punti dati. Un punto dati è composto da un timestamp e un valore.Memorizzazione delle serie temporali in AWS DynamoDb

L'applicazione aggiungerà nuovi punti dati alle serie temporali frequentemente (sempre) e recupererà (di solito tutte le serie storiche) serie temporali di volta in volta, per l'analisi.

Come devo strutturare il database? Devo creare una tabella separata per ogni timeseries? O dovrei mettere tutti i punti dati in una tabella?

+4

Cosa hai usato? – Hugo

+3

quale design hai utilizzato? – Narayan

risposta

12

Supponendo che i dati siano immutabili e considerate le dimensioni, è possibile considerare Amazon Redshift; è scritto per soluzioni di reporting di dimensioni petabyte.

In Dynamo, posso pensare ad alcuni progetti validi. Nel primo caso, è possibile utilizzare una tabella, con un hash composto/chiave di intervallo (entrambe le stringhe). La chiave hash sarebbe il nome della serie temporale, la chiave dell'intervallo sarebbe il timestamp come una stringa ISO8601 (che ha la proprietà piacevole che l'ordinamento alfabetico è anche l'ordinamento cronologico) e ci sarebbe un attributo extra su ciascun elemento; un valore'. Questo ti dà la possibilità di selezionare tutto da una serie temporale (Query su uguaglianza hashKey) e un sottoinsieme di una serie temporale (Query su equanimità hashKey e clausola rangeKey BETWEEN). Tuttavia, il tuo problema principale è il problema "hotspot": internamente, Dynamo suddivide i tuoi dati da hashKey e disperderà la tua ProvisionedReadCapacity su tutte le tue partizioni. Quindi potresti avere 1000 KB di letture al secondo, ma se hai 100 partizioni, allora hai solo 10 KB al secondo per ogni partizione, e leggendo tutti i dati da una singola serie temporale (singolo hashKey) colpirà solo una partizione. Quindi potresti pensare che i tuoi 1000 KB di letture ti danno 1 MB al secondo, ma se hai 10 MB memorizzati potrebbe richiedere molto più tempo per leggerlo, dato che la tua singola partizione ti rallenterà molto più pesantemente.

Sul lato positivo, DynamoDB ha un limite superiore estremamente elevato ma costoso per il ridimensionamento; se volessi, potresti pagare per 100.000 unità di capacità di lettura e avere tempi di risposta inferiori a tutti questi dati.

Un altro progetto teorico sarebbe quello di memorizzare tutte le serie temporali in una tabella separata, ma non penso che DynamoDB sia destinato a ridimensionare a milioni di tabelle, quindi questo è probabilmente un no-go.

Si potrebbe provare a distribuire le serie temporali su 10 tabelle in cui i dati "letti" nella tabella 1, "quasi mai letti i dati" nella tabella 10 e tutti gli altri dati nel mezzo. Ciò consentirebbe di "giocare" le regole di limitazione della velocità effettiva/partizione approvate, ma con un alto grado di complessità nella progettazione. Nel complesso, probabilmente non ne vale la pena; dove hai nuove serie temporali? Come ricordi dove sono tutti? Come muovi una serie temporale?

Penso che DynamoDB supporti alcuni "scoppi" interni su questi tipi di letture dalla mia esperienza, ed è possibile che i miei numeri siano disattivati ​​e otterrete prestazioni adeguate. Tuttavia il mio verdetto è di esaminare Redshift.

+0

Sono in grado di gestire serie temporali 100K su una singola piccola istanza EC2 in un database MySQL. Che è molto economico Redshift richiede istanze EC2 molto grandi che sono molto costose ... – jQguru

0

Che ne dici di gocciolare ogni serie storica in JSON o simile e memorizzarlo in S3. Al massimo avresti bisogno di una ricerca da qualche parte come Dynamo.

Potrebbe essere necessario il redshift per elaborare gli input.

Problemi correlati