Перейти к основному содержимому

Резервирование подключений для ролей

Описание

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

В PostgreSQL отсутствует возможность резервирования подключений для пользователей, не обладающих правами суперпользователя. Это приводит к проблеме невозможности таким пользователям подключиться к БД, когда все свободные подключения заняты.

В СУБД Pangolin реализована возможность резервирования количества доступных подключений для ролей, как индивидуально, так и по признаку вхождения в групповую роль. Это гарантирует пользователю наличие свободных подключений к БД в любое время.

Настройка

Настроить резервирование соединения можно индивидуально или для группы ролей. При этом редактируются разные файлы:

  • для конфигурации standalone – файл pg_quota.conf. После редактирования файла требуется выполнить перезагрузку БД;

  • для конфигурации cluster — настройка резервирования соединений осуществляется через файл postgres.yml в секции pg_quota. После редактирования файла требуется выполнить перезагрузку БД и Pangolin Manager.

    При этом, в кластерной конфигурации, файлы pg_quota.conf конфигурируются на каждом узле посредством оркестратора Pangolin Manager.

При редактировании файла, обратите внимание на правила оформления.

Объекты БД

Представление pg_quota_file_rules

Для получения лимитов, описанных в файле pg_quota.conf, добавлено представление pg_quota_file_rules. Представление полезно для просмотра текущих настроек pg_quota.conf.

По умолчанию представление pg_quota_file_rules доступно только суперпользователям и только для чтения.

Представление pg_quota_file_rules содержит следующие поля:

Название поляТип значенияОписание
line_numberintegerНомер строки этого лимита в pg_quota.conf
user_nametext[]Список имен пользователей и групп, к которым применяются лимиты
optionstext[]Параметры-лимиты, представленные в виде key1=value1, key2=value2, ....
errortextОшибка, выявленная при разборе строки

Представление pg_quota_rules

Для получения действующих в данный момент лимитов добавлено системное представление pg_quota_rules.

По умолчанию представление pg_quota_rules доступно только суперпользователям.

Представление pg_quota_rules содержит следующие поля:

Название поляТип значенияОписание
user_nametextИмя пользователя или группы
reserved_connectionsintegerЧисло зарезервированных соединений

Представление pg_quota_limits

Для просмотра текущих лимитов добавлено системное представление pg_quota_limits. Представление полезно для возможности контроля корректности настроек.

По умолчанию представление pg_quota_limits доступно только суперпользователям.

Представление содержит следующие поля:

Название поляТип значенияОписание
max_connectionsintegerМаксимальное число одновременных подключений к серверу БД
superuser_reserved_connectionsintegerКоличество зарезервированных подключений, которые будут зарезервированы для суперпользователей
total_quota_reserved_connectionsintegerОбщее количество зарезервированных подключений (суммарно по всем квотам без учета иерархии ролей)
total_pool_connectionsintegerКоличество подключений, доступных для всех пользователей. Вычисляется по формуле: total_pool_connections = max_connections - superuser_reserved_connections - total_quota_reserved_connections

Представление pg_stat_quota

Представление отображает, какие квоты используют текущие процессы, следующие поля:

Название поляТип значенияОписание
pidint4Идентификатор процесса
quota_ownertextВладелец квоты. Возможные значения:

- role – при соединении из пула обычной роли;
- groupname – при соединении из пула групповой роли;
- superuser – при соединении из пула, зарезервированного за суперпользователем;
- totalpool – при соединении из общего пула соединений
quota_rolenametextИмя роли, которая использует квоту (имя может отсутствовать)

Управление

Правила оформления pg_quota

Внимание!

Редактировать файлpg_quota.conf могут администраторы СУБД.

Файл не является обязательным. Если он не задан или отсутствует, используются лимиты для суперпользователей (если роль с привилегиями), и/или лимиты из общего пула. В этом случае работает стандартный механизм выдачи подключений.

Формат файла pg_quota.conf представляет собой набор записей (по одной записи в строке).

Пустые строки в файле pg_quota.conf игнорируются, как и любой текст комментария после значка #. Записи не продолжаются на следующей строке.

Записи начинаются с имени роли (role_name), за которой через пробел и/или табуляцию следует хотя бы одно поле в формате ключ=значение (поле reserved_connections).

role_name    key1=value1 key2=value2 ...

Где role_name — это либо имя конкретного пользователя базы данных, либо имя группы, в начале которого стоит знак «+».

При указании нескольких записей с одинаковым именем роли актуальной будет первая запись.

Поле reserved_connections (integer) определяет количество «слотов» подключений, которые PostgreSQL резервирует для роли (возможные значения – больше нуля). Количество зарезервированных подключений в рамках файла pg_quota.conf не должно быть идентично или превышать размер пула соединений. Проверка выполняется при запуске системы. В случае, когда общее значение зарезервированных соединений идентично или превышает max_connections – система не будет запущена.

Пример файла pg_quota.conf:

user        reserved_connections=3
+db_admin reserved_connections=5
Сведения

Файл не обязан содержать все роли, описанные в БД. Он может содержать только роли, для которых необходимо квотирование.

Для кластерной конфигурации, в конфигурационный файл Pangolin Manager postgres.yml добавлена секция pg_quota на том же уровне, что и секция pg_hba. Секция pg_quota используется Pangolin Manager при инициализации БД и при изменении параметров квотирования.

Пример pg_quota:

backup_user     reserved_connections=3

