Слишком много надгробий в Кассандре - PullRequest
0 голосов
/ 31 января 2019

У меня есть таблица с именем ' holder ', в которой есть отдельный раздел , в котором за каждый час у нас будет 60K записей,

У меня есть другая таблицас именем ' holderhistory ', в которой в качестве partitionId указана ' date ', поэтому запись каждого дня из таблицы 'holder' будет скопирована в 'holderhistory'

Там будетбыть работой, выполняемой в приложении
i), которая собирает все более старые записи в таблице владельцев и копирует в таблицу истории владельцев
ii) удаляет более старые записи из таблицы владельцев

СЕЙЧАС проблема заключается в том, что -в таблице держателей будет создано слишком много надгробий.

По умолчанию надгробия будут очищены через 10 дней (864000 секунд) gc_grace_seconds

Но я не хочу держать надгробную плиту более 3 часов,

1) Так что хорошо ли установить gc_grace_seconds на 3 часа?
2) Или хорошо установить default_time_to_live на 3 часа?

Какое наилучшее решение для удаления надгробной плиты?

Кроме того, каковы последствия сокращения gc_grace_seconds с 10 дней до 3 часов?где мы будем иметь влияние?

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Чтобы ответить на ваш конкретный случай: поскольку таблица ' holder ' содержит только один раздел, вы можете удалить весь раздел с помощью одного оператора «delete by partition key», эффективно создав единую надгробную плиту.

Если вы удаляете раздел один раз в день, вы получите 1 надгробную плиту в день ... это вполне приемлемо.

1) с gc_grace_seconds равняется 3 часам, а если RF> 1, вам не гарантируется постоянное восстановление после сбоя узла более 3 часов

2) с default_time_to_live равным 3 часам, каждая запись будет удалена путем создания надгробной плиты через 3 часа после вставки

Таким образом, вы можете оставить значение gc_grace_seconds по умолчанию равным 10 дням и позаботиться об удалении ваших ежедневных записей с помощью чего-то вроде DELETE FROM table WHERE PartitionKey = X


РЕДАКТИРОВАТЬ: Отвечая на ваш комментарий о подсказке хэндовера ...

Допустим, RF = 3, gc_grace_second = 3h и узел выходит из строя.Две другие реплики продолжают получать мутации (вставка, обновление, удаление), но они не могут реплицировать их на автономный узел.В этом случае подсказки будут временно храниться на диске, чтобы быть отправленными позже, если мертвый узел вернется.

Но подсказка истекает после gc_grace_seconds, после чего она никогда не будет отправлена.

Теперь, если вы удалите строку, она создаст надгробную плиту в sstables 2 реплик и подсказку в узле координатора.Через 3 часа надгробия удаляются из онлайн-узлов менеджером уплотнения, и подсказка истекает.

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

0 голосов
/ 01 февраля 2019

Вы также можете найти эту статью в блоге поддержки полезной:

https://academy.datastax.com/support-blog/cleaning-tombstones-datastax-dse-and-apache-cassandra

0 голосов
/ 31 января 2019

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

...