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.