Интерконнекты Greenplum и как их ускорить

Greenplum архитектура интерконнекты, Greenplum примеры курсы обучение, администрирование Greenplum

Как сегменты Greenplum взаимодействуют друг с другом для выполнения распределенных SQL-запросов, чем UDPIFC-режим интерконнекта лучше TCP-протокола, зачем проксировать межсетевые соединения и какими командами это сделать.

Что такое интерконнекты в Greenplum

Greenplum представляет собой массив отдельных баз данных PostgreSQL 12, работающих вместе для представления единого образа базы данных. Точкой входа в Greenplum является координатор – экземпляр базы данных, к которому подключаются клиенты, отправляя SQL-запросы. Координатор координирует свою работу с сегментами – другими экземплярами PostgreSQL, которые хранят и обрабатывают данные. Сегменты взаимодействуют друг с другом по межсетевым соединениям, называемым интерконнектами. Интерконнект обеспечивает межпроцессное взаимодействие между сегментами и сетевой инфраструктурой, на которой оно основано. При этом используется стандартная коммутационная матрица Ethernet. Для высокой производительности рекомендуется 10-гигабитная система или выше.

По умолчанию интерконнект использует протокол пользовательских датаграмм с управлением потоком (UDPIFC, User Datagram Protocol with flow control) для трафика соединения для отправки сообщений по сети. Помимо того, что обеспечивает протокол UDP, Greenplum также выполняет проверку пакетов. Это означает, что надежность эквивалентна TCP-протоколу, а производительность и масштабируемость превосходят его. Если вместо UDPIFC используется TCP, Greenplum имеет предел масштабируемости в 1000 экземпляров сегментов. С UDPIFC в качестве протокола по умолчанию для соединения это ограничение отсутствует.

Высокодоступное соединение может быть достигнуто путем развертывания в сети двух коммутаторов 10 Gigabit Ethernet и резервных 10-гигабитных подключений к координатору Greenplum и серверам узлов сегмента. Хост сегмента Greenplum обычно имеет несколько сетевых интерфейсов, предназначенных для трафика интерконнектов. Хост координатора обычно имеет дополнительные внешние сетевые интерфейсы в дополнение к интерфейсам, используемым для трафика интерконнектов.

В зависимости от количества доступных интерфейсов нужно будет распределить сетевой трафик интерконнектов по количеству доступных интерфейсов. Это делается путем назначения экземпляров сегмента определенному сетевому интерфейсу и обеспечения равномерного распределения основных сегментов по количеству доступных интерфейсов. Для этого нужно создать отдельные адреса хостов для каждого сетевого интерфейса. Например, если хост имеет четыре сетевых интерфейса, то у него будет четыре соответствующих адреса хостов, каждый из которых сопоставляется с одним или несколькими экземплярами первичного сегмента. Надо так настроить файл /etc/hosts, чтобы в нем было не только имя хоста каждой машины, но и все адреса хостов интерфейсов для всех хостов Greenplum (координатор, резервный координатор, сегменты и хосты ETL для загрузки данных). При такой конфигурации операционная система автоматически выбирает наилучший путь к месту назначения. Для максимального параллелизма MPP-система Greenplum автоматически балансирует сетевые пункты назначения.

Интерконнекты Greenplum
Взаимодействие мастер-хоста с сегментами Greenplum

При использовании нескольких 10-гигабайтных коммутаторов Ethernet в массиве Greenplum надо разделить количество подсетей равномерно между ними. Например, если есть два коммутатора, сетевые карты 1 и 2 на каждом хосте использовали бы коммутатор 1, а сетевые карты 3 и 4 на каждом хосте использовали бы коммутатор 2. Для хоста-координатора имя хоста, привязанное к сетевому адаптеру 1 и использующее коммутатор 1, является эффективным именем хоста-координатора для массива. Поэтому, если развертывается координатор теплого резерва для обеспечения надежности за счет избыточности, он должен сопоставляться с сетевой картой, которая использует коммутатор, отличный от основного координатора.

Настройка коммутаторов в массиве Greenplum
Настройка коммутаторов в массиве Greenplum

Как ускорить интерконнекты через проксирование

