Очистка пространства в почти полном Cassandra Node
У меня есть кластер Cassandra (2 DC) с 6 узлами каждый и RF 2. 4 узла (в каждом DC) заполнены, поэтому мне нужно очень скоро очистить пространство.
Я пытался провести полный ремонт, но в итоге это было плохой идеей, так как космический старт увеличился еще больше, и ремонт в итоге завис. В качестве последнего решения я думаю начать ремонт, а затем очистить определенные столбцы, начиная с самых маленьких до самых больших.
т.е.
nodetool repair -full foo_keyspace bar_columnfamily
nodetool cleanup foo_keyspace bar_columnfamily
Считаете ли вы, что эта процедура будет безопасной для данных?
Спасибо
3 ответа
Команды, которые вы представили в своем вопросе, делают несколько неверных предположений. Во-первых, "ремонт" не должен и не будет экономить место. Все, что нужно сделать, - это найти несоответствия между разными репликами и исправить их. Он либо ничего не сделает (если нет несоответствий), либо добавит данные, но не удалит данные. Во-вторых, "очистка" - это то, что вам нужно сделать после добавления новых узлов в кластер - после того, как каждый узел отправил часть своих данных на новый узел, "очистка" удаляет данные из старых узлов. Но очистка не актуальна, когда не добавляется узел.
Команда, которую вы можете искать, является "компактной". Это может сэкономить место, но только если вы знаете, что у вас было много перезаписей (перезапись существующих строк), удалений или истечения срока действия данных (TTL). Какую стратегию уплотнения вы используете? Если это стандартная, многоуровневая стратегия сжатия (STCS), вы можете начать основное сжатие (nodetool compact), но следует помнить о большом риске:
Основное уплотнение объединяет все данные в один sstable (формат файла Cassandra на диске), удаляя удаленные, просроченные или перезаписанные данные. Однако во время этого процесса сжатия у вас есть как входные, так и выходные файлы, и в худшем случае это может удвоить использование вашего диска и может привести к сбою, если диск заполнен более чем на 50%. Вот почему во многих руководствах Cassandra по рекомендациям никогда не следует заполнять более 50% диска. Но это только худший случай. Вы можете получить меньше свободного места, если знаете, что выходной файл будет намного меньше входного (поскольку большая часть данных была удалена). Возможно, более полезно, если у вас много отдельных таблиц (семейство столбцов), вы можете сжать каждую из них отдельно (как вы предложили, от самой маленькой до самой большой), и максимальный объем дискового пространства, требуемого временно во время сжатия, может быть намного меньше, чем 50%. диска.
Scylla, C++ повторная реализация Cassandra, разрабатывает нечто, известное как "гибридное уплотнение" (см. https://www.slideshare.net/ScyllaDB/scylla-summit-2017-how-to-ruin-your-performance-by-choosing-the-wrong-compaction-strategy), которая похожа на многоуровневое сжатие Cassandra, но выполняет сжатие небольшими частями вместо создания одного огромного файла, чтобы избежать огромного использования временного диска во время сжатия. К сожалению, у Кассандры пока нет этой функции.
Хорошая идея - сначала начать ремонт наименьшей таблицы на наименьшем пространстве ключей один за другим и завершить ремонт. Это займет время, но более безопасный путь и никаких шансов повесить и потерю трафика. После завершения ремонта начните очистку так же, как и ремонт. Этот способ также не влияет на узел и кластер.
Вы не должны заполнять более 50-60 % ваших дисков, чтобы освободить место для уплотнения. Если вы используете больше дискового пространства, вам нужно подумать о том, чтобы получить больше дисков или добавить больше узлов.
Рекомендации Datastax обычно хороши для выполнения: https://docs.datastax.com/en/dse-planning/doc/planning/planPlanningDiskCapacity.html