Chcę usunąć rekordy z klastra Cassandry po określonym czasie. Co więc powinienem używać TTL lub ręcznie usunąć?

3
Rajendra Jangir 4 czerwiec 2018, 11:09

3 odpowiedzi

Najlepsza odpowiedź

To zależy od modelu danych. Szczęśliwą odpowiedź jest to, że ze względu na ich przewidywalny charakter, może zbudować model danych, aby pomieścić TTLS.

Powiedzmy, że zbuduję następującą tabelę do śledzenia żądań użytkownika do usługi odpoczynku, na przykład. Przypuśćmy, że naprawdę troszczę się tylko o wartość danych zeszłego tygodnia, więc ustawię TTL z 604800 sekund (7 dni). Więc zapytanie, które muszę wspierać, jest zasadniczo to (zapytanie transakcji dla użytkownika "Bob" za wcześniej 7 dni):

SELECT * FROM rest_transactions_by_user 
  WHERE username='Bob' AND transaction_time > '2018-05-28 13:41';

Aby wspierać to zapytanie, zbuduję tę tabelę:

CREATE TABLE rest_transactions_by_user (
  username TEXT,
  transaction_time TIMESTAMP,
  service_name TEXT,
  HTTP_result BIGINT,
  PRIMARY KEY (username,transaction_time))
  WITH CLUSTERING ORDER BY (transaction_time DESC)
  AND gc_grace_seconds = 864000      
  AND default_time_to_live = 604800;

Kilka uwag:

  • Wyjeżdżam gc_grace_seconds w domyślnym 864000 (dziesięć dni). Zapewni to, że nagrobki TTL będą miały odpowiedni czas, aby być propagowany przez cały klaster.
  • Wiersze będą TTL o 7 dni (jak wspomniano powyżej). Po tym stają się nagrobkami przez dodatkowe 10 dni.
  • Jestem klastrowany przez transaction_time w kolejności malejącym. Dotyczy to wierszy, na których zależy mi (te, których nie ttl'd) na "górnej" mojej partycji (kolejno).
  • Zapytając o transaction_time z 7 dni, ignoruję coś starszego. Gdy moje nagrobki TTL będą istnieć przez 10 dni później, będą one na "dole" mojej partycji.

W ten sposób ograniczając moje zapytanie do ostatnich 7 dni zapewnia, że Cassandra będzie nigdy Muszę radzić sobie z nagrobkami, , ponieważ moje zapytanie nigdy nie znajdzie ich . W takim przypadku i mają zbudowany model danych, w którym TTL jest "lepszy" niż losowy usuwanie.

1
Aaron 4 czerwiec 2018, 13:51

Odpowiedź brzmi: "To zależy". Usuwanie danych w Cassandry nigdy nie jest wolny.

Jeśli musisz "usunąć", zawsze musisz wydać te zapytania, dzięki TTL zostało zrobione od momentu napisania danych. Ale za pomocą usunięcia masz więcej kontroli nad usuwaniem danych.

Po stronie operacyjnej należy spróbować zdobyć nagrobki w tym samym sensie, więc gdy wygasło GC_Grace, pełny sami można upuścić. Ponieważ dane są faktycznie usuwane tylko wtedy, gdy sierstable są zagęszczane, nawet jeśli minęło GC_Grace, a zagęszczanie nie nastąpiło z samią trzymającą nagrobek, nagrobek nie zostanie usunięty z dysku twardego. Dokonuje to również wyboru strategii zagęszczania tabeli.

Jeśli używasz również wielu nagrobków, zawsze powinieneś włączyć: "Unchecked_tombstone_compaction" na poziomie tabeli. Możesz przeczytać więcej o tym tutaj: https: //docs.datAx .com / en / cql / 3.1 / cql / cql_refference / compactsubprop.html

5
Carlos Rolo 4 czerwiec 2018, 13:38

Pozwalając, aby rekord wygasał na podstawie TTL jest lepszy. Przy usuwaniu TTL można ustawić GC_Grace_seconds do znacznie niższej wartości (1 dzień lub dwa), a nie musisz się martwić o ponurkowanie nagrobków przez dłuższy czas trwania.

Z ręcznym usuwaniem należy upewnić się, że nagrobki nie zwiększają się poza ostrzeżeniem i progiem błędu, ponieważ wpływa na zapytanie.

1
Firdousi Farozan 4 czerwiec 2018, 08:40