2013-04-16 2 views
5

Sto cercando di creare un database di timeseries di Cassandra per archiviare milioni di serie di dati giornalieri che potenzialmente possono avere complessivamente fino a 100 punti di dati.Progettazione del database di timeseries in Cassandra

Ho guardato questo articolo: http://rubyscale.com/blog/2011/03/06/basic-time-series-with-cassandra/

Questo disegno è molto solida. Quindi, in sostanza, posso inserire i timestamp giornalieri come colonne e, se necessario, dividere le colonne aggiungendo il giorno alla riga.

Due domande che ho:

  • Sto cercando di memorizzare fino a 20.000 timestamp (al giorno) le colonne. È anche necessario tagliare le righe, ad es. anno con questa quantità di colonne? C'è qualche vantaggio/svantaggio nel condividere le righe per ridurre il numero di colonne fino a 365 all'anno.
  • Un'altra idea che ho è piuttosto che dividere colonne per riga è creare una famiglia di colonne per ogni anno. In questo modo quando si accede ai dati da più anni dovrei interrogare più famiglie di colonne anziché una famiglia di colonne e unire i risultati sul lato client. Questo approccio accelererebbe le cose o piuttosto rallenterebbe tutto?

risposta

4

Se hai intenzione di gestire enormi quantità di scritture, c'è un problema con il tuo approccio.

Scrittura sempre su 1 tasto significa che tutte le scritture per quel tasto andranno a un nodo. Fondamentalmente userai un nodo al giorno fuori dal tuo cluster, quindi potresti anche avere un'enorme istanza di Cassandra piuttosto che preoccuparti di configurare un cluster. Se la frequenza di scrittura diventa molto alta, è possibile che i nodi responsabili di quel giorno/chiave vengano abbattuti.

Il mio consiglio è di eseguire il bucket di un giorno su più righe utilizzate simultaneamente. Il time bucketing potrebbe essere pericoloso in quanto un'improvvisa ondata durante un secchio potrebbe far crollare tutto.

si potrebbe creare il secchio (chiave di fila) come questo:

  • [ROW_BASE_NAME] + [DAY] + someHashFunction (timestamp)% 10
  • [ROW_BASE_NAME] + [DAY] + random.nextInt (10)
  • [ROW_BASE_NAME] + [DAY] + nextbucket < --- che è se si dispone di un modo sicuro per ruotare il secchio da soli

ci sono molti modi per farlo. Puoi anche usare qualche elemento della colonna che viene salvato per farlo. Ma penso che dovrebbe essere importante farlo per sfruttare l'intero cluster di cassandra in ogni momento.

La mia risposta è valida solo per le applicazioni/funzionalità pesanti di scrittura poiché è necessario utilizzare un multi_get (più chiavi di intere righe) per leggere tutti i dati e ricostituire l'intera linea temporale per quel giorno.

+0

Quindi pensi che non ci siano punti nelle tabelle/famiglie di colonne di separazione in famiglie di colonne separate, ma per farlo piuttosto per righe? C'è qualche svantaggio avendo troppe righe in una singola famiglia di colonne? – datageek

+2

La famiglia di colonne è solo un livello chiave aggiuntivo.Se i miei dati sono della stessa natura e richiedono le stesse impostazioni in termini di memorizzazione nella cache, confronto (nomi di colonne), ecc. Quindi li metto nella stessa famiglia di colonne. Le famiglie di colonne Plus non sono facili da gestire in modo programmatico. Mentre scrivere su una nuova chiave lo creerà. E non puoi leggere da CF separati in una query. –

1

Si consiglia inoltre di leggere questo articolo su Advanced Time Series with Cassandra.

+0

L'ho visto grazie, a dire il vero non mi piace quella soluzione dell'articolo di serie storica avanzata. Se l'ho capito, questo richiede di inserire i dati come JSON? – datageek