Обзор ADB to ADB Connector
Функции
ADB to ADB Connector — это реализованный на основе foreign data wrapper и параллельных курсоров (parallel retrieve cursor) коннектор, обеспечивающий двустороннюю передачу данных между двумя кластерами ADB. Основные возможности коннектора перечислены ниже:
-
Параллельное получение данных сегментами локального кластера напрямую с сегментов удаленного кластера. Для ряда запросов (например, с использованием агрегатов) допускается установка связи вида "master-master".
-
Транзакционная вставка данных с локального на удаленный кластер в режиме "master-master". ADB to ADB Connector обеспечивает поддержку транзакционности аналогично postgres_fdw в следующем виде:
-
Старт транзакции при открытии соединения.
-
Реализация обработки вложенных транзакций через SAVEPOINT.
-
Обработка отката транзакций.
-
Закрытие параметризованных запросов.
-
-
Возможность автоматического определения количества обработчиков (Query Executor, QE) — см. Возможные схемы работы ниже. Если пользователь не хочет указывать число сегментов в удаленном кластере, он может определить опцию
use_remote_estimate = true
на уровне server или foreign table — для автоматической оценки этого числа на основе запроса (см. Настройка ADB to ADB Connector). При этом изменение числа сегментов в удаленном кластере не влияет на работу ADB to ADB Connector.
ВАЖНО
|
Порядок выполнения запросов
SELECT
Обработка запросов SELECT
в ADB to ADB Connector выполняется в следующей последовательности:
-
Пользователь отправляет запрос
SELECT
на master-хост локального кластера. -
Master-хост локального кластера передает запрос на создание параллельного курсора на master-хост удаленного кластера.
-
Удаленный master создает endpoints.
-
В результате вызова функции
gp_get_endpoints
удаленный master возвращает локальному мастеру служебную информацию по созданным endpoints: количество, IP-адреса и номера портов, а также дополнительные данные, необходимые для аутентификации. -
На основании полученной информации о числе endpoints создается равное ему количество обработчиков (Query Executors, QE) на сегментах локального кластера, и запускаются служебные сессии — retreive sessions.
-
Сегменты локального кластера начинают чтение данных непосредственно с сегментов удаленного кластера.
-
Сегменты локального кластера передают данные локальному master для передачи результата пользователю.
INSERT
Обработка запросов INSERT
в ADB to ADB Connector осуществляется в режиме "master-master", то есть сегменты локального и удаленного кластеров напрямую друг с другом не взаимодействуют. На текущий момент такая схема является единственным вариантом обеспечения транзакционной вставки данных.
Поддержка push-down предикатов
Ввиду ряда ограничений, присутствующих в Greenplum 6, в текущей версии ADB to ADB Connector поддержка push-down предикатов в запросах SELECT
(с возможностью обработки на стороне удаленного кластера) реализована не в полной мере. Список доступных предикатов и особенности их обработки отражены в таблице ниже.
Предикат | Поддержка push-down | Примечание |
---|---|---|
WHERE |
Да, с исключениями |
На удаленный кластер передаются только предикаты, оперирующие встроенными типами данных, операторами и функциями. Также используемые в |
LIMIT |
Нет |
Условие применяется на стороне локального кластера |
ORDER BY |
Нет |
Условие применяется на стороне локального кластера |
Любая агрегатная функция |
Нет |
Удаленный кластер возвращает все строки, которые удовлетворяют условиям в |
Любой тип JOIN |
Нет |
Удаленный кластер возвращает все строки, которые удовлетворяют условиям в |
Возможные схемы работы
ПРИМЕЧАНИЕ
|
Автоматическое определение числа обработчиков
В этой схеме на уровне server или foreign table указывается опция use_remote_estimate = true
. В результате необходимое количество обработчиков определяется автоматически — как равное числу endpoints параллельного курсора.
Пример определения сервера приведен ниже:
CREATE SERVER test_server
FOREIGN DATA WRAPPER adb_fdw
OPTIONS (
host 'bds-mdw-ext',
port '5432',
dbname 'adb',
use_remote_estimate 'true');
Преимущества | Недостатки |
---|---|
|
Создание и открытие параллельного курсора в удаленном кластере на этапе планирования запроса |
Использование числа обработчиков, равного числу локальных сегментов
В этой схеме опции use_remote_estimate
и num_segments
не заполняются. В результате число обработчиков статическое и совпадает с количеством сегментов локального кластера. Если число endpoints для запроса не совпадает с числом локальных сегментов, то осуществляется маппинг на локальные обработчики.
Пример определения сервера приведен ниже:
CREATE SERVER test_server
FOREIGN DATA WRAPPER adb_fdw
OPTIONS (
host 'bds-mdw-ext',
port '5432',
dbname 'adb');
Преимущества | Недостатки |
---|---|
Отсутствие запроса на создание и открытие параллельного курсора в удаленном кластере на этапе планирования запроса |
При большем числе сегментов на удаленном кластере (по сравнению с локальным кластером) обработчики могут брать на себя обработку данных от нескольких endpoints и создавать тем самым "перекос" в обработке (processing skew). Endpoints, попавшие на один Query Executor, будут обрабатываться последовательно, то есть снизится степень параллелизации обработки. |
Явное указание числа обработчиков
В этой схеме опция use_remote_estimate
не указывается (по умолчанию равна false
), однако на уровне сервера заполняется опция num_segments
, определяющая в явном виде число обработчиков. В отличие от предыдущей схемы, можно определить отличное от числа локальных сегментов количество обработчиков — например, равное числу сегметов удаленного кластера. Если число endpoints для запроса не совпадает с числом локальных сегментов, то осуществляется маппинг на локальные обработчики.
Пример определения сервера приведен ниже:
CREATE SERVER test_server
FOREIGN DATA WRAPPER adb_fdw
OPTIONS (
host 'bds-mdw-ext',
port '5432',
dbname 'adb',
num_segments '16');
Преимущества | Недостатки |
---|---|
|
|