Как default_time_to_live удалит строки без надгробий в Кассандре?

Из Как удаляются данные?

Cassandra позволяет вам установить свойство default_time_to_live для всей таблицы. Столбцы и строки, отмеченные обычным TTL, обрабатываются, как описано выше; но когда запись превышает TTL на уровне таблицы, Cassandra удаляет ее немедленно, без захоронения или сжатия.

На это также ответят здесь

Если в таблице есть default_time_to_live, то строки, превышающие этот временной предел, немедленно удаляются без записи надгробий.

И прокомментировал в сообщении LastPickle Об удалениях и надгробиях

Еще одна подсказка для изучения - использовать TTL в качестве значения по умолчанию, если это подходит. TTL, установленные на уровне таблицы с 'default_time_to_live' , не должны создавать никаких надгробий в C * 3.0 +. На руке не тестировал, но об этом читал.

Я провел простейший тест, который мог представить, используя LeveledCompactionStrategy:

CREATE KEYSPACE IF NOT EXISTS temp WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};

CREATE TABLE IF NOT EXISTS temp.test_ttl (
    key text,
    value text,
    PRIMARY KEY (key)
) WITH  compaction = { 'class': 'LeveledCompactionStrategy'}
  AND default_time_to_live = 180;
  1. INSERT INTO temp.test_ttl (key,value) VALUES ('k1','v1');
  2. nodetool flush temp
  3. sstabledump mc-1-big-Data.db введите здесь описание изображения
  4. подождите 180 секунд (default_time_to_live)
  5. sstabledump mc-1-big-Data.db введите описание изображения здесь Надгробие еще не создано
  6. nodetool compact temp
  7. sstabledump mc-2-big-Data.db введите здесь описание изображения Надгробие создано (и не сбрасывается при уплотнении из-за gc_grace_seconds)

Тест проводился с использованием apache cassandra 3.0.13

Из примера я прихожу к выводу, что неверно, что default_time_to_live не требуются надгробия, по крайней мере, для версии 3.0.13. Однако это очень простой тест, и я принудительно выполняю серьезное уплотнение с помощью nodetool compact, поэтому я, возможно, не воссоздаю сценарий, в котором в игру вступает магия default_time_to_live.

Но как C * удалить без надгробий? Почему это должен быть сценарий, отличный от использования TTL для каждой вставки?


person gabrielgiussi    schedule 11.09.2018    source источник
comment
Вы видели это сообщение в блоге? thelastpickle.com/blog/2016/07/27/   -  person Alex Ott    schedule 12.09.2018
comment
Да, упоминается в вопросе.   -  person gabrielgiussi    schedule 13.09.2018


Ответы (2)


Меня обманула часть документации, которую вы упомянули, отвечая на этот вопрос в нашем блоге (Последний блог о маринаде). Я, вероятно, ответил на этот вопрос слишком быстро, хотя я написал это «для изучения», даже сказав, что я не пробовал это явно.

Еще одна подсказка для изучения - использовать TTL в качестве значения по умолчанию, если это подходит. TTL, установленные на уровне таблицы с 'default_time_to_live' , не должны создавать никаких надгробий в C * 3.0 +. На руке не тестировал, но об этом читал.

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

Из этого примера я прихожу к выводу, что неверно, что default_time_to_live не требуются надгробия, по крайней мере, для версии 3.0.13.

Кроме того, я рад видеть, что вы не поверили мне или документации Datastax, но попробовали сами. Это безусловно правильный подход.

Но как удалить C * без надгробий? Почему это должен быть другой сценарий использования TTL для вставки?

Да именно это,

Ваше здоровье.


Ален Родригес - @arodream - [email protected] Франция / Испания

Последний рассол - Apache Cassandra Consulting http://www.thelastpickle.com

person Arodrime    schedule 01.10.2018

AFAIK нет большой разницы между записями надгробий и записями с истекшим TTL. В вашем случае принудительное сжатие преобразовало запись с истекшим сроком действия TTL в надгробную плиту, но она не была очищена из-за gc_grace_seconds. Согласно этому презентация, надгробия / записи с истекшим сроком действия исчезнут:

  • Никогда раньше не было gc_grace_seconds
  • Во время уплотнения для tombstone / ttl, прошедшего gc_grace, его ключ раздела проверяется по фильтрам цветения всех других SSTables для данной таблицы.
  • Если есть коллизия фильтра Блума, надгробие останется, даже если коллизия была ложноположительной.
  • Если есть какие-либо данные, даже другие надгробные камни для этого раздела в любом SSTable, надгробие не будет очищено.
  • Если фильтры Блума указывают на отсутствие шансов на перекрытие по этому ключу раздела, то надгробие очищается.

Так что технически tombstone / ttl может исчезнуть после gc_grace, но это не гарантируется.

person shutty    schedule 12.09.2018
comment
Вопрос касается предпосылки, согласно которой default_time_to_live не требует надгробий, а не явных удалений по сравнению с удалениями ttl. То, что вы говорите, правда, но не отвечает на мой вопрос. - person gabrielgiussi; 13.09.2018