PgBouncer очень хороший инструмент для увеличения производительности при использовании PostgreSQL. Эта утилита позволит масштабировать кластер баз данных и не плохо справляется с оптимизацией воркеров. Это позволяет базе данных занимается непосредственно своими прямыми обязанностями то есть insert/read/write вместо того что бы занимается обработкой соединений.

Я не буду особо вдаваться в подробности установки PostgreSQL а просто расскажу как установить и настроить PgBouncer.

Установка очень проста:

Установка pgbouncer
1
sudo apt-get install pgbouncer

Следующий шаг это редактирование конфигурационного файла PgBouncer

Установка pgbouncer
1
sudo nano -w /etc/pgbouncer/pgbouncer.ini

В конфигурационном файле нужно указать настройки соединения с базой данных в секции [databases]:

Добавление настроек соединения с базой данных
1
2
[databases]
DATABASE_NAME = host=DB_HOST port=DB_PORT dbname=DATABASE_NAME

Так же можно разрешить слушать все адреса:

Настройка интерфейсов на которых PgBouncer будет слушать
1
listen_addr = *

Далее нам нужно указать тип авторизации:

Настройка типа аутентификации
1
auth_type = trust

После этого нужно сделать настройки пула:

Немного отойду от конфета и расскажу про основные режимы работы пула. PgBouncer представляет собой простой и быстрый менеджер соединений для PostgreSQL. Он поддерживает три режима управления соединениями:

  • Session Pooling. Наиболее “вежливый” режим. При начале сессии клиенту выделяется соединение с сервером; оно приписано ему в течение всей сессии и возвращается в пул только после отсоединения клиента.

  • Transaction Pooling. Клиент владеет соединением с бакендом только в течение транзакции. Когда PgBouncer замечает, что транзакция завершилась, он возвращает соединение назад в пул.

  • Statement Pooling. Наиболее агрессивный режим. Соединение с бакендом возвращается назад в пул сразу после завершения запроса. Транзакции с несколькими запросами в этом режиме не разрешены, так как они гарантировано будут отменены.

К достоинствам PgBouncer относится очень низкое потребление памяти (менее 2КБ на соединение по умолчанию), отсутствие привязки к одному серверу баз данных (может работать с разными хостами), возможность изменения большинства настроек без рестарта, а также возможность онлайн-перезапуска: PgBouncer сам перенесет открытые сокеты в новый процесс.

Настройка режима работы пула
1
pool_mode = transaction

В режиме мультиплексирования на уровне транзакций, т.е. соединение будет закрываться по закрытию транзакции. При использовании такого режима становится невозможным использование определенных возможностей PostgreSQL, например таких как SET/RESET, LISTEN/NOTIFY, WITH HOLD CURSOR, PREPARE / DEALLOCATE, PRESERVE/DELETE ROWS, LOAD и UDF c состоянием сессии

Настройка количества подключений и размер пула
1
2
3
max_client_conn = 100
default_pool_size = 40
reserve_pool_size = 10

Следующий в очереди файл конфигурации аутентификации пользователей userlist.txt

Для того что бы внести в этот файл настройки нам нужно предварительно получить дамп с реквизитами пользователей с помочью этих реквизитов будет выполняться аутентификация.

Выполнение дампа
1
psql -qAtX -F' ' -U postgres -c 'select rolname,rolpassword from pg_authid'

В результате получаем такой вывод:

Результаты выполнения дампа
1
2
postgres md5e188468785cb6aeafa6023a2716d7a8b
app_user md56ae0480d6db5c4c55b67cfc4bbaf417a

Открываем файл userlist.txt (/etc/pgbouncer) и добавляем нужного нам пользователя:

Пример строки которую нужно внести в файл userlist.txt
1
"postgres" "md5e188468785cb6aeafa6023a2716d7a8b"

Теперь запустим наш pgbouncer:

Команда запуска pgbouncer
1
/etc/init.d/pgbouncer start

Выполняем проверку подключения:

Команда для проверки подключения
1
psql -h localhost -p 6432 -U app_user app_db

Ну и для надежности можно заглянуть в логи:

Команда для просмотра логов
1
tail /var/log/postgresql/pgbouncer.log
Логи
1
2
2012-09-04 09:50:02.316 24164 LOG C-0x1f375d0: app_db/[email protected]:55103 login attempt: db=app_db user=app_user
2012-09-04 09:50:02.335 24164 LOG S-0x1f54f80: app_db/[email protected]:5432 new connection to server

Вот и все :) На этом настройка завершена. Всем добра :)