Чтобы сократить использование соединений и портов во время обработки запросов, можно настроить Greenplum на использование прокси-серверов для межсетевого взаимодействия. В общем случае при выполнении запроса диспетчер запросов на координаторе Greenplum создает соединения с одним или несколькими процессами исполнителями запросов на сегментах, а любой исполнитель запроса может создавать соединения с другими исполнителями.

По умолчанию соединения между диспетчером запросов на координаторе и исполнителями запросов на экземплярах сегмента и между ними требуют отдельного сетевого порта. Можно настроить Greenplum на использование прокси-соединения, когда диспетчер и исполнители запросов взаимодействуют между собой на разных экземплярах сегмента. Прокси-соединения требуют только одного сетевого соединения для внутренней связи Greenplum между двумя экземплярами сегмента. Так потребляется меньше соединений и портов, чем в TCP-режиме, и производительность становится выше обычного UDPIFC-режима в сети с высокой задержкой.

Проксирование интерконнектов Greenplum
Проксирование интерконнектов Greenplum

Скрипт PlantUML для этой диаграммы:

@startuml
title "Проксирование интерконнектов Greenplum"

cloud "кластер Greenplum" {
node "Координатор" as M {
  [Диспетчер запросов] as QD
}

node "Сегмент 1" as S1 {
  [Исполнитель запросов 1] as QE1
}

node "Сегмент 2" as S2 {
  [Исполнитель запросов 2] as QE2
}

node "Прокси-сервер" {
  [Прокси-соединение] as P
}

}

cloud "Клиентские приложения" as clients {
    [Client 1] as C1
    [Client 2] as C2
}

C1 --> QD : postgres или psql
C2 --> QD: JDBC или ODBC

QD --> P : интерконнект
P--> QE1 : интерконнект
P --> QE2 : интерконнект

@enduml

Чтобы включить прокси-серверы интерконнектов Greenplum, надо задать следующие параметры конфигурации системы:

  • перечислить прокси-порты в параметре gp_interconnect_proxy_addresses, указав прокси-порт для координатора, резервного координатора и всех экземпляров сегмента;
  • установить параметр gp_interconnect_type равным proxy.

При расширении Greenplum необходимо деактивировать прокси-серверы интерконнектов перед добавлением новых хостов и экземпляров сегментов. Также следует обновить параметр gp_interconnect_proxy_addresses с учетом добавленных экземпляров сегментов перед повторным включением прокси-серверов интерконнектов.

Рассмотрим пример настройки Greenplum для проксирования интерконнектов при выполнении запросов. Установим параметр gp_interconnect_proxy_addresses, чтобы указать порты прокси для экземпляров координатора и сегмента, как строку в одинарных кавычках.

<db_id>:<cont_id>:<seg_address>:<port>[, ... ]

Для координатора, резервного координатора и экземпляра сегмента первые три поля (db_id, cont_id и seg_address — IP-адрес или имя хоста, соответствующее столбцу address в таблице каталога), можно найти в таблице каталога gp_segment_configuration. Четвертое поле, port – прокси-порт TCP/IP для прокси-сервера координатора Greenplum или экземпляра сегмента. Если имя хоста экземпляра сегмента привязано к другому IP-адресу во время выполнения, необходимо выполнить команду gpstop –u для повторной загрузки значения gp_interconnect_proxy_addresses. Эта команда перезагружает конфигурационный файл postgresql.conf, не останавливая и не перезапуская Greenplum.

Чтобы отобразить или задать значения порта прокси-сервера экземпляра сегмента для параметра gp_interconnect_proxy_addresses, напишем функцию на PL/Python, сперва добавив расширение plpython3u с помощью команды CREATE EXTENSION plpython3u. Код PL/Python-функции выглядит так:

create or replace function my_setup_ic_proxy(delta int, action text)
returns table(dbid smallint, content smallint, address text, port int) as $$
    import os
    import socket

    results = []
    value = ''

    segs = plpy.execute('''SELECT dbid, content, port, address
                              FROM gp_segment_configuration
                            ORDER BY 1''')
    for seg in segs:
        dbid = seg['dbid']
        content = seg['content']
        port = seg['port']
        address = seg['address']

        # decide the proxy port
        port = port + delta

        # append to the result list
        results.append((dbid, content, address, port))

        # build the value for the GUC
        if value:
            value += ','
        value += '{}:{}:{}:{}'.format(dbid, content, address, port)

    if action.lower() == 'update proxy':
        os.system('''gpconfig --skipvalidation -c gp_interconnect_proxy_addresses -v "'{}'"'''.format(value))
        plpy.notice('''the settings are applied, please reload with 'gpstop -u' to take effect.''')
    else:
        plpy.notice('''if the settings are correct, re-run with 'update proxy' to apply.''')
    return results
