Я использую LCS и относительно большой TTL в 2 года для всех вставленных строк, и меня беспокоит момент, когда C * удалит соответствующие надгробия (не выполняется ни явное удаление, ни обновление).
Из Отсутствует руководство по стратегии выравнивания с выравниванием , Уплотнения надгробий в Кассандре и Удаляется без надгробий или TTL Я понимаю, что
- Все уровни, кроме L0, содержат неперекрывающиеся SSTable, но ключ раздела может присутствовать в одной SSTable на каждом уровне (он же распространяется на всех уровнях).
- Чтобы уплотнение могло отбросить надгробную плиту, необходимо убедиться, что уплотняются все таблицы SS, содержащие данные de, для предотвращения данных зомби (это делается проверкой фильтров цветения). Также учитывается gc_grace_seconds
Итак, для моего конкретного случая использования (TTL 2 года и большая нагрузка при записи) я могу заключить, что данные TTL будут на самых высоких уровнях, поэтому мне интересно, когда эти SSTables с данными TTLed будут сжаты с SSTables, который содержит соответствующие SSTables.
Главный вопрос будет: Где создаются надгробия (из ттл)? Создаются на уровне 0, поэтому потребуется много времени, пока он не окажется на самом высоком уровне (следовательно, освобождение места на диске займет много времени)?
В комментарии от Об удалениях и надгробиях Ален говорит, что
Тем не менее, использование TTL помогает уменьшить вероятность фрагментации данных между SSTable, которые в ближайшее время не будут сжаты вместе. Используя любую стратегию сжатия, если удаление происходит относительно поздно в истории строк, как это и происходит, «вставка» / «вставка» надгробного камня перейдет в новый SSTable. Это могильному камню может потребоваться время, чтобы добраться до нужного «ведра» уплотнения (с остальной частью ряда) и чтобы Кассандра смогла наконец освободить место.
Насколько я понимаю, с помощью TTL надгробия создаются на месте , поэтому часто и по многим причинам легче и безопаснее избавиться от TTL, чем от удаления.
Другим ключом к исследованию будет использование TTL в качестве значения по умолчанию, если это хорошо подходит. TTL, установленные на уровне таблицы с параметром default_time_to_live, вообще не должны создавать никаких надгробий в C * 3.0 +. Не проверял на моей руке, но я читал об этом.
Я не уверен, что означает " на месте ", поскольку SSTables являются неизменяемыми.
(У меня также есть некоторые сомнения относительно того, что он говорит об использовании default_time_to_live
, о котором я спрашивал в Как default_time_to_live удаляло строки без надгробий в Кассандре? ).
Я предполагаю, что это относится к надгробиям, создаваемым на том же уровне (но с разными SStables), что данные TTLed во время сжатия, вызванные одной из следующих причин:
- «Начиная с самого высокого уровня, любой уровень, имеющий балл выше 1.001, может быть выбран потоком уплотнения» Пропущенное руководство по стратегии выравнивания с уплотнением
- «Если мы пройдем 25 раундов без уплотнения на самом высоком уровне, мы начнем вводить sstables с этого уровня в уплотнения более низкого уровня» Пропущенное руководство по стратегии выравнивания уплотнения
- "Если нет других уплотнений, которые мы можем выполнить, мы запускаем уплотнение с одной стабильной версией, если в sstable имеется более X% выпадающих надгробий." CASSANDRA-7019
Поскольку надгробия создаются во время уплотнения, я думаю, что для оценки сбрасываемых надгробий может использоваться метаданные SSTable.
Таким образом, уплотнения (2) и (3) должны создавать / сбрасывать надгробия на самых высоких уровнях, поэтому использование LCS с большим TTL само по себе не должно быть проблемой.
Под созданием / удалением я подразумеваю, что такой же тип сжатия будет создавать надгробия для данных с истекшим сроком и / или отбрасывания надгробий, если период gc уже прошел.
Ссылка на исходный код, проясняющая эту ситуацию, будет отличной, спасибо.