GreenPlum
Это масштабируемая MPP (Massively Parallel Processing) субд, созданная на базе postgres.
Предназначена для работы с большими объемами данных и выполнения сложных запросов. Направлена на OLAP-системы.
Короче простыми словами GreenPlum (Зеленая Слива) - это та же субд, в которую всунули возможность параллельной обработки, за счет чего данную субд удобно использовать для работы с большими данными.
Сравнение с другими системами
Традиционные субд (postgres, oracle): хороши для мелких транзакций в oltp системах, с небольшими объемами данных и без горизонтального масштабирования.
Hadoop: хорош для работы с большими сырыми данными, есть возможность работать с sql, но это не всегда наибольшая производительность.
GreenPlum: включает в себя плюсы параллельной обработки и возможность работы с sql.
Архитектура и компоненты greenplum
1) Master - главный узел. Хранит системные таблицы, принимает и планирует запросы.
2) Segment - рабочие узлы системы. По сути каждый сегмент - это отдельный postgres в кластере.
3) Interconnect - связь между узлами.
4) Standby Master - запасной мастер
Плюсы GreenPlum
1) Горизонтальная масштабируемость
2) Быстрые запросы при больших объемах данных
3) Возможности для сложной статистики
Возможности использования
1) DWH
2) BI-отчеты
3) Машинное обучение на SQL
4) Аналитика логов, транзакций
За счет чего предоставляется масштабируемость и отказоустойчивость
1) Добавление новых сегментов дает возможность масштабировать систему горизонтально
2) Мирроринг сегментов и StandBy Master предоставляют отказоустойчивость
Как происходит распределение данных
Оно происходит за счет Distribution Key. Это ключ (колонка) по значениям которого данные будут разбиваться по сегментам.
Важно:
Правильно подобранный ключ обеспечивает равномерную нагрузку
Если подобрать ключ неправильно - это возникновение перекосов - это проблемы и снижение производительности .
Безопасность GreenPlum
1) Управление правами такое же, что и у Postgres
2) Имеет встроенное шифрование данных и аудит
Оптимизация greenplum запросов
1) Минимизировать пересылку данных между узлами
2) Использовать правильный Distributed Key
3) Фильтровать данные как можно раньше
4) Использовать индексы
5) Выбирать только необходимые данные
6) Использовать партицирование
7) Проверять запросы с помощью Explain Analyze
8) Тюнить значения оптимизатора
9) Горизонтально масштабировать систему
Типы таблиц в greenplum
1) Persistent (постоянные) - хранятся на всех узлах кластера, логируются.
2) Temporary (временные) - живут только пока жива сессия, создаются только на узле, на котором работаем. Предназначены для быстрых временных расчетов.
3) Unlogged - таблицы с некритичными данными, не логируются из-за чего работают быстрее, но могут быть ненадежными.
4) External table - внешние таблицы, данные хранятся в другом месте, но мы можем к ними обращаться и работать с ними.
Row-oriented vs Column-oriented таблицы
Это способы хранения данных.
Row-oriented - таблицы направленные на OLTP системы. Работа с единичными строками, частое изменения.
Column-oriented - таблицы направленные на OLAP системы. Большие объемы данных, аналитика, запросы на чтение. Скорость изменения низкая.
Изменение типа хранения или распределения
Это делается при помощи:
ALTER TABLE t1 SET DISTRIBUTED BY (id);
ALTER TABLE t1 SET (orientation=column)
Но следует понимать, что это очень ресурсозатратные операции, лучше всего устанавливать правильные параметры при создании.
Партиционирование (что это, типы и пример)
Возможность разбить данные на логические части. Можно выбирать только необходимые данные, легко масштабировать и удалять. Увеличивает производительность запросов.
Типы:
RANGE — по диапазону (например, по дате),
LIST — по значению,
HASH — по хэш-функции.
CREATE TABLE t1(
id int,
dat date
)
DISTRIBUTED BY (id)
PARTITION BY RANGE(dat)(
START(‘2024-01-O1’) END (‘2025-01-01’) EVERY (1 MONTH)
);
Наследование
Возможность создавать таблицы потомки наследующих родительскую структуру.
На практике чаще используется партицирование по причине эффективности.
Транзакции в greenplum
Как и обычный postgres greenplum поддерживает транзакционность. Для того чтобы она работала в условиях распределенности существует двухфазовый коммит, который гарантирует согласованность данных между сегментами.
Две фазы:
Prepare
Commit
Если один из сегментов на любой из фаз вернет fail, то commit выполнен не будет
Взаимодействие индексов с распределением
Индексы находятся вместе с данными на сегментами, но они не спасут, если подобрать distributed key неправильно, что приведет к увеличению пересылки данных по сети, так как именно она забирает больше всего производительности.
Способы распределения в greenplum
1) Distributed by (key) - распределение по указанному ключу, для таблиц, которые часто join-ятся лучше выбирать один и тот же ключ.
2) Distributed randomly - распределение по рандомному ключу
3) Replicated - распределение для маленьких таблиц, которые часто часто join’ятся
Motion
Пересылка данных между узлами, которая возникает при объединении данных, например join. Чем больше таких пересылок, тем меньше производительность.
!!!
Чтение: строка не блокируется для чтения другим
Запись: строка блокируется для других до конца операции
Взаимоблокировки (причины и решения)
Это ситуация, когда две транзакции держит ресурсы, которые нужны другой и наоборот.
Причины: длинные транзакции, неправильный порядок обновления таблицы
Решение: использовать короткие транзакции, не изменять порядок обновления таблицы
Уровни изоляция транзакций
1) Repeatable read - возможность повторного чтения закоммиченных данных (быстро, но могут возникнуть проблемы)
2) Read committed - чтение только закомиченных данных (дефолтная изоляция, баланс между скоростью и надежностью)
3) Serializable - максимальная защита, минимальная производительность. Изолирует так, словно операции были одна за одной.
MVCC
Multiversion Concurrency Control - это технология, которая позволяет избегать блокировок в транзакциях за счет манипулирования версиями данных. Для каждой отдельной транзакции, создается отдельная версия данных, что гарантирует высокую производительность и исключает блокировки.
Мониторинг блокировок
Следить за pg_locks и pg_stat_activity (системные таблички)
Инструменты GreenPlum (pxf, gpbackup, gprestore, gptranfer)
1) PXF (Platform Extension Fraemwork) - позволяет интегрировать greenplum c kafka, hdfs с внешними источниками. Не нужно копировать данные, но производительность может зависеть от передачи данных. Основные коннекторы: hdfs, s3, jdbc (java database connectivity)
2) gpbackup, gprestore - компонент отвечающий за резервное копирование, а gprestore за востановление
3) gptransfer - компонент отвечающий за перемещение данных между кластерами.
Работает через параллельное подключение, что увеличивает производительность. Требует одинаковой архитектуры кластеров.