---
title: 'Пулер соединений PgBouncer в кластере PostgreSQL'
sidebar_label: 'Пулер соединений'
sidebar_position: 7
description: 'Размер пула, режимы пулинга PgBouncer и как изменить режим в кластере PostgreSQL'
---

import Formbricks from '@theme/MDXComponents/Formbricks'

# Пулер соединений PgBouncer в кластере PostgreSQL

В PostgreSQL для обработки каждого соединения клиента создается отдельный процесс. Чем больше число соединений, тем больше процессов, которые используют оперативную память. Максимальное число соединений с процессом PostgreSQL определяется [параметром `max_connections`](#max-connections).

Чтобы оптимизировать потребление ресурсов, можно использовать пулер соединений. Клиенты подключаются не напрямую к PostgreSQL, а к пулеру соединений. При этом поддерживается небольшое количество соединений между пулером и сервером PostgreSQL — пулер создает новое соединение или повторно использует одно из существующих. Количество соединений между пулером и базой данных на каждой из нод кластера определяется [размером пула](#pool-size) (параметр `pool_size`).

В кластерах облачных баз данных PostgreSQL используется пулер соединений PgBouncer. Доступно [три режима пулинга PgBouncer](#pooling-modes). Подробнее о пулере соединений в документации [PgBouncer](https://www.pgbouncer.org/).

## Максимальное число соединений с процессом PostgreSQL (max\_connections) \{#max-connections}

Параметр СУБД PostgreSQL `max_connections` определяет максимальное число одновременных соединений с процессом PostgreSQL. По умолчанию установлено значение 100 соединений.

Вы можете [изменить значение параметра](/managed-databases/postgresql/settings.mdx) в настройках СУБД в панели управления  на значение максимального количества соединений при нагрузке. Учитывайте, что каждое соединение расходует ресурсы оперативной памяти.

Изменение значения `max_connections` влечет за собой перезагрузку нод кластера PostgreSQL.

![](https://423.selcdn.ru/kb/dbaas-no-pooler-LANG-THEME.png)

## Размер пула (pool\_size) \{#pool-size}

Размер пула (параметр `pool_size`) — это максимальное число соединений между пулером соединений и каждой базой данных PostgreSQL на каждой из нод кластера.

Размер пула можно выбрать при [создании кластера](/managed-databases/postgresql/create-cluster.mdx) и [изменить размер](#change-pool-size) в созданном кластере. Доступные значения — от 1 до 500.

## Режимы пулинга \{#pooling-modes}

Режим пулинга — это стратегия соединения клиента с PostgreSQL. В кластерах облачных баз данных PostgreSQL используется пулер соединений PgBouncer. Подробнее о пулере соединений в документации [PgBouncer](https://www.pgbouncer.org/).

PgBouncer поддерживает три режима:

* [режим транзакции (transaction)](#transaction-mode);
* [режим сессии (session)](#session-mode);
* [режим оператора (statement)](#statement-mode).

По умолчанию в облачных базах данных используется режим транзакции (transaction).

Режим пулинга можно выбрать при [создании кластера](/managed-databases/postgresql/create-cluster.mdx) и [изменить режим](#change-pooling-mode) в созданном кластере.

## Режим транзакции (transaction) \{#transaction-mode}

Соединение с PostgreSQL поддерживается до тех пор, пока не завершится транзакция. Когда транзакция завершается, пулер возвращает соединение в пул. Позже это соединение может повторно использоваться этим же клиентом для других подключений или другим клиентом.

Общее количество клиентских подключений к PgBouncer может достигать 10 000, но количество активных транзакций определяет размер пула. Например, если размер пула равен 30, то активных транзакций будет 30.

Количество соединений между пулером соединений и каждой базой данных PostgreSQL на каждой из нод кластера также определяется размером пула.

Клиент может одновременно выполнять несколько транзакций на разных соединениях. При этом каждое соединение между пулером соединений и сервером PostgreSQL в течение своего жизненного цикла может выполнять транзакции разных клиентов.

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

![](https://423.selcdn.ru/kb/dbaas-transaction-pooling-mode-LANG-THEME.png)

### Ограничения режима transaction \{#transaction-mode-limitations}

Режим transaction нарушает работу некоторых механизмов PostgreSQL. Выберите другой режим, если клиенты используют эти опции. Некоторые флаги подключения могут распределяться между разными клиентами — это может привести к непредсказуемому поведению и некорректным результатам.

В режиме transaction не работают:

* команды [SET/RESET](https://www.postgresql.org/docs/current/sql-reset.html) и [LISTEN/NOTIFY](https://www.postgresql.org/docs/current/sql-listen.html);
* [WITH HOLD CURSOR](https://www.postgresql.org/docs/current/sql-declare.html);
* [PRESERVE/DELETE ROWS](https://www.postgresql.org/docs/current/sql-createtable.html) во временных таблицах;
* подготовленные операторы (prepared statements): protocol-level prepared plans, [PREPARE](https://www.postgresql.org/docs/current/sql-prepare.html), [DEALLOCATE](https://www.postgresql.org/docs/current/sql-deallocate.html);
* оператор [LOAD](https://www.postgresql.org/docs/14/sql-load.html);
* рекомендательные блокировки [Session-level advisory locks](https://www.postgresql.org/docs/current/explicit-locking.html#ADVISORY-LOCKS).

Подробнее о [несовместимых опциях](https://www.pgbouncer.org/features.html#fnref:2) в документации PgBouncer.

## Режим сессии (session) \{#session-mode}

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

Количество подключений между пулером соединений и сервером PostgreSQL определяется [размером пула](#pool-size). На каждое подключение клиента используется подключение между пулером и сервером PostgreSQL. Соединение возвращается в пул и может быть повторно использовано только после отключения предыдущего клиента от базы данных.

В отличие от режима транзакции (transaction), этот режим безопасен, повторяет прямое подключение к PostgreSQL, поддерживает все механизмы и подходит для всех клиентов PostgreSQL. При использовании этого режима нагрузка на ресурсы не снижается.

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

![](https://423.selcdn.ru/kb/dbaas-session-pooling-mode-LANG-THEME.png)

## Режим оператора (statement) \{#statement-mode}

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

Этот режим позволяет использовать больше клиентских подключений, чем в режиме транзакции. Режим подойдет, если известно, что каждая транзакция ограничена только одним запросом (включен AUTOCOMMIT).

![](https://423.selcdn.ru/kb/dbaas-statement-pooling-mode-LANG-THEME.png)

## Изменить режим пулинга \{#change-pooling-mode}

:::info

Если вы выбираете режим транзакции (transaction), ознакомьтесь с [ограничениями этого режима](#transaction-mode-limitations).

:::

1. В [панели управления](https://my.selectel.ru/vpc/default/dbaas/) в верхнем меню нажмите **Продукты** и выберите **Облачные базы данных**.
2. Откройте вкладку **Активные**.
3. Откройте страницу кластера → вкладка **Настройки**.
4. В блоке **Пулер соединений** нажмите **Изменить** и выберите режим пулинга.
5. Нажмите **Сохранить**.

## Изменить размер пула \{#change-pool-size}

1. В [панели управления](https://my.selectel.ru/vpc/default/dbaas/) в верхнем меню нажмите **Продукты** и выберите **Облачные базы данных**.
2. Откройте вкладку **Активные**.
3. Откройте страницу кластера → вкладка **Настройки**.
4. В блоке **Пулер соединений** нажмите **Изменить** и измените размер пула.
5. Нажмите **Сохранить**.

<Formbricks />
