2013-09-26 9 views
5

Attualmente, ho una famiglia di colonne cassandra con grandi file di dati, per dire più di 100.000. Ora, vorrei rimuovere tutti i dati in questa famiglia di colonne e il problema è venuto fuori:La query di ricerca Cassandra è piuttosto lenta dopo aver eliminato un grande fascio di dati

Dopo che tutti i dati sono stati rimossi, eseguo una query di ricerca in questa famiglia di colonne, la cassandra impiegherà decine di secondi a ritornare un risultato di query vuoto. E il costo di tempo aumenta linearmente quando i dati originali è più grande

E 'causata dalla funzione lapide durante l'eliminazione dei dati dal database cassandra. La velocità di ricerca non riprenderà a funzionare normalmente fino a quando non viene attivato il prossimo GC. Vedi Cassandra Distributed Deletes.

Poiché tali operazioni di query sono spesso utilizzate nel mio sistema, non posso sopportare l'enorme latenza fino a pochi secondi.

Per favore, potresti darmi una soluzione a questo problema?

+0

Forse usa [modello serie storica] (https://academy.datastax.com/resources/getting-started-time-series-data-mode ling) può essere un buon approccio? – deFreitas

risposta

3

Questo sembra un modo pessimo di utilizzare un database. Compilalo, svuotalo, ripeti. Un modo per risolvere il tuo problema è l'utilizzo di nomi CF diversi ogni volta, come quando svuoti i dati e inizi a ripopolarli, crea una nuova famiglia di colonne e usali e lascia semplicemente l'altra famiglia ma questo è un hacker.

Suggerirei di utilizzare compattazione (gets rid of all the tombstones it can detect) per risolvere il problema, è a uso intensivo della CPU ma è meglio che attendere decine di secondi per rispondere alle query. È possibile rendere il compito meno intensivo sulla vostra macchina, fornendo i ks specifiche & cf si desidera compattare:

./nodetool compact <ks_name> <cf_name> 

punto di Ritchard è una buona, gc_grace_seconds è impostato a 10 giorni per impostazione predefinita in modo da probabilmente dovrete modificare questo per consentire la compattazione per sbarazzarsi di lapidi.

+1

Si noti che la compattazione rimuoverà solo le lapidi dopo che è trascorso gc_grace_seconds da quando è stata inserita la pietra tombale. – Richard

+0

@Luben, non riesco a svuotare l'intera famiglia di colonne, perché ci sono più di 1000 utenti i cui dati sono memorizzati al loro interno e ognuno di essi ha più di 100.000 righe di dati. Ogni operazione di cancellazione viene eseguita su dati di un singolo utente. L'operazione ** compatta ** su famiglia di colonne può essere una scelta, ma ** qual è il momento di attivare questa operazione? ** Se viene attivata ogni volta che un utente cancella alcuni dati, può influire su tutti gli altri utenti. Qual è il tuo suggerimento su questo? Grazie ancora! E grazie a Richard per aver ricordato _gc_grace_seconds_. – Fify

0

@Fify

Se la vostra famiglia è spesso colonna modificato (leggere quindi aggiornare quindi leggere nuovamente l'aggiornamento ...), è necessario utilizzare il leveled compaction strategy

Per rendere le colonne eliminate quickier rimosso , cambia la proprietà gc_grace_seconds della tua famiglia di colonne

+0

grazie per la tua risposta. 1) Le operazioni maggiormente utilizzate dalla famiglia di colonne sono _insertion_, quindi _read_, _deletion_ a volte si verificano ma con probabilità molto bassa (diciamo 1 su 100 operazioni).2) Il ** gc_grace_seconds ** non può essere troppo breve perché ci sono diversi dati di TB memorizzati nel database. – Fify