Postgres Pro Enterprise обеспечивает поддержку клиент-серверных соединений с использованием технологии RDMA (Remote Direct Memory Access, Удалённый прямой доступ к памяти). Для этого вы должны настроить механизмы RDMA на стороне клиента и сервера.
Технология 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 будет использоваться для всех соединений клиента с сервером.
Чтобы подключить pg_dump к серверу, используя RDMA через rsocket, выполните:
Настройте сервер, как описано в Подразделе 18.11.1.
Установите переменную окружения WITH_RSOCKET:
export WITH_RSOCKET=true
После завершения настройки запустите pg_dump как обычно. Например:
pg_dumpбаза_данных-hсервер> db.sql
Для запуска репликации ведущий-ведомый с использованием 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.