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

StackOverflow https://stackoverflow.com//questions/24053860

  •  21-12-2019
  •  | 
  •  

Вопрос

Я знаю, что это не лучший способ использовать Cassandra, но тип моих данных требует чтения всех данных за последнюю неделю.Однако при использовании Collection-types в CQL3 я столкнулся с определенными ограничениями, которые мешают мне выполнять обычные запросы в диапазоне дат.

Итак, я настроил Cassandra (в настоящее время один узел, возможно, больше в будущем) со следующей таблицей

CREATE TABLE cache (tag text, id int, tags map<text,text>, 
  PRIMARY KEY (tag, id) );
ALTER TABLE cache WITH GC_GRACE_SECONDS = 0;

Я вставляю с TTL в одну неделю, чтобы автоматически удалять элементы из кэша.

Я попытался следовать предложениям, упомянутым в эта статья чтобы избежать чтения многих надгробий, выберите "минимальный идентификатор", который я сохраняю в другом месте, чтобы избежать чтения старых данных:

SELECT * FROM cache WHERE tag = ? AND id >= ?

Идентификатор - это, по сути, своего рода временная метка, которая постоянно увеличивается, т.е.Я только со временем вставляю более высокие значения и постоянно удаляю старые идентификаторы из таблицы.

Но я все еще получаю предупреждения о достижении пороговых значений

WARN 08:59:06,286 Read 5001 live and 5702 tombstoned cells in cache (see tombstone_warn_threshold)

И если я не запускаю ручное сжатие / очистку регулярно, я получаю исключения и запросы завершаются неудачей.

Однако, исходя из моего понимания из статей и документации, я должен избегать большинства, если не всех надгробий здесь, поскольку я запрашиваю равенство для тега, который позволяет Cassandra искать только эти области, и я использую минимальный идентификатор, который позволяет Cassandra начинать чтение только после большинства надгробий, так почему же все еще появляются предупреждения / исключения надгробий?

Это было полезно?

Решение

Пара Map k / v на самом деле является столбцом (имя, значение и временная метка).:итак, если вы производите много удалений элементов карты (срок действия TTL также имеет место) - это источник этого предупреждения.Потому что вы все еще читаете полные карты (с большим количеством надгробий на них).Кроме того, настройка TTL на карте применяется для каждого элемента.

Во-вторых, это умножается на >= предикат в вашем запросе select.

Если это так, вам следует изменить свой шаблон доступа к данным, чтобы использовать только отношения EQ в запросе SELECT и bump id чаще.Кроме того, этот шаблон доступа позволит вам избавиться от кластеризации части вашего ПЕРВИЧНОГО КЛЮЧА.

Итак, если вы не производите большого количества удалений на этой карте, вы можете попробовать использовать tag text, time timeuuid, name text, data text смоделируйте и нарежьте его точно по времени.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top