Greenplum: эксплуатация и тюнинг
Эксплуатация GP - вопросы «кластер тормозит, что делать» и «чем VACUUM заслужил отдельную строчку в резюме». Проверяют операционные привычки: гигиена MVCC, изоляция нагрузок, здоровье сегментов.
// Два слова, которые ждут: VACUUM и resource groups.
VACUUM и ANALYZE - гигиена, не опция
MVCC (multiversion concurrency control) копит мёртвые версии строк от UPDATE/DELETE - VACUUM обязателен. Особенно для каталога (pg_catalog): его раздутие тормозит планирование всех запросов кластера, и лечится долго и больно.
ANALYZE после загрузок - топливо оптимизатора; на партиционированных таблицах - по загруженным партициям, плюс root-статистика для ORCA.
// Длинная висящая транзакция (ноутбук аналитика с открытым BEGIN) держит VACUUM: мёртвые строки не убираются, таблицы пухнут. Мониторинг длинных транзакций обязателен.
- bloat
- раздутие таблиц/каталога мёртвыми версиями строк
Resource groups: изоляция нагрузок
Resource groups/queues делят CPU, память и конкурентность между группами пользователей: прод-ETL (extract, transform, load) и ad-hoc аналитики живут в разных группах.
Без изоляции один тяжёлый ad-hoc запрос съедает прод-окно ETL, и наоборот, ночной ETL душит утренние отчёты.
// Практика: отдельные группы под ETL, BI (business intelligence) и аналитиков с лимитами памяти - дешёвая страховка от «кластер лёг, потому что кто-то запустил SELECT *».
- resource groups
- лимиты CPU/памяти/конкурентности по группам
Здоровье сегментов и бэкапы
gpstate - статус сегментов, зеркал, синхронизации. Упавший primary переключается на зеркало; gprecoverseg возвращает избыточность, а gprecoverseg -r ребалансит primary-роли обратно, иначе нагрузка перекошена после аварии.
Заполнение диска одного сегмента - стоп записи всего кластера: место мониторится по-сегментно.
// Зеркала - не бэкап: DROP TABLE отзеркалится честно. Бэкапы - gpbackup/gprestore, параллельные по сегментам, инкрементальные для AO. gpexpand добавляет сегменты с онлайн-редистрибуцией - планируемая операция.
- gprecoverseg
- восстановление упавших сегментов; -r - ребаланс ролей
Как отвечать: «Greenplum-кластер стал медленным. С чего начнёшь разбор?»
С четырёх подозреваемых по частоте. Первый - skew: count по gp_segment_id на горячих таблицах; один перекошенный сегмент держит весь кластер. Второй - bloat и каталог: давно ли ходил VACUUM, нет ли длинных висящих транзакций, которые его блокируют, раздутый pg_catalog тормозит планирование всех запросов. Третий - статистика: свежие загрузки без ANALYZE дают дикие планы с broadcast'ами гигантов. Четвёртый - соседство нагрузок: ad-hoc в одной группе с ETL; смотрю спиллы в gp_workfile_* и очереди resource groups. Плюс gpstate: не живём ли мы на зеркалах после тихой аварии - после failover'а без ребаланса нагрузка перекошена.
Диагностический маршрут по частоте причин с конкретными инструментами на каждый шаг - эксплуатационный опыт в чистом виде.
На чём валят
- −Забросить VACUUM каталога - деградация всего кластера, лечится долго.
- −Аналитики и ETL в одной ресурсной группе - ad-hoc съедает прод-окно.
- −Работать без зеркал «пока тестируем» - первый сбой диска = потеря данных.
- −Считать зеркала бэкапом - DROP TABLE отзеркалится честно.
- −Длинная транзакция ноутбука - VACUUM не убирает ничего, таблицы пухнут.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 13, остальные разбираются в тренажёре.
- Чем resource groups отличаются от resource queues в управлении нагрузкой Greenplum?A)Resource groups и resource queues — полные синонимы одного механизма под разными названиямиB)Resource queues ограничивают CPU через cgroups, а resource groups — число запросов и памятьC)Оба лимитируют конкуренцию/память; groups новее и лимитируют ещё и CPUD)Памятью они не управляют — оба лишь выстраивают приоритет запросов в очереди
показать ответ и разбор
+C)Оба лимитируют конкуренцию/память; groups новее и лимитируют ещё и CPU// разбор: И resource queues, и resource groups решают проблему конкуренции: не дать нескольким тяжёлым запросам разом выесть память/ресурсы и уронить кластер, распределяя лимиты по классам пользователей/нагрузки. Resource queues — исторически первый механизм: лимиты на число одновременных запросов и память. Resource groups — более новый: помимо конкуренции и памяти, ограничивают ещё и CPU (опираясь на cgroups ОС), давая более полный контроль изоляции нагрузок (ETL против ad-hoc аналитики). В современных развёртываниях чаще выбирают resource groups; оба нельзя включить одновременно — выбирают схему.
- Как диагностируют перекос распределения (data skew) таблицы в Greenplum?A)Смотрят загрузку CPU координатора: высокая нагрузка на нём означает перекос данных по сегментамB)Перекос в Greenplum сложно измерить средствами SQL, нужны внешние системы мониторингаC)Считают общее число строк в таблице: чем оно больше, тем сильнее перекос распределения по сегментамD)Count(*) по gp_segment_id; большой разброс = плохой ключ распределения
показать ответ и разбор
+D)Count(*) по gp_segment_id; большой разброс = плохой ключ распределения// разбор: Прямой способ увидеть перекос — распределение строк по сегментам: SELECT gp_segment_id, count(*) FROM t GROUP BY 1 ORDER BY 2 DESC. Если на одном-двух сегментах строк в разы больше, чем на остальных, — это data skew, и запросы по таблице тормозят из-за перегруженного сегмента. Есть и служебные представления gp_toolkit (например, gp_skew_coefficients) для оценки перекоса. Обнаружив skew, меняют ключ распределения на более равномерный (или составной), либо, если равного ключа нет, переходят на DISTRIBUTED RANDOMLY. Проверять перекос стоит после загрузки крупных таблиц.
- Почему в Greenplum массовую загрузку делают через gpfdist/gpload, а не через координатор?A)Параллельная загрузка сегментами мимо координатора вместо одноканальнойB)Gpfdist грузит данные через координатор, но сжимает их, поэтому загрузка идёт быстрее обычнойC)Gpfdist ускоряет загрузку тем, что временно отключает зеркала сегментов на время записи данныхD)Через координатор загрузка параллельна по сегментам, а gpfdist, наоборот, делает её однопоточной
показать ответ и разбор
+A)Параллельная загрузка сегментами мимо координатора вместо одноканальной// разбор: Если грузить данные через координатор (обычные INSERT/COPY к нему), весь поток идёт через один узел — он становится узким местом, а параллелизм сегментов простаивает. gpfdist — файловый сервер, отдающий данные, к которому сегменты подключаются и тянут свои части одновременно; загрузка идёт параллельно на всех сегментах, минуя координатор. Утилита gpload — обёртка над external table + gpfdist с YAML-конфигом. Так достигают высокой пропускной способности загрузки терабайтов, тогда как одноканальный путь через координатор упирается в его сеть и CPU.
- Чем VACUUM append-optimized таблицы отличается от VACUUM обычной heap?A)VACUUM на AO-таблице не нужен, потому что append-optimized хранилище не накапливает мусорB)AO-VACUUM компактирует файлы при доле удалённых выше порога, а не чистит MVCC-версии построчноC)VACUUM AO-таблицы чистит построчные MVCC-версии точно так же и тем же механизмом, что и heapD)VACUUM AO-таблицы физически удаляет её актуальные данные, поэтому его запускать опасно
показать ответ и разбор
+B)AO-VACUUM компактирует файлы при доле удалённых выше порога, а не чистит MVCC-версии построчно// разбор: Heap-таблицы копят мёртвые версии от UPDATE/DELETE, и VACUUM освобождает это место в страницах. У append-optimized другая модель: данные пишутся дописыванием, а UPDATE/DELETE помечают строки логически удалёнными в служебных структурах, физически не убирая их из сегментных файлов. VACUUM по AO-таблице запускает компакцию: если доля логически удалённых строк в файле превысила порог, файл переписывается без них компактно, освобождая место. То есть на AO VACUUM — это про уплотнение после накопленных удалений, а не про построчную чистку MVCC. Ещё один довод не использовать AO под частые точечные правки.
- Почему изменение ключа распределения большой таблицы (ALTER ... SET DISTRIBUTED BY) — тяжёлая операция?A)Операция мгновенная: Greenplum лишь меняет запись в каталоге, физически данные никуда не переезжаютB)Тяжесть в том, что операция пересчитывает статистику ANALYZE по всем столбцам таблицы зановоC)Почти все строки меняют сегмент → физический перелив всей таблицы по сетиD)Смена ключа затрагивает метаданные партиций и на физическое размещение строк не влияет
показать ответ и разбор
+C)Почти все строки меняют сегмент → физический перелив всей таблицы по сети// разбор: Ключ распределения задаёт, на каком сегменте лежит строка. Сменив его, почти для всех строк меняется целевой сегмент, поэтому Greenplum вынужден физически перегнать (перераспределить) всю таблицу между сегментами по interconnect и переписать её заново — для большой таблицы это долгая, ресурсоёмкая операция (сеть, диск, блокировки). Отсюда важность выбрать распределение правильно при проектировании, а не «поправить потом». Если всё же меняют, планируют окно: это сравнимо с полной перезаливкой таблицы. Тот же по духу перелив происходит и при добавлении сегментов в кластер (расширение).
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.