18.11. RDMA-соединения
Postgres Pro Enterprise обеспечивает поддержку клиент-серверных соединений с использованием технологии RDMA (Remote Direct Memory Access, Удалённый прямой доступ к памяти). Для этого вы должны настроить механизмы RDMA на стороне клиента и сервера.
Технология RDMA даёт возможность передавать данные напрямую в память удалённого компьютера, минуя ядро операционной системы. Это позволяет снизить нагрузку на процессор, сократить сетевые задержки в распределённых системах, и, как следствие, увеличить производительность.
18.11.1. Активизация в Postgres Pro Enterprise клиент-серверных соединений RDMA
Для клиент-серверных соединений RDMA в Postgres Pro Enterprise используется libpq с API rsocket
. Чтобы включить поддержку соединений RDMA для вашей СУБД Postgres Pro Enterprise через rsocket
, вы должны настроить и клиентскую, и серверную систему следующим образом:
Отключите выгрузку памяти в системах, к которым вы намерены подключаться. Например, если вы запускаете Postgres Pro Enterprise в виде службы systemd, выполните следующее:
Добавьте следующую строку в файл службы
postgrespro-ent-10.service
:LimitMEMLOCK=infinity
Перезагрузите конфигурацию systemd, чтобы изменение вступило в силу:
systemctl daemon-reload
На стороне сервера добавьте GUC-переменную listen_rdma_addresses в файл конфигурации
postgresql.conf
и укажите в ней IP-адреса, по которым сервер будет принимать RDMA-подключения черезrsocket
от клиентских приложений. Например:listen_rdma_addresses = 'server1,172.17.3.21'
Вы можете задать в ней список имён или IP-адресов сетевых интерфейсов через запятую. Если присвоить ей
*
, RDMA-подключения черезrsocket
будут приниматься по всем доступным IP-интерфейсам.Важно
Так как для всех подключений используется один порт, задаваемый переменной
port
, во избежание конфликтов в параметрахlisten_addresses
иlisten_rdma_addresses
необходимо задать различные IP-адреса.На стороне клиента измените параметры подключения libpq для использования API
rsocket
. Это можно сделать одним из следующих способов:Добавьте следующие параметры
rsocket
в файл соединений служб libpq,pg_service.conf
:# конфигурация rsocket [rsocket] host=
сервер
port=5433 user=имя_пользователя
with_rsocket=trueКогда клиент подключается к серверу через libpq, имя службы, указанное в квадратных скобках в файле
pg_service.conf
, должно быть задано в параметреservice
или в соответствующей переменной окруженияPGSERVICE
. Этот подход позволяет динамически управлять типом подключения клиента к серверу.Также вы можете установить переменную окружения
WITH_RSOCKET
:export WITH_RSOCKET=true
В этом случае API
rsocket
будет использоваться для всех соединений клиента с сервером.
18.11.2. Использование RDMA с pg_dump
Чтобы подключить pg_dump к серверу, используя RDMA через rsocket
, выполните:
Настройте сервер, как описано в Подразделе 18.11.1.
Установите переменную окружения
WITH_RSOCKET
:export WITH_RSOCKET=true
После завершения настройки запустите pg_dump как обычно. Например:
pg_dumpбаза_данных
-hсервер
> db.sql
18.11.3. Использование RDMA для репликации ведущий-ведомый
Для запуска репликации ведущий-ведомый с использованием RDMA-соединений через rsocket
необходимо настроить ведущий и ведомый узлы. Например, чтобы разрешить клиентские подключения к серверу 172.17.3.21 с адресов 172.17.3.0/24 от имени пользователя postgres
, нужно проделать следующее:
Чтобы настроить ведущий узел для репликации с использованием соединений RDMA rsocket
:
Отредактируйте файл
pg_hba.conf
так, чтобы сервер принимал подключения с определённых IP-адресов. Например:host all postgres 172.17.3.0/24 md5 host replication postgres 172.17.3.0/24 md5
Отредактируйте файл
postgresql.conf
:listen_rdma_addresses = '172.17.3.21' wal_level = hot_standby hot_standby = on max_wal_senders = 1
В переменной
listen_rdma_addresses
задаются IP-адреса, по которым сервер будет принимать RDMA-подключения черезrsocket
.Перезапустите ведущий узел.
Подсказка
Если вы установите GUC-переменные log_connections
и log_disconnections
, в файл журнала будет выводиться подробная информации обо всех подключениях и отключениях клиентов, соответственно. Например:
LOG: connection received: host=172.17.3.22 port=37709 with_rsocket=true LOG: disconnection: session time: 0:00:00.622 user=postgres database= host=172.17.3.22 port=37709 with_rsocket=true
Для настройки ведомого узла выполните:
Установите переменную окружения
WITH_RSOCKET
:export WITH_RSOCKET=true
Скопируйте данные с ведущего узла, используя pg_basebackup:
pg_basebackup -D
каталог_данных
-x -R -h 172.17.3.21 -U postgresВсе данные должны оказаться на ведомом узле в пути, который определяет параметр
каталог_данных
.Убедитесь в том, что в файле
указан параметркаталог_данных
/recovery.confwith_rsocket
.standby_mode = 'on' primary_conninfo = 'user=postgres host=172.17.3.21 port=5432 with_rsocket=true'
Очистите параметр
listen_rdma_addresses
в файлеpostgresql.conf
:listen_rdma_addresses = ''
Завершив настройку, запустите ведомый узел. После этого репликация будет выполняться через RDMA с использованием API rsocket
.