Какой из них лучше использовать TTL или Удалить в Кассандре? - PullRequest
0 голосов
/ 04 июня 2018

Я хочу удалить записи из кластера Cassandra через определенное время.Так что я должен использовать TTL или удалить вручную?

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Ответ "это зависит".Удаление данных в cassandra никогда не бывает бесплатным.

Если вам нужно «УДАЛИТЬ», вам всегда нужно выполнить эти запросы, с TTL это делается с момента записи данных.Но с помощью DELETE вы получаете больший контроль над удалением данных.

Со стороны операции вы должны попытаться поместить ваши надгробия в один и тот же sstable, чтобы после истечения срока действия gc_grace можно было удалить полный sstable.Поскольку данные фактически удаляются только при сжатии sstable, даже если пройден gc_grace, и сжатие не произошло, если sstable содержит надгробный камень, надгробный камень не будет удален с жесткого диска.Это также делает релевантным выбор стратегии уплотнения для вашей таблицы.

Если вы также используете много надгробий, вы всегда должны включать: "unchecked_tombstone_compaction" на уровне таблицы.Вы можете прочитать больше об этом здесь: https://docs.datastax.com/en/cql/3.1/cql/cql_reference/compactSubprop.html

0 голосов
/ 04 июня 2018

Это зависит от вашей модели данных.Удачный ответ заключается в том, что из-за их предсказуемой природы вы можете построить свою модель данных для учета TTL.

Допустим, я строю следующую таблицу для отслеживания пользовательских запросов к службе REST,например.Предположим, что я действительно забочусь о данных за последнюю неделю, поэтому я установлю TTL 604800 секунд (7 дней).Таким образом, запрос, который мне нужно поддержать, в основном таков (запрос транзакций для пользователя 'Bob' за предыдущие 7 дней):

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

Для поддержки этого запроса я создам следующую таблицу:

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;

Несколько замечаний:

  • Я оставляю gc_grace_seconds по умолчанию 864000 (десять дней).Это гарантирует, что надгробия TTL будут иметь достаточное время для распространения по всему кластеру.
  • Ряды будут TTL через 7 дней (как упомянуто выше).После этого они становятся надгробными камнями еще на 10 дней.
  • Я кластеризируюсь по transaction_time в порядке убывания.Это помещает строки, которые меня интересуют (те, которые не имеют TTL'd) в «верх» моего раздела (последовательно).
  • Запрашивая transaction_time из предыдущих 7 дней, яЯ игнорирую все, что старше, чем это.Поскольку мои надгробия TTL будут существовать в течение 10 дней после этого, они будут находиться в «нижней части» моего раздела.

Таким образом, ограничение моего запроса последними 7 днями гарантирует, что Cassandra никогда не придется иметь дело с надгробиями , так как мой запрос никогда не найдет их .Так что в этом случае я построил модель данных, в которой TTL "лучше", чем случайное удаление.

0 голосов
/ 04 июня 2018

Лучше позволить истечению срока записи на основе TTL.При удалении на основе TTL вы можете установить для gc_grace_seconds гораздо более низкое значение (1 или 2 дня), и вам не нужно беспокоиться о надгробиях, задерживающихся на более длительный срок.

При удалении вручную вам необходимо выполнитьубедитесь, что надгробия не превышают порог предупреждения и ошибки, так как это влияет на запрос.

...