Резервирование подключений для ролей
Описание
Функциональность доступна только для редакций 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_number | integer | Номер строки этого лимита в pg_quota.conf |
user_name | text[] | Список имен пользователей и групп, к которым применяются лимиты |
options | text[] | Параметры-лимиты, представленные в виде key1=value1, key2=value2, .... |
error | text | Ошибка, выявленная при разборе строки |
Представление pg_quota_rules
Для получения действующих в данный момент лимитов добавлено системное представление pg_quota_rules.
По умолчанию представление pg_quota_rules доступно только суперпользователям.
Представление pg_quota_rules содержит следующие поля:
| Название поля | Тип значения | Описание |
|---|---|---|
user_name | text | Имя пользователя или группы |
reserved_connections | integer | Число зарезервированных соединений |
Представление pg_quota_limits
Для просмотра текущих лимитов добавлено системное представление pg_quota_limits. Представление полезно для возможности контроля корректности настроек.
По умолчанию представление pg_quota_limits доступно только суперпользователям.
Представление содержит следующие поля:
| Название поля | Тип значения | Описание |
|---|---|---|
max_connections | integer | Максимальное число одновременных подключений к серверу БД |
superuser_reserved_connections | integer | Количество зарезервированных подключений, которые будут зарезервированы для суперпользователей |
total_quota_reserved_connections | integer | Общее количество зарезервированных подключений (суммарно по всем квотам без учета иерархии ролей) |
total_pool_connections | integer | Количество подключений, доступных для всех пользователей. Вычисляется по формуле: total_pool_connections = max_connections - superuser_reserved_connections - total_quota_reserved_connections |
Представление pg_stat_quota
Представление отображает, какие квоты используют текущие процессы, следующие поля:
| Название поля | Тип значения | Описание |
|---|---|---|
pid | int4 | Идентификатор процесса |
quota_owner | text | Владелец квоты. Возможные значения: - role – при соединении из пула обычной роли;- groupname – при соединении из пула групповой роли;- superuser – при соединении из пула, зарезервированного за суперпользователем;- totalpool – при соединении из общего пула соединений |
quota_rolename | text | Имя роли, которая использует квоту (имя может отсутствовать) |
Управление
Правила оформления 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
Правила по квотированию соединений
Действуют следующие правила по квотированию соединений:
- В первую очередь должен исчерпаться лимит подключающейся роли (если он определен). При исчерпании лог-файл будет содержать сообщение «
the connection limit for role has been reached. roleName: ..., reserved_connections: ...». - Далее лимит по групповым ролям (если роль входит в групповые). При исчерпании лог-файл будет содержать сообщение «
the connection limit for group role has been reached. roleName: ..., reserved_connections: ...». - Затем лимит для суперпользователя (если роль является
superuser). При исчерпании лог-файл будет содержать сообщение «the connection limit for superuser has been reached. roleName: ..., reserved_connections: ...». - В последнюю очередь общий пул. При исчерпании лог-файл будет содержать сообщение «
the connection limit from total pool has been reached. roleName: ..., totalPool: ...».
Отсутствие соединений приведет к разрыву открывающегося соединения с БД. Информация об этом попадет в лог аудита.

Диагностика
Повторное указание квоты
При повторном указании квоты лог-файл будет содержать сообщение:
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.
-
Создайте пользователя:
CREATE USER test_user PASSWORD 'password'; -
В файле
postgresql.confукажите:max_connection=5
superuser_reserved_connections = 1 -
В файле
pg_quota.confукажите:test_user reserved_connections=2
test_user reserved_connections=3 -
Запустите БД.
Ожидаемый результат:
БД запущена, файл журнала содержит сообщение:
a quota (line ...) already exists with the same role (line ...) of configuration file "/pgdata/quota/pg_quota.conf" -
Дважды подключитесь пользователем, указанным в
pg_quota.conf.psql -U test_user postgresОжидаемый результат:
Подключения успешны.
-
Выполните третью попытку подключения тем же пользователем.
Ожидаемый результат:
Подключение успешно, файл журнала содержит запись:
WARNING: the connection limit for role has been reached. roleName: test_user, reservedSize: 2, freeSize: 0
Сценарий «Соединение берется из лимита соединений для групповой роли»
Соединение берется из лимита соединений для групповой роли, если роль входит в групповую и:
- лимит для этой роли исчерпан или не определен;
- лимит для групповой роли не исчерпан.
-
Создайте пользователей и групповую роль, а затем предоставьте эту роль пользователям:
CREATE USER test_user PASSWORD 'password';
CREATE USER test_user2 PASSWORD 'password';
CREATE ROLE group_role1;
GRANT group_role1 TO test_user2; -
В файле
pg_quota.confукажите:test_user reserved_connections=1
test_user2 reserved_connections=1
+group_role1 reserved_connections=1 -
Перезапустите БД.
-
Проверьте, что пользователь
test_user2входит в групповую рольgroup_role1. -
Подключитесь к БД пользователем
test_user2:psql -U test_user2 postgresОжидаемый результат: Пользователь подключен к БД.
-
Выполните запрос:
SELECT * FROM pg_stat_quota;Результат запроса содержит:
role | test_user2 -
Повторно подключитесь к БД пользователем
test_user2. -
Повторите запрос:
SELECT * FROM pg_stat_quota;Результат запроса содержит:
role | test_user2
grouprole | group_role1
Сценарий «Настройка в кластерной конфигурации»
Pangolin Manager при изменении postgres.yml в разделе pg_quota, настраивает файл pg_quota.conf.
-
Посмотрите содержимое
pg_quota.conf:cat /pgdata/0<base_version>/data/pg_quota.confОжидаемый результат:
Файл
/pgdata/0<base_version>/data/pg_quota.confсодержит набор записей или не содержит ни одной. -
Добавьте в
/etc/pangolin-manager/postgres.ymlв разделpg_quotaстроку:test_user reserved_connections=5Ожидаемый результат:
Файл
/etc/pangolin-manager/postgres.ymlв разделеpg_quotaсодержит указанную строку. -
Выполните следующие команды:
/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 -
Проверьте содержимое
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