2013-05-14 11 views
11

Wiem, że są TTL na kolumnach w Cassandrze. Ale czy możliwe jest również ustawienie TTL w rzędzie? Ustawienie TTL dla każdej kolumny nie rozwiązuje mojego problemu, jak można zauważyć w następującym przykładzie:Cassandra ttl z rzędu

W pewnym momencie proces chce usunąć kompletny wiersz z TTL (powiedzmy wiersz "A" z TTL 1 tydzień). Może to zrobić, zastępując wszystkie istniejące kolumny tą samą treścią, ale z TTL wynoszącym 1 tydzień.

Ale może być inny proces uruchomiony jednocześnie na tym wierszu „A”, który wstawia nowe kolumny lub zastępuje istniejące bez TTL dlatego, że proces ten nie może wiedzieć, że rząd ma być usunięty (biegnie równolegle!). Tak więc po 1 tygodniu wszystkie kolumny wiersza "A" zostaną usunięte z powodu TTL, z wyjątkiem tych nowo wstawionych. I chcę też, żeby zostały usunięte.

Czy istnieje wsparcie dla Cassandry na ten przypadek, czy też muszę coś wdrożyć na własną rękę?

poważaniem
Stefan

+0

Jak wspomniano w odpowiedzi na Richarda, my naprawdę nie potrzebują TTL na wszystkich danych rzędu. Jak widać w dyskusji dla nas wystarczy usunąć wszystkie dane do określonego znacznika czasu w przyszłości (tj. 1 tydzień) i mieć ttl w jednej kolumnie. – std

Odpowiedz

10

Nie ma możliwości ustawienia TTL na wiersz w Cassandry komunikatu. TTL są przeznaczone do usuwania pojedynczych kolumn, gdy ich czas życia jest znany, gdy są napisane.

Możesz osiągnąć to, co chcesz, opóźniając proces - zamiast chcesz wstawić TTL 1 tygodnia, uruchom go tydzień później i usuń wiersz. Usunięcia wierszy mają następującą semantykę: każda kolumna wstawiona tuż przed zostanie usunięta, ale kolumny wstawione tuż po niej nie będą.

Jeśli kolumny, które są wstawiane w przyszłości, muszą zostać usunięte, możesz w przyszłości wstawić wiersz ze znacznikiem czasu, aby to zapewnić, ale zachowaj ostrożność: jeśli później chcesz wstawić do tego wiersza, nie możesz kolumny znikną, gdy zostaną zapisane w tym wierszu (dopóki nagrobek nie zostanie zebrany).

+0

Pomysł usunięcia znacznika czasu w przyszłości jest interesujący. Ale niestety nie znam nazwy wszystkich kolumn, które można wstawić. – std

+0

Nie trzeba znać nazw kolumn podczas usuwania wierszy. – Richard

+0

Aaah, ok :) Właśnie to sprawdziłem. Nie wiedziałem, że to zadziała. Myślę, że użyjemy go w ten sposób: Usuniemy wiersz ze znacznikiem czasu w przyszłości (1 tydzień) i wstawimy znacznik DELETED z tym samym znacznikiem czasu i TTL, który wkrótce wygasa. Usunięcie w przyszłości powoduje również usunięcie aktualizacji z procesów współbieżnych, a znacznik DELETED uniemożliwia innym wstawianie do usuniętego wiersza. Po wygaśnięciu znacznika DELETED można ponownie użyć tego wiersza. Miły. Dzięki za podpowiedź. – std

1

Chociaż nie polecam takich, istnieje sposób Cassandra aby rozwiązać problem:

SELECT TTL(value) FROM table WHERE ...; 

uzyskać aktualny TTL o wartości pierwszej, a następnie użyć wynik ustawić TTL we wkładce lub UPDATE:

INSERT ... USING TTL ttl-of-value; 

... Więc myślę, że SELECT TTL() jest powolny (z doświadczenia z TTL() i WriteTime() w niektórych moich poleceń CQI). Co więcej, TTL jest poprawny w momencie, gdy wybrane wyniki są generowane w węźle Cassandra, ale do momentu wstawienia insertu, będzie on wyłączony. Cassandra powinien oferowane czasu usunięcia zamiast czas życia ...

Tak jak wspomniano przez Richarda posiadanie własnego procesu usuwania danych po upływie 1 tygodnia jest prawdopodobnie bezpieczniejsze. Powinieneś mieć jedną kolumnę, aby zapisać datę utworzenia lub datę, kiedy dane przestają być aktualne. Następnie proces w tle może odczytać tę datę, a jeśli dane są postrzegane jako przestarzałe, upuść cały wiersz.

Inne procesy mogą również użyć tej daty, aby wiedzieć, czy dany wiersz jest uważany za ważny, czy nie! (więc nawet jeśli nie został jeszcze usunięty, nadal możesz zobaczyć wiersz jako niepoprawny, jeśli data zostanie zaliczona.)

4

Można ustawić TTL dla wiersza w Cassandra 3 stosując

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10; 
+1

to nie służy przypadkowi użycia pytania. Jeśli zaktualizujesz kolumnę, zostanie zmieniona wartość ttl (będzie null, jeśli nie określisz żadnego ttl w zapytaniu o aktualizację). W rezultacie wiersz będzie istniał z tymi zaktualizowanymi kolumnami po wygaśnięciu ttl. –