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, вы должны настроить и клиентскую, и серверную систему следующим образом:

  1. Отключите выгрузку памяти в системах, к которым вы намерены подключаться. Например, если вы запускаете Postgres Pro Enterprise в виде службы systemd, выполните следующее:

    1. Добавьте следующую строку в файл службы postgrespro-ent-11.service:

      LimitMEMLOCK=infinity
    2. Перезагрузите конфигурацию systemd, чтобы изменение вступило в силу:

      systemctl daemon-reload
  2. На стороне сервера добавьте 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-адреса.

  3. На стороне клиента измените параметры подключения 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, выполните:

  1. Настройте сервер, как описано в Подразделе 18.11.1.

  2. Установите переменную окружения 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:

  1. Отредактируйте файл pg_hba.conf так, чтобы сервер принимал подключения с определённых IP-адресов. Например:

    host    all            postgres     172.17.3.0/24         md5
    host    replication    postgres     172.17.3.0/24         md5
  2. Отредактируйте файл 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.

  3. Перезапустите ведущий узел.

Подсказка

Если вы установите 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

Для настройки ведомого узла выполните:

  1. Установите переменную окружения WITH_RSOCKET:

    export WITH_RSOCKET=true
  2. Скопируйте данные с ведущего узла, используя pg_basebackup:

    pg_basebackup -D каталог_данных -x -R -h 172.17.3.21 -U postgres

    Все данные должны оказаться на ведомом узле в пути, который определяет параметр каталог_данных.

  3. Убедитесь в том, что в файле каталог_данных/recovery.conf указан параметр with_rsocket.

    standby_mode = 'on'
    primary_conninfo = 'user=postgres host=172.17.3.21 port=5432 with_rsocket=true'
  4. Очистите параметр listen_rdma_addresses в файле postgresql.conf:

    listen_rdma_addresses = ''

Завершив настройку, запустите ведомый узел. После этого репликация будет выполняться через RDMA с использованием API rsocket.