$$ language plpython3u execute on coordinator;

Эта функция выполняет SQL-запрос к таблице gp_segment_configuration, чтобы получить данные о сегментах (dbid, content, port, и address). Для каждого сегмента вычисляется новый порт, добавляя delta к текущему порту. Результаты, включая изменённый порт, добавляются в список results. Формируется строка value, содержащая информацию о всех сегментах в формате dbid:content:address:port, разделённых запятыми. Если action равно ‘update proxy’, то команда gpconfig используется для изменения настройки gp_interconnect_proxy_addresses с помощью значения, сформированного в переменной value, а пользователю выводится сообщение о необходимости перезагрузки конфигурации с помощью gpstop -u. Для других действий выводится сообщение с предложением повторно запустить функцию обновления прокси, если всё правильно. Функция возвращает список сегментов с обновлёнными портами для прокси-сервера, добавив заданное смещение, и обновляет соответствующую настройку в конфигурации Greenplum, если это необходимо.

При запуске функции необходимо подключиться к базе данных с помощью UDPIFC- или TCP-режима. В этом примере psql для подключения к базе данных mytest используется тип соединения UDPIFC:

PGOPTIONS="-c gp_interconnect_type=udpifc" psql -d mytest

При выполнении следующей команды выводится список значений экземпляра сегмента для параметра gp_interconnect_proxy_addresses:

select my_setup_ic_proxy(-1000, '');

Эта команда запускает функцию установки параметра:

select my_setup_ic_proxy(-1000, 'update proxy');

В качестве альтернативы можно запустить утилиту gpconfig, чтобы задать параметр gp_interconnect_proxy_addresses. Например, следующая команда настраивает прокси-адреса для интерконнектов Greenplum, указывая, какие IP-адреса и порты должны использоваться для связи между сегментами кластера:

gpconfig --skipvalidation -c gp_interconnect_proxy_addresses -v "'1:-1:192.168.180.50:35432,2:0:192.168.180.54:35000'"

В этом пример опция —skipvalidation позволяет пропустить проверку значений параметров. Указан координатор и один экземпляр сегмента Greenplum:

  • 1:-1:192.168.180.50:35432 означает, что 1 — это идентификатор сегмента, -1 — это идентификатор контента, 192.168.180.50 — IP-адрес, а 35432 — порт;
  • 2:0:192.168.180.54:35000 означает, что 2 — идентификатор сегмента, 0 — идентификатор содержания, 192.168.180.54 — IP-адрес, и 35000 — порт.

После установки параметра gp_interconnect_proxy_addresses надо перезагрузить конфигурационный файл postgresql.conf файл командой gpstop -u.

Чтобы протестировать настроенные прокси-порты интерконнектов, можно задать переменную окружения PGOPTIONS при запуске psql-сеанса в командной оболочке. Следующий пример задает переменную окружения для включения прокси-серверов интерконнетов, запускает psql и регистрирует в базе данных mytest:

PGOPTIONS="-c gp_interconnect_type=proxy" psql -d mytest

Для тестирования можно запустить в оболочке запрос, который обращается ко всем первичным экземплярам сегмента. Следующий пример отображает идентификаторы сегмента и количество строк в экземпляре сегмента из таблицы sales:

SELECT gp_segment_id, COUNT(*) FROM sales GROUP BY gp_segment_id ;

После тестирования прокси-серверов интерконнектов надо задать параметр конфигурации сервера для системы с помощью утилиты gpconfig:

gpconfig -c  gp_interconnect_type -v proxy

Затем нужно снова перезагрузить конфигурационный файл postgresql.conf с помощью команды gpstop –u.

Освойте администрирование и эксплуатацию Greenplum для аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://docs.vmware.com/en/VMware-Greenplum/7/greenplum-database/admin_guide-intro-arch_overview.html#arch_interconnect
  2. https://docs.vmware.com/en/VMware-Greenplum/7/greenplum-database/admin_guide-managing-proxy-ic.html
Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.
Поиск по сайту