MPP-архитектура
Greenplum - стандарт корпоративных DWH (data warehouse) в РФ, и вопросы по нему начинаются с архитектуры: чем MPP отличается от «большого постгреса». Кто переносит OLTP-интуицию - валится сразу.
// Формула: постгресовый синтаксис, распределённое исполнение - интуиция single-node тут врёт.
Мастер и сегменты: shared-nothing
Greenplum - MPP (massively parallel processing) поверх PostgreSQL: мастер держит каталог и строит план, сегменты хранят свои куски данных и обрабатывают их параллельно. Shared-nothing: у каждого сегмента свой диск и память.
Мастер - не хранилище: через него идут план, координация и сборка результата. Таскать гигабайты через мастер - узкое место по определению; загрузка данных - параллельно, мимо него.
// Запрос исполняется слайсами на всех сегментах сразу: скорость кластера равна скорости самого медленного сегмента. Отсюда культ равномерной раскладки.
- shared-nothing
- у сегмента свои диск и память; общего ресурса нет
- слайс
- часть плана, исполняемая на всех сегментах параллельно
Interconnect и отказоустойчивость
Interconnect - сеть между сегментами: перегонки данных (motion) едят её первыми. Кривые джойны убивают именно сеть - общий ресурс кластера.
Отказоустойчивость: standby-мастер и зеркала сегментов. Падение primary-сегмента переключает на зеркало - кластер живёт, но с деградацией до восстановления.
// Зеркала это ещё и ёмкость: их место и I/O считаются при планировании, а не «потом заметим».
- interconnect
- сеть между сегментами; её едят motion'ы
Ниша GP среди соседей
Наследие PostgreSQL: синтаксис, каталог, MVCC (multiversion concurrency control), VACUUM - привычки работают, но исполнение распределённое.
Ниша - классический EDW (enterprise data warehouse): тяжёлые многотабличные джойны и трансформации SQL'ем на терабайтах. Против ClickHouse: GP сильнее в сложных джойнах звёздных схем, CH - в поточной агрегации событий по одной широкой таблице.
// OLTP-паттерны (online transaction processing) - частые мелкие транзакции, точечные апдейты - сюда не переносить: это аналитическая машина.
Как отвечать: «Чем Greenplum отличается от обычного PostgreSQL?»
Синтаксис и каталог те же, а исполнение - MPP: мастер строит план, данные лежат кусками на сегментах shared-nothing, и запрос исполняется на всех параллельно. Отсюда три сдвига интуиции. Раскладка данных - решение уровня схемы: ключ дистрибуции определяет, будут ли джойны локальными. Скорость кластера это скорость самого медленного сегмента, поэтому перекос данных страшнее объёма. И загрузка идёт параллельно на сегменты, мимо мастера - он координатор, а не бутылочное горлышко. OLTP-привычки - мелкие транзакции, точечные апдейты - тут антипаттерн: это машина для тяжёлого аналитического SQL.
Три конкретных сдвига интуиции вместо «это распределённый постгрес» - понимание, а не пересказ маркетинга.
На чём валят
- −Лить данные через мастер (построчный INSERT, \copy на мастере) вместо параллельной загрузки.
- −Мерить производительность по среднему сегменту - хвост держит один перекошенный.
- −Считать GP «большим постгресом» и переносить OLTP-паттерны.
- −Забыть про зеркала при планировании ёмкости.
Проверьте себя
Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.
- Что такое primary- и mirror-сегменты в Greenplum?A)Mirror-сегмент постоянно обслуживает запросы наравне с primary, удваивая пропускную способность чтенияB)Primary и mirror хранят разные части данных, вместе составляя полный набор без дублированияC)Primary хранит и обрабатывает свою часть данных; mirror — его синхронная копия на другом узле для отказоустойчивостиD)Mirror — это резервная копия на ленте, к которой обращаются при полном крахе кластера
показать ответ и разбор
+C)Primary хранит и обрабатывает свою часть данных; mirror — его синхронная копия на другом узле для отказоустойчивости// разбор: Каждый primary-сегмент — это отдельный экземпляр Postgres, хранящий и обрабатывающий свою долю данных. Mirror — его зеркальная копия на другом хосте, синхронно получающая изменения. Если primary падает, кластер переключается на mirror без потери данных, продолжая работу. Так Greenplum переживает отказ узла. Аналогично у координатора есть standby. Размещение зеркал на других хостах критично: иначе падение одной машины унесёт и primary, и mirror.
- Как выполняется один SQL-запрос в Greenplum?A)Координатор выполняет весь запрос сам, последовательно перебирая данные каждого сегмента по очередиB)Запрос целиком выполняется на одном выбранном сегменте, а остальные всё это время простаиваютC)Сегменты не обмениваются данными между собой, джойн идёт на координатореD)Параллельно на всех сегментах + обмен через interconnect + сбор наверх
показать ответ и разбор
+D)Параллельно на всех сегментах + обмен через interconnect + сбор наверх// разбор: Координатор превращает SQL в распределённый план и раздаёт его всем сегментам. Каждый сегмент выполняет свою часть над локальными данными параллельно с остальными. Когда шаг требует данных с других сегментов (джойн/агрегация не по ключу распределения), сегменты обмениваются строками через сеть interconnect (операции motion). В конце строки собираются на координатор (gather) и уходят клиенту. Параллелизм по сегментам — источник производительности, а сетевой обмен между ними — главная статья расходов.
- Что показывает системный столбец gp_segment_id у строки таблицы?A)Номер сегмента, на котором физически лежит строка; по нему диагностируют перекос распределенияB)Порядковый номер строки внутри таблицы, присваиваемый последовательно при каждой вставке данныхC)Идентификатор транзакции, в которой строка была вставлена или последний раз измененаD)Приоритет строки, определяющий, в каком порядке сегменты будут её обрабатывать при запросе
показать ответ и разбор
+A)Номер сегмента, на котором физически лежит строка; по нему диагностируют перекос распределения// разбор: gp_segment_id — скрытый системный столбец, возвращающий номер сегмента, где хранится строка. Он определяется ключом распределения (хеш) или случайно (RANDOMLY). Практическая польза — диагностика перекоса: SELECT gp_segment_id, count(*) FROM t GROUP BY 1 показывает, сколько строк на каждом сегменте; сильный разброс означает плохой ключ распределения (data skew), из-за которого один сегмент перегружен, а запрос идёт со скоростью самого медленного.
- Зачем брать Greenplum вместо одного мощного PostgreSQL?A)Greenplum быстрее PostgreSQL на большинстве задач, включая частые точечные запросы по одной строкеB)Объём/нагрузка сверх одной машины → параллелизм по многим узламC)Greenplum нужен ради поддержки SQL, которого в обычном PostgreSQL якобы нетD)Причина — экономия лицензий, по возможностям он не отличается от одного PostgreSQL
показать ответ и разбор
+B)Объём/нагрузка сверх одной машины → параллелизм по многим узлам// разбор: Один Postgres упирается в ресурсы одной машины: диск, память, одно ядро на запрос по сути. Greenplum распределяет данные и вычисления по десяткам сегментов на многих серверах, обрабатывая терабайты аналитическими сканами и агрегациями параллельно — то, что одному Postgres недоступно. Цена — сложность кластера, сетевой обмен между сегментами и то, что это OLAP-движок (плохо подходит под частые точечные OLTP-операции). Для небольших объёмов обычный Postgres проще и достаточен.
- Почему тяжёлые операции, стягивающие все строки на координатор, — антипаттерн в Greenplum?A)Это, наоборот, самый быстрый способ: координатор мощнее сегментов и обработает всё эффективнее ихB)Никакой проблемы нет: Greenplum автоматически распараллелит и работу на координаторе по сегментамC)Координатор один и не параллелится: собрав всё на него, теряешь MPP и упираешься в ресурсы одного узла (узкое место, риск OOM)D)Проблема лишь в том, что при этом расходуется чуть больше сетевого трафика, на скорость это не влияет
показать ответ и разбор
+C)Координатор один и не параллелится: собрав всё на него, теряешь MPP и упираешься в ресурсы одного узла (узкое место, риск OOM)// разбор: Сила Greenplum — параллельная работа сегментов; координатор лишь координирует и собирает финал. Запросы, которые заставляют стянуть большие объёмы на координатор (огромный gather без предварительной агрегации на сегментах, сортировка/дедуп всего набора наверху, обработка на стороне клиента построчно), обесценивают MPP: вся работа ложится на один узел, который упирается в его память и CPU (риск OOM, длинные очереди). Правильно — максимум фильтрации и агрегации выполнять на сегментах, а наверх поднимать уже сжатый результат.
дальше
Теорию прочитали. Навык ставится повторением
В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, лимит только на количество вопросов в день.