Правила по квотированию соединений

Действуют следующие правила по квотированию соединений:

  1. В первую очередь должен исчерпаться лимит подключающейся роли (если он определен). При исчерпании лог-файл будет содержать сообщение «the connection limit for role has been reached. roleName: ..., reserved_connections: ...».
  2. Далее лимит по групповым ролям (если роль входит в групповые). При исчерпании лог-файл будет содержать сообщение «the connection limit for group role has been reached. roleName: ..., reserved_connections: ...».
  3. Затем лимит для суперпользователя (если роль является superuser). При исчерпании лог-файл будет содержать сообщение «the connection limit for superuser has been reached. roleName: ..., reserved_connections: ...».
  4. В последнюю очередь общий пул. При исчерпании лог-файл будет содержать сообщение «the connection limit from total pool has been reached. roleName: ..., totalPool: ...».

Отсутствие соединений приведет к разрыву открывающегося соединения с БД. Информация об этом попадет в лог аудита.

quota

Диагностика

Повторное указание квоты

При повторном указании квоты лог-файл будет содержать сообщение:

a quota (line ...) already exists with the same role (line ...) of configuration file ".../pg_quota.conf"

Файл pg_quota.conf содержит некорректные данные

В случае, если файл pg_quota.conf содержит некорректные данные в файл журнала будет содержаться следующее сообщения:

LOG: invalid reserved_connections: "ABC"
CONTEXT: line 22 of configuration file "/pgdata/0<base_version>/data/pg_quota.conf"

Ошибка запуска СУБД, если количество зарезервированных соединений превышает «max_connections - superuser_reserved_connections»

БД не может запуститься по причине того, что сумма зарезервированных подключений (reserved_connections + superuser_reserved_connections) превышает max_connections. Файл журнала содержит сообщение:

total_quota_reserved_connections (4) plus superuser_reserved_connections (1) must be less then or equal to max_connections (4)

Сценарии использования

Сценарий «Первая запись в pg_quota для роли является актуальной»

Файл pg_quota.conf содержит для роли две записи – первая запись содержит reserved_connections=2, вторая запись содержит дублирующую запись reserved_connections.

  1. Создайте пользователя:

    CREATE USER test_user PASSWORD 'password';
  2. В файле postgresql.conf укажите:

    max_connection=5
    superuser_reserved_connections = 1
  3. В файле pg_quota.conf укажите:

    test_user reserved_connections=2
    test_user reserved_connections=3
  4. Запустите БД.

    Ожидаемый результат:

    БД запущена, файл журнала содержит сообщение:

    a quota (line ...) already exists with the same role (line ...) of configuration file "/pgdata/quota/pg_quota.conf"
  5. Дважды подключитесь пользователем, указанным в pg_quota.conf.

    psql -U test_user postgres

    Ожидаемый результат:

    Подключения успешны.

  6. Выполните третью попытку подключения тем же пользователем.

    Ожидаемый результат:

    Подключение успешно, файл журнала содержит запись:

    WARNING: the connection limit for role has been reached. roleName: test_user, reservedSize: 2, freeSize: 0

Сценарий «Соединение берется из лимита соединений для групповой роли»

Соединение берется из лимита соединений для групповой роли, если роль входит в групповую и:

  • лимит для этой роли исчерпан или не определен;
  • лимит для групповой роли не исчерпан.
  1. Создайте пользователей и групповую роль, а затем предоставьте эту роль пользователям:

    CREATE USER test_user PASSWORD 'password';
    CREATE USER test_user2 PASSWORD 'password';

    CREATE ROLE group_role1;
    GRANT group_role1 TO test_user2;
  2. В файле pg_quota.conf укажите:

    test_user reserved_connections=1
    test_user2 reserved_connections=1
    +group_role1 reserved_connections=1
  3. Перезапустите БД.

  4. Проверьте, что пользователь test_user2 входит в групповую роль group_role1.

  5. Подключитесь к БД пользователем test_user2:

    psql -U test_user2 postgres

    Ожидаемый результат: Пользователь подключен к БД.

  6. Выполните запрос:

    SELECT * FROM pg_stat_quota;

    Результат запроса содержит:

    role | test_user2
  7. Повторно подключитесь к БД пользователем test_user2.

  8. Повторите запрос:

    SELECT * FROM pg_stat_quota;

    Результат запроса содержит:

    role      |  test_user2
    grouprole | group_role1

Сценарий «Настройка в кластерной конфигурации»

Pangolin Manager при изменении postgres.yml в разделе pg_quota, настраивает файл pg_quota.conf.

  1. Посмотрите содержимое pg_quota.conf:

    cat /pgdata/0<base_version>/data/pg_quota.conf

    Ожидаемый результат:

    Файл /pgdata/0<base_version>/data/pg_quota.conf содержит набор записей или не содержит ни одной.

  2. Добавьте в /etc/pangolin-manager/postgres.yml в раздел pg_quota строку:

    test_user reserved_connections=5

    Ожидаемый результат:

    Файл /etc/pangolin-manager/postgres.yml в разделе pg_quota содержит указанную строку.

  3. Выполните следующие команды:

    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
  4. Проверьте содержимое pg_quota.conf:

    cat /pgdata/0<base_version>/data/pg_quota.conf

    Ожидаемый результат:

    Файл /pgdata/0<base_version>/data/pg_quota.conf содержит запись:

    test_user reserved_connections=5