Вакуумируй это: сбор и удаление мусора в базе данных Greenplum

988a46dc1688bb9f3ca157442384ff22.png

Всем привет! ITSumma на связи! Недавно — 8 февраля мы провели вебинар о мониторинге и обслуживании реляционной базы данных Greenplum. 

При всех своих достоинствах у Greenplum есть подводные камни, о которых стоит знать разработчикам и администраторам. Один из таких потенциально опасных моментов — процедура сбора и удаления мусора, её ещё называют вакуумирование, потому что она инициируется командой Vacuum. Работать с вакуумированием нужно деликатно, иначе велик риск надолго нарушить работу всей системы. Как раз о том, как этого избежать, правильно мониторить и очищать таблицы, мы и рассказывали на вебинаре.

Это статья — выжимка нашего мероприятия. Вот что вы из неё узнаете:

  • Что такое табличные пространства, вакуумирование и для чего последнее нужно;

  • Инструменты и специфику вакуумирования в Greenplum;

  • Как проводить мониторинг «раздутых» таблиц и какие могут быть стратегии вакуумирования;

  • Решения и практики для того, чтобы минимизировать возможные проблемы с вакуумированием и «раздутыми» таблицами.

Приятного чтения!

Архитектура хранения данных в Greenplum

Для начала кратко рассмотрим, как устроено хранение и обработка данных внутри Greenplum. Это важно для понимания дальнейшего.

Таблицы и индексы физически размещаются в сегментах БД — это такие отдельные узлы или ноды, которые содержат часть данных и выполняют запросы параллельно друг другу. 

Каждая таблица или индекс занимает табличное пространство, которое внутри делится на блоки фиксированного размера (по умолчанию 8 Кб). Блок содержит одну или несколько записей в зависимости от их размера.

При добавлении данных новые заполненные блоки просто дописываются в конец табличного пространства, оно постепенно разрастается. Это нормальный процесс.

Однако при изменении или удалении записей происходит следующее:

1. Блок с изменяемой записью помечается как недействительный

2. Создается новый блок с измененной версией записи 

3. Новый блок дописывается в конец табличного пространства

Получается, что старый блок остается занимать место, которое уже не используется. Таким образом таблица постепенно «раздувается», наполняясь неактуальными данными. Это явление называется блоатинг (bloat).

При очень интенсивном обновлении блоатинг может привести к многократному увеличению размера таблицы по сравнению с реальным объемом данных в ней. Это чревато быстрым заполнением диска, снижением скорости доступа и в конечном счете падением производительности всей СУБД.

Что такое вакуумирование и зачем оно нужно

Вакуумирование предназначено как раз для борьбы с описанным выше блоатингом табличных пространств. Это процедура очистки и сборки мусора.

В ходе вакуумирования Greenplum помечает недействительные блоки как свободное пространство. При полном вакуумировании (VACUUM FULL) перемещает актуальные данные, собирая их в начале и обрезает конец табличного пространства, избавляясь от мусора и 

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

Вакуумирование бывает двух типов:

  • VACUUM — более легкая операция, только помечает блоки для очистки

  • VACUUM FULL — полностью перестраивает табличное пространство, жестко уплотняя данные.

Регулярное вакуумирование критически важно для поддержания работоспособности СУБД и эффективности использования дисковых ресурсов. В тоже время, это довольно сложная операция, чреватая потерей данных и простоями. Давайте разберем подробнее, какие здесь могут возникать опасности и сложности.

Риски и вызовы при вакуумировании в Greenplum

Главная потенциальная угроза от вакуумирования — эскалация и блокировка доступа к таблицам, а в худшем случае — отказ всего кластера Greenplum. Рассмотрим, как это происходит.

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

Если до этого какой-то пользователь БД оставил открытой транзакцию чтения, то на текущую блокировку таблицы от Vacuum наложится совместная (shared) блокировка от команды, Select. Именно эта команда запускает процедуру чтения таблицы. В результате произойдет эскалация блокировок: Select будет блокировать как Vacuum, так и всех, кто попытается работать с этой таблицей.

