Изменение параметра max_connections для PostgreSQL на Single инсталляции SimpleOne
Операции с базой данных потенциально небезопасны. Любые изменения конфигурации необходимо предварительно протестировать на dev, test или sandbox инстансах перед применением на продуктивном окружении.
Чем опасно завышенное значение max_connections
Каждое соединение в PostgreSQL — это отдельный серверный процесс, потребляющий оперативную память даже в простое. Чрезмерное увеличение параметра может привести к:
- OOM (Out of Memory) — ядро Linux принудительно завершит процесс PostgreSQL при нехватке RAM, что приведёт к полному падению базы данных
- Деградация производительности — избыточное количество процессов вызывает рост конкуренции за блокировки и постоянное переключение контекста CPU, замедляя все запросы
- Нестабильная работа инстанса — даже если соединения простаивают, PostgreSQL резервирует под них ресурсы, сокращая объём памяти, доступный для кэша и выполнения запросов
Официальная документация: postgresql.org — Connection Settings
1. Проверка текущего значения
Перед внесением изменений убедитесь, какое значение установлено сейчас.
С хоста — через PostgreSQL:
docker exec -it postgres su - postgres -c 'psql -c "SHOW max_connections;"'
С хоста — через Patroni:
docker exec -it postgres su - postgres -c 'patronictl show-config | grep max_connections'
2. Изменение параметра через Patroni
Зайдите с хоста в контейнер под пользователем postgres:
docker exec -it postgres su - postgres
Далее все команды выполняются внутри контейнера.
Запустите редактор конфигурации Patroni:
patronictl edit-config
Откроется конфигурация кластера. Найдите секцию postgresql.parameters и измените значение max_connections:
postgresql:
parameters:
...
max_connections: 100 # <-- изменяем это значение
...
Сохраните файл и выйдите из редактора. Patroni покажет diff изменений и запросит подтверждение:
- max_connections: 100
+ max_connections: 200
Apply these changes? [y/N]: y
Configuration changed
3. Перезапуск кластера
Параметр max_connections требует перезапуска PostgreSQL.
Внимание: перезапуск кластера приводит к кратковременному простою инстанса!
Планируйте выполнение в согласованное окно обслуживания.
Внутри контейнера выполните patronictl list, чтобы узнать имя кластера и убедиться, что в колонке Pending restart стоит *:
patronictl list
+ Cluster: postgres-firsulov
+--------------------------+------------+--------+---------+----+-------+-----------------+
| Member | Host | Role | State | TL | Lag | Pending restart |
+--------------------------+------------+--------+---------+----+-------+-----------------+
| postgres-single-inst-prod| 172.25.0.3 | Leader | running | 5 | | * |
+--------------------------+------------+--------+---------+----+-------+-----------------+
Имя кластера указано в строке
+ Cluster:— в данном примере этоpostgres-firsulov.
Выполните перезапуск, указав имя кластера:
patronictl restart postgres-firsulov
Patroni последовательно задаст несколько вопросов — отвечайте по порядку:
When should the restart take place (e.g. 2026-02-20T12:59) [now]: # нажмите Enter
Are you sure you want to restart members postgres-single-instance-prod?
[y/N]: y # введите y
Restart if the PostgreSQL version is less than provided (e.g. 9.5.2) []: # нажмите Enter
Success: restart on member postgres-single-instance-prod
4. Проверка после перезапуска
Убедитесь внутри контейнера, что новое значение применилось:
psql -c "SHOW max_connections;"
patronictl show-config | grep max_connections
Оба значения должны совпадать и соответствовать тому, что вы указали в шаге 2.
Краткая шпаргалка
| Шаг | Где | Команда |
|---|---|---|
| Посмотреть текущее значение | хост | docker exec -it postgres su - postgres -c 'psql -c "SHOW max_connections;"' |
| Посмотреть конфиг Patroni | хост | docker exec -it postgres su - postgres -c 'patronictl show-config | grep max_connections' |
| Войти в контейнер | хост | docker exec -it postgres su - postgres |
| Изменить параметр | контейнер | patronictl edit-config |
| Узнать имя кластера | контейнер | patronictl list |
| Перезагрузка кластера для применения изменений (приведёт к простою инстанса) | контейнер | patronictl restart <ИМЯ_КЛАСТЕРА> |