Обзор 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.

ВАЖНО
  • ADB to ADB Connector доступен только в Enterprise-версии ADB 6 (начиная с версии 6.25.1.51).

  • ADB to ADB Connector не поддерживает запросы UPDATE и DELETE. При попытке их вызова будет возвращена ошибка: ERROR: adb_fdw. UPDATE and DELETE queries are forbidden.

  • Отправка запросов INSERT в целевой (remote) cluster не является основным режимом работы ADB to ADB Connector и не подходит для массовой вставки данных. Более эффективной стратегией является использование коннектора в режиме SELECT в удаленном кластере с последующим вызовом INSERT на его стороне. В этом случае будет задействовано параллельное получение данных сегментами удаленного кластера напрямую с сегментов локального кластера, а при вставке удаленный кластер самостоятельно перераспределит данные по своим сегментам.

Порядок выполнения запросов

SELECT

Обработка запросов SELECT в ADB to ADB Connector выполняется в следующей последовательности:

  1. Пользователь отправляет запрос SELECT на master-хост локального кластера.

  2. Master-хост локального кластера передает запрос на создание параллельного курсора на master-хост удаленного кластера.

  3. Удаленный master создает endpoints.

  4. В результате вызова функции gp_get_endpoints удаленный master возвращает локальному мастеру служебную информацию по созданным endpoints: количество, IP-адреса и номера портов, а также дополнительные данные, необходимые для аутентификации.

  5. На основании полученной информации о числе endpoints создается равное ему количество обработчиков (Query Executors, QE) на сегментах локального кластера, и запускаются служебные сессии — retreive sessions.

  6. Сегменты локального кластера начинают чтение данных непосредственно с сегментов удаленного кластера.

  7. Сегменты локального кластера передают данные локальному master для передачи результата пользователю.

Схема выполнения запроса SELECT
Схема выполнения запроса SELECT
Схема выполнения запроса SELECT
Схема выполнения запроса SELECT

INSERT

Обработка запросов INSERT в ADB to ADB Connector осуществляется в режиме "master-master", то есть сегменты локального и удаленного кластеров напрямую друг с другом не взаимодействуют. На текущий момент такая схема является единственным вариантом обеспечения транзакционной вставки данных.

Схема выполнения запроса INSERT
Схема выполнения запроса INSERT
Схема выполнения запроса INSERT
Схема выполнения запроса INSERT

Поддержка push-down предикатов

Ввиду ряда ограничений, присутствующих в Greenplum 6, в текущей версии ADB to ADB Connector поддержка push-down предикатов в запросах SELECT (с возможностью обработки на стороне удаленного кластера) реализована не в полной мере. Список доступных предикатов и особенности их обработки отражены в таблице ниже.

Предикат Поддержка push-down Примечание

WHERE

Да, с исключениями

На удаленный кластер передаются только предикаты, оперирующие встроенными типами данных, операторами и функциями. Также используемые в WHERE операторы и функции должны удовлетворять условию IMMUTABLE. Внутренние системные столбцы, за исключением ctid, не передаются на удаленный кластер

LIMIT

Нет

Условие применяется на стороне локального кластера

ORDER BY

Нет

Условие применяется на стороне локального кластера

Любая агрегатная функция

Нет

Удаленный кластер возвращает все строки, которые удовлетворяют условиям в WHERE при их наличии. Далее происходит их локальная обработка в рамках агрегатной функции

Любой тип JOIN

Нет

Удаленный кластер возвращает все строки, которые удовлетворяют условиям в WHERE при их наличии. Далее происходит их локальная обработка в рамках 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');
Преимущества Недостатки
  • Автоматическое определение числа обработчиков. Пользователю не нужно знать это число заранее.

  • Корректная обработка изменения числа сегментов удаленного кластера — без необходимости изменения конфигурации foreign-таблицы.

Создание и открытие параллельного курсора в удаленном кластере на этапе планирования запроса

Использование числа обработчиков, равного числу локальных сегментов

В этой схеме опции 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');
Преимущества Недостатки
  • Отсутствие запроса на создание и открытие параллельного курсора в удаленном кластере на этапе планирования запроса.

  • Плюсом по сравнению с предыдущей схемой является возможность устранения "перекосов" в обработке (processing skew) путем явного сопоставления числа обработчиков количеству сегментов на удаленном кластере.

  • Расчет количества обработчиков необходимо выполнить вручную. Схема работы с автоопределением лишена этого недостатка.

  • Возможность "перекосов" в обработке (processing skew) в обработке запросов полностью не исключена (в случае неверного указания num_segments).

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней