Живое наблюдение за запросами в распределённых СУБД

Живое наблюдение за запросами в распределённых СУБД

 

Разработчики распределённых аналитических баз часто сталкиваются с ситуацией, когда тяжёлый запрос внезапно зависает. План EXPLAIN показывает структуру, но не даёт ответа, на каком этапе сейчас находится выполнение и что именно тормозит: перекос данных, spill на диск или ожидание сети. В результате приходится перезапускать запрос вслепую. Новый подход позволяет получать актуальную статистику по каждому узлу плана прямо во время работы, без ожидания завершения. Это особенно важно при работе с кластерами из десятков и сотен сегментов, где даже небольшое отклонение в распределении нагрузки способно увеличить время выполнения в разы. Инженер получает возможность увидеть реальное потребление ресурсов на каждом этапе и принять решение о доработке запроса или изменении схемы данных до того, как проблема станет критической.

Решение построено вокруг расширения pg_query_state для Apache Cloudberry. Оно периодически опрашивает активные процессы на сегментах и собирает метрики по каждому оператору. Данные обновляются в реальном времени, поэтому инженер видит, какой слайс и какой сегмент сейчас потребляет больше всего ресурсов. Такой подход даёт преимущество перед традиционными методами диагностики, поскольку позволяет выявить узкие места именно в момент их возникновения, а не после завершения запроса.

 

Как устроена работа запроса по сегментам

Cloudberry разделяет кластер на координатор и независимые сегменты. Координатор строит план и рассылает его, а каждый сегмент выполняет свою часть на локальных данных. План разбивается на слайсы — логические блоки, ограниченные точками обмена данными через Motion-узлы. Внутри слайса сегменты работают параллельно и не зависят друг от друга. Motion-узлы отвечают за пересылку промежуточных результатов между сегментами, и именно на этих точках часто возникают задержки при неравномерном распределении данных.

Когда запрос выполняется, на каждом сегменте создаётся отдельный процесс Query Executor. Именно эти процессы и нужно опрашивать, чтобы понять текущий прогресс. Координатор хранит список активных пар (segid, pid), но сам не может напрямую читать статистику с удалённых хостов. Обычный сигнал прерывания здесь не работает, потому что процессы находятся на разных машинах. Пришлось использовать механизм диспетчеризации: координатор возвращает список процессов, затем на сегменты отправляется специальный запрос, который локально рассылает сигналы нужным бэкендам. Так удаётся получить доступ к состоянию без изменения ядра СУБД. Для команд, выбирающих инструмент мониторинга, важно понимать, что такой механизм минимизирует вмешательство в работу основной СУБД, но требует наличия прав на отправку сигналов между компонентами кластера.

 

Почему сбор метрик вынесли в отдельный сервис

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

В российских командах, где часто используют Greenplum или его форки вместе с ClickHouse, такая схема особенно полезна. Многие уже сталкиваются с необходимостью отлаживать запросы на кластерах из десятков хостов без доступа к облачным инструментам. Возможность встроить live-мониторинг через расширение и отдельный сервис позволяет быстрее находить перекосы и узкие места, не меняя привычный стек. При выборе решения стоит учитывать, что вынос сбора метрик за пределы координатора снижает риск деградации производительности самого кластера, но требует дополнительной инфраструктуры для сервиса YAGPCC.

 

Что даёт практика применения

Инженер получает дерево плана с актуальными значениями строк, времени и объёма spill по каждому узлу. Spill возникает, когда оператору не хватает оперативной памяти и данные временно записываются на диск, что резко снижает скорость. Это позволяет сразу понять, какой сегмент отстаёт, и принять решение: переписать запрос, изменить распределение или добавить индекс. Постфактум через EXPLAIN ANALYZE такой детализации уже не получить. Инструмент полезен при регулярной работе с тяжёлыми аналитическими запросами, где важно быстро выявлять причины перекоса данных или неравномерной загрузки сети.

Ограничения тоже есть. Расширение требует прав на отправку сигналов и работает только внутри одного кластера Cloudberry. При очень высокой частоте опроса появляется дополнительная нагрузка на CPU сегментов. Поэтому частоту сбора приходится подбирать под конкретную нагрузку. Для команд, оценивающих целесообразность внедрения, важно взвесить эти ограничения против выгоды от оперативной диагностики: инструмент даёт заметный эффект на кластерах среднего и крупного размера, но на небольших установках overhead может оказаться избыточным.

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

 

Источник

Это краткий разбор материала Habr. Полная версия с примерами кода, схемами и деталями реализации — в оригинале: Живое наблюдение за запросами в распределённых СУБД.

Курс по теме — Построение DWH на ClickHouse

 

Построение DWH на ClickHouse

Код курса
CLICH
Ближайшая дата курса
12 октября, 2026
Продолжительность
24 ак.часов
Стоимость обучения
76 800