Очистка пространства в почти полном узле Cassandra

У меня есть кластер Cassandra (2 DC) с 6 узлами в каждом и RF 2. 4 узла (в каждом DC) заполняются, поэтому мне нужно очень скоро очистить пространство.

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

i.e

nodetool repair -full foo_keyspace bar_columnfamily

nodetool cleanup foo_keyspace bar_columnfamily

Считаете ли вы, что эта процедура будет безопасной для данных?

Спасибо


person Jibrilat    schedule 11.12.2018    source источник
comment
Я бы предложил разместить на dba.stackexchange.com. Поскольку это не связано с программированием, это не относится к теме переполнения стека.   -  person David Makogon    schedule 12.12.2018
comment
запуск очистки имел бы смысл, если бы вы добавили узел, который выгружал бы данные из ваших существующих узлов. Конечно, это также зависит от того, как вы добавили существующие узлы и выполнили ли вы очистку. Решением в вашей ситуации может быть добавление дисков большего размера, как описано здесь.   -  person Horia    schedule 12.12.2018
comment
Вы можете попытаться удалить старые данные снимка из системы.   -  person Mehul Gupta    schedule 12.12.2018


Ответы (3)


Команды, которые вы представили в своем вопросе, делают несколько неверных предположений. Во-первых, «ремонт» не должен и не будет экономить место. Все, что делает ремонт, — это находит несоответствия между разными репликами и исправляет их. Он либо ничего не сделает (если нет несоответствий), либо добавит данные, а не удалит данные. Во-вторых, «очистка» — это то, что вам нужно сделать после добавления новых узлов в кластер — после того, как каждый узел отправил часть своих данных на новый узел, «очистка» удаляет данные со старых узлов. Но очистка не актуальна, если не добавлен узел.

Возможно, вам нужна команда «compact». Это может сэкономить место, но только если вы знаете, что у вас было много перезаписей (перезаписи существующих строк), удалений или истечения срока действия данных (TTL). Какую стратегию уплотнения вы используете? Если это стандартная стратегия многоуровневого сжатия (STCS), вы можете начать крупное уплотнение (nodetool compact), но должны знать о большом риске:

Основное сжатие объединяет все данные в один sstable (формат файла Cassandra на диске), удаляя удаленные, просроченные или перезаписанные данные. Однако во время этого процесса сжатия у вас есть и входные, и выходные файлы, и в худшем случае это может удвоить использование вашего диска и может привести к сбою, если диск заполнен более чем на 50%. Вот почему во многих практических руководствах Cassandra рекомендуется никогда не заполнять более 50% диска. Но это только худший случай. Вы можете обойтись меньшим количеством свободного места, если знаете, что выходной файл будет намного меньше входного (поскольку большая часть данных была удалена). Возможно, более полезно, если у вас много отдельных таблиц (семейство столбцов), вы можете сжимать каждую отдельно (как вы предложили, от меньшего к большему), и максимальный объем дискового пространства, необходимый временно во время сжатия, может быть намного меньше 50% диска.

Scylla, повторная реализация Cassandra на C++, разрабатывает нечто, известное как «гибридное уплотнение» (см. производительность путем выбора неправильной стратегии уплотнения" rel="noreferrer">https://www.slideshare.net/ScyllaDB/scylla-summit-2017-how-to-ruin-your-performance-by- выбор неправильной стратегии сжатия), который похож на многоуровневое сжатие Cassandra, но сжатие выполняется небольшими частями вместо создания одного огромного файла, чтобы избежать огромного временного использования диска во время сжатия. К сожалению, в Cassandra пока нет этой функции.

person Nadav Har'El    schedule 12.12.2018
comment
Привет ню, спасибо за ваш ответ. Я выполняю восстановление перед очисткой, чтобы исправить несоответствия данных и снизить риск потери данных при выполнении очистки. Есть много статей, в которых люди жалуются на потерю данных после выполнения очистки. В моем случае, к сожалению, у меня есть 90% заполненных 3 узлов каждого контроллера домена, поэтому мне отчаянно нужен способ получить свободное место. - person Jibrilat; 12.12.2018

Хорошая идея - сначала начать восстановление наименьшей таблицы с наименьшим пространством ключей один за другим и завершить восстановление. Это займет время, но более безопасный способ, без шансов зависания и потери трафика. После завершения ремонта начните очистку так же, как ремонт. Таким образом, это не повлияет на узел и кластер.

person LetsNoSQL    schedule 13.12.2018

Вы не должны заполнять более 50-60% ваших дисков, чтобы освободить место для уплотнения. Если вы превышаете этот объем использования диска, вам необходимо рассмотреть возможность приобретения дисков большего размера или добавления дополнительных узлов.

Обычно полезно следовать рекомендациям Datastax: https://docs.datastax.com/en/dse-planning/doc/planning/planPlanningDiskCapacity.html

person Simon Fontana Oscarsson    schedule 12.12.2018