PgBouncer: настройка, проблемы и ловушки

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


PgBouncer — как затычка в ванну: пока стоит — всё держится. Убери — и база захлебнётся.

🧠 Зачем нужен PgBouncer

PostgreSQL — не любит десятки и сотни одновременных соединений.
Каждое соединение = 1 процесс в ОС. При 100–200 соединениях — всё тормозит.

PgBouncer берёт на себя лавину соединений от Puma, Sidekiq и Cron-задач, удерживая к БД 5–10 настоящих коннектов.


⚙️ Как работает

PgBouncer — это пуллер соединений. Он может работать в трёх режимах:

Режим Как работает Когда использовать
session соединение на всю сессию почти не даёт эффекта
transaction соединение на время SQL транзакции рекомендуется
statement соединение на один SQL-запрос редко используется

🛠 Пример настройки

# /etc/pgbouncer/pgbouncer.ini
[databases]
myapp = host=127.0.0.1 port=5432 dbname=myapp

[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1
auth_type = trust
pool_mode = transaction
max_client_conn = 1000
default_pool_size = 20

В Rails:

# config/database.yml
production:
  host: 127.0.0.1
  port: 6432
  pool: 20

🪤 Ловушки

1. ActiveRecord::Base.connection.active? возвращает false

Да, PgBouncer возвращает соединение в пул после транзакции. Rails считает его “неактивным”, хотя всё работает. Не пугайтесь.


2. PgHero ломается

PgHero любит сидеть в сессии. С PgBouncer в режиме transaction он начинает ошибаться. Вывод: PgHero подключай напрямую, в обход PgBouncer.


3. Миграции и rails db:prepare

Они используют connection.transaction. Если вы в режиме statement, получите cannot PREPARE a transaction in this mode.

Используйте transaction или делайте миграции напрямую к PostgreSQL.


🧩 Вывод

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

🗓 Дата публикации: 20.05.2025, но это не точно...

PgBouncer PostgreSQL Rails оптимизация настройка база данных