Таким образом одна забытая открытая транзакция может заблокировать работу всего приложения с БД. А если блокируется какая-то системная таблица, используемая всеми операциями — то возникает полный стопор всего Greenplum. Это происходит потому что случается сбой и аварийное завершение работы кластера преследующем чекпоинте. После перезапуска потребуется долго восстанавливать данные из резервных копий.

Как видите, все очень неприятно. Поэтому вакуумирование требует особо осторожного подхода с учетом архитектуры и работы Greenplum.

Как спланировать стратегию безопасного вакуумирования

Итак, вакуумирование необходимо регулярно проводить для всех активно обновляемых таблиц. Делать это нужно максимально аккуратно, чтобы избежать блокировок и сбоев БД.

Оптимальная стратегия вакуумирования Greenplum включает в себя следующие пункты:

1. Адаптивная периодичность.

Для каждой конкретной таблицы частота вакуумирования должна задаваться отдельно, в зависимости от интенсивности изменения данных в ней. От случая к случаю нужно анализировать статистику и при необходимости корректировать график очистки.

2. Вакуумирование по отдельным таблицам.

Рекомендуется явно указывать таблицы для сбора и очистки мусора, а не применять операцию сразу ко всей БД. Это позволяет минимизировать вероятность блокировки критически важных системных таблиц.

3. Ограничение длительности.

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

4. Мониторинг активных соединений.

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

5. Выделение ресурсов.

Для более эффективного вакуумирования следует явно выделить достаточный объем памяти (не меньше 1 Гб) на специальный параметр maintenance_work_mem. Реализация такой стратегии позволит проводить регулярное вакуумирование для поддержания работоспособности СУБД, минимизируя риски блокировок и сбоев.

Best practices: правила безопасного вакуумирования

Давайте теперь сформулируем основные правила (best practices) по технике безопасности при работе с вакуумом в Greenplum:

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

2. Держите транзакции максимально компактными. Если не получается — разбивайте долгие цепочки операций на более короткие куски.

3. Не задействуйте уровни изоляции транзакций ниже Read Committed — они потенциально опасны при вакууме.

4. Каждому приложению — отдельная схема данных. Так проще отслеживать «свои» таблицы.

5. Запускайте VACUUM только в изолированной транзакции, отдельном соединении. Никаких других операций вместе с ним.

6. Периодически анализируйте статистику и при необходимости увеличивайте частоту вакуумирования для конкретных таблиц. 

7. Выделяйте минимум 1 Гб оперативной памяти под maintenance_work_mem.

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

9. Не допускайте чрезмерного «раздувания» табличных пространств. Как только обнаружили — сразу вакуумируйте.

Выполнение этих правил — залог стабильной и безопасной работы как отдельных приложений, так и Greenplum в целом. Следуйте рекомендациям и избегайте опасностей, связанных с вакуумированием.

Кратко ключевые моменты

  • Вакуумирование (Vacuum) — это важная процедура очистки и сборки мусора при работе с табличными пространствами в Greenplum. Без нее быстро возникает фрагментация и падает скорость работы.

  • Однако неправильное вакуумирование может привести к масштабным блокировкам, отказу всей СУБД и потере данных.

  • Безопасная работа с процедурой Vacuum подразумевает грамотную стратегию с учетом архитектуры Greenplum, адаптивной периодичности, ограничения длительности операций и тщательного мониторинга текущего состояния БД.

  • Рассмотренные в статье правила и рекомендации помогут минимизировать риски и осуществлять эффективное вакуумирование в Greenplum.

Глубже погрузится в тему поможет запись вебинара «Управление базами данных в Greenplum: сбор и удаление мусора», которую мы выложим на следующей неделе в наш ТГ-канал. Подписывайтесь, чтобы не пропустить!

© Habrahabr.ru