← Назад к вопросам

Что такое PgBouncer?

2.0 Middle🔥 111 комментариев
#Python Core#Soft Skills

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

PgBouncer

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

Проблема, которую решает PgBouncer

Построение нового соединения с PostgreSQL — это дорогостоящая операция (аутентификация, инициализация, выделение памяти). При большом количестве клиентов это создаёт узкое место:

Без PgBouncer:
[100 клиентов] → [100 соединений к БД] → [большая нагрузка]

С PgBouncer:
[100 клиентов] → [PgBouncer пул ~20 соединений] → [оптимальная нагрузка]

Основной принцип работы

PgBouncer поддерживает пул активных соединений к PostgreSQL и переиспользует их для входящих запросов от клиентов. Когда клиент отправляет запрос, ему выдаётся соединение из пула. После завершения запроса соединение возвращается в пул для других клиентов.

Режимы работы

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

  1. Session pooling — соединение выделяется клиенту на весь сеанс (наиболее совместимо)
Клиент логинится → получает соединение → соединение закрывается при logout
  1. Transaction pooling — соединение выделяется только на время транзакции (более эффективно)
Клиент отправляет запрос → получает соединение → соединение возвращается после COMMIT/ROLLBACK
  1. Statement pooling — соединение выделяется на время одного запроса (максимальная эффективность)
Один запрос = одно выделение соединения → максимум переиспользования

Базовая конфигурация

Файл конфигурации /etc/pgbouncer/pgbouncer.ini:

[databases]
myapp_db = host=localhost port=5432 dbname=myapp user=postgres password=secret

[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
auth_type = md5
auth_file = /etc/pgbouncer/userlist.txt
pool_mode = transaction

# Размер пула соединений
min_pool_size = 10
default_pool_size = 25
max_pool_size = 100

# Timeout параметры
server_lifetime = 3600
server_idle_timeout = 600
query_timeout = 0

Параметры конфигурации

  • pool_mode — режим pooling (session, transaction, statement)
  • default_pool_size — количество соединений на БД
  • min_pool_size — минимальное количество соединений
  • max_pool_size — максимальное количество соединений
  • server_lifetime — максимальное время жизни соединения (в секундах)
  • server_idle_timeout — timeout для неиспользуемого соединения

Использование в приложении Python

Приложение подключается к PgBouncer вместо прямого подключения к PostgreSQL:

import psycopg2

# Вместо прямого подключения к PostgreSQL
# conn = psycopg2.connect("dbname=myapp host=localhost port=5432")

# Подключаемся к PgBouncer
conn = psycopg2.connect(
    dbname="myapp_db",
    host="localhost",
    port=6432,  # Порт PgBouncer
    user="appuser",
    password="apppass"
)

С SQLAlchemy:

from sqlalchemy import create_engine

# URL для подключения через PgBouncer
engine = create_engine(
    "postgresql://appuser:apppass@localhost:6432/myapp_db",
    echo=False
)

Преимущества

  1. Снижение нагрузки на БД — переиспользование соединений
  2. Лучшая масштабируемость — обработка большего количества клиентов
  3. Снижение потребления памяти — меньше соединений = меньше памяти
  4. Быстрее, чем новое соединение — из пула соединение выдаётся мгновенно
  5. Простая установка — минимальная конфигурация приложения

Мониторинг

Проверить статус пула:

import psycopg2

conn = psycopg2.connect("dbname=pgbouncer host=localhost port=6432 user=pgbouncer password=pgbouncer")
cur = conn.cursor()
cur.execute("SHOW STATS;")
print(cur.fetchall())
cur.execute("SHOW CLIENTS;")
print(cur.fetchall())

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

Что такое PgBouncer? | PrepBro