2013-09-26 11 views
5

Obecnie mam kolumnę z kolumną z dużą liczbą danych, aby powiedzieć więcej niż 100 000. Teraz chciałbym usunąć wszystkie dane z tej rodziny kolumn i pojawił się problem:Zapytanie wyszukiwania Cassandra jest dość powolne po usunięciu dużego pakietu danych.

Po usunięciu wszystkich danych, wykonuję zapytanie wyszukiwania w tej rodzinie kolumn, a kasandra zajmie kilkadziesiąt sekund na zwrócenie pusty wynik zapytania. Czas i koszt będzie wzrastać liniowo gdy oryginalne dane są większe

Jest to spowodowane przez funkcję nagrobek podczas usuwania danych z bazy Cassandra. Szybkość wyszukiwania nie powróci do normy, dopóki nie zostanie uruchomiony następny GC. Zobacz Cassandra Distributed Deletes.

Ponieważ takie operacje kwerend są często używane w moim systemie, nie mogę znieść dużej zwłoki nawet do kilku sekund.

Czy możesz podać mi rozwiązanie tego problemu?

+0

Może użyć [modelu szeregów czasowych] (https://academy.datastax.com/resources/getting-started-time-series-data-mode ling) może być dobrym podejściem? – deFreitas

Odpowiedz

3

To brzmi jak bardzo zły sposób korzystania z bazy danych. Wypełnij, opróżnij, powtórz. Jednym ze sposobów rozwiązania problemu jest użycie różnych nazw CF za każdym razem, tak jak podczas opróżniania danych i rozpoczynania ich ponownego tworzenia, tworzenia nowej rodziny kolumn i korzystania z niej, a po prostu upuść inną rodzinę colum , jednak jest to hacky.

Proponuję użyć zagęszczania (gets rid of all the tombstones it can detect), aby rozwiązać problem, procesor jest intensywny, ale jest lepszy niż czekanie na odpowiedzi przez kilka sekund. Można zrobić zadanie mniej intensywny na komputerze poprzez dostarczenie konkretnego KS & cf chcesz kompaktowa:

./nodetool compact <ks_name> <cf_name> 

punkt Ritchard jest dobry, gc_grace_seconds jest ustawiony na 10 dni domyślnie więc prawdopodobnie będziesz musiał dostosuj to, aby zagęszczenie pozwoliło pozbyć się nagrobków.

+1

Należy pamiętać, że zagęszczanie usunie tylko nagrobki po upływie czasu gc_grace_seconds od momentu wstawienia nagrobka. – Richard

+0

@Lyuben, nie mogę opróżnić całej rodziny kolumn, ponieważ istnieje ponad 1000 użytkowników, których dane są w niej przechowywane, a każdy z nich ma ponad 100 000 wierszy danych. Każda operacja usunięcia jest wykonywana na danych pojedynczego użytkownika. ** ** w trybie ** w rodzinie kolumn może być wyborem, ale ** jaki jest czas uruchomienia tej operacji? ** Jeśli zostanie wywołany za każdym razem, gdy jeden użytkownik usunie niektóre dane, może to wpłynąć na wszystkich innych użytkowników. Jaka jest Twoja sugestia w tej sprawie? Jeszcze raz dziękuję! I dziękuję Richardowi za przypomnienie _gc_grace_seconds_. – Fify

0

@Fify

Jeśli twoja rodzina kolumna jest często zmodyfikowany (czytaj następnie zaktualizować następnie ponownie odczytać aktualizacji ...), należy użyć leveled compaction strategy

Aby usunięte kolumny usuwane quickier , zmień właściwość gc_grace_seconds z rodziny kolumn

+0

dzięki za odpowiedź. 1) Większość używanych w mojej kolumnie operacji to _insertion_, a następnie _read_, _deletion_ czasami się zdarzało, ale z bardzo małym prawdopodobieństwem (powiedzmy 1 na 100 operacji).2) ** gc_grace_seconds ** nie może być zbyt krótki, ponieważ w bazie danych przechowywanych jest kilka TB danych. – Fify