Пул соединений в Postgres
Пул соединений - это метод создания пула соединений и кэширования этих соединений, чтобы их можно было использовать повторно.
PostgreSQL имеет процесс postmaster, который порождает новые процессы для каждого нового подключения к базе данных. Этот процесс занимает от 2 до 3 МБ памяти, что происходит каждый раз, когда вы создаете соединение с базой данных. Без пула соединений для каждого соединения процесс postmaster должен порождать новый процесс на задней стороне, используя 2-3 МБ памяти, и это создает проблему, если количество соединений слишком велико (обычно это наблюдается в критически важных приложениях). Чем больше количество соединений, тем больше памяти расходуется на создание этих соединений.
При использовании пула соединений, каждый раз, когда внешнее приложение запрашивает создание соединения с базой данных, соединение создается из пула. После завершения сеанса или транзакции соединение возвращается в пул.
Как же это помогает повысить производительность?
Если поступает несколько запросов на создание соединения с той же базой данных и теми же данными имени пользователя, что и в предыдущем соединении, пул соединений не будет каждый раз создавать новое соединение с базой данных, а будет повторно использовать предыдущее соединение из пула. Это помогает предотвратить накладные расходы на создание нового соединения с базой данных каждый раз, когда поступает запрос на соединение с базой данных с тем же именем пользователя и данными базы данных. Пул соединений помогает в средах с большим количеством одновременных подключений к базе данных.
Хотя PostgreSQL не имеет встроенного пула соединений, большинство клиентских программ, используемых в качестве сервера приложений, предоставляют свой собственный пул. PostgreSQL предоставляет два отличных инструмента для решения проблемы траты ресурсов на каждое соединение с базой данных.
- PGPOOL
- PGBOUNCER
Оба этих инструмента были разработаны сообществом с учетом архитектуры PostgreSQL и предназначены специально для базы данных PostgreSQL. В то время как pgbouncer обеспечивает только пул соединений, pgpool обеспечивает пул соединений, балансировку нагрузки, высокую доступность и репликацию. Любой из этих инструментов можно использовать в зависимости от объема трафика, который вы ожидаете, и общей архитектуры вашей базы данных. Давайте посмотрим, как pgbouncer помогает улучшить производительность вашей базы данных, минимизируя время, необходимое для установления соединения с базой данных.
Как объяснялось ранее, Pgbouncer - это легкий пул соединений для PostgreSQL, который значительно сокращает время обработки и ресурсы для поддержания множества клиентских соединений с одной или несколькими базами данных. Pgbouncer поддерживает три типа пула при ротации соединений:
Session pooling: Серверное соединение назначается клиентскому приложению на весь срок действия клиентского соединения. PgBouncer возвращает серверное соединение обратно в пул, как только клиентское приложение отключается. Это метод по умолчанию.
Transaction pooling: Серверное соединение назначается клиентскому приложению на время транзакции. Когда PgBouncer обнаруживает завершение транзакции, он освобождает серверное соединение обратно в пул.
Statement pooling: Серверное соединение назначается клиентскому приложению для каждого утверждения. Когда утверждение завершается, серверное соединение возвращается в пул. В этом режиме не допускаются многоэтапные транзакции.
Как установить и настроить Pgbouncer:
Для этого я буду использовать Pgbouncer версии 1.9 на машине CentOS 7.
Установка:
- Загрузите файл pgbouncer-1.9.0.tar.gz на вашу Linux-машину для установки. Вы можете загрузить его с сайта Pgbouncer Download.
- Разархивируйте файл, в результате чего будет создана папка с именем pgbouncer-1.9.0.
- Пожалуйста, убедитесь, что пакеты gcc, libevent-devel и openssl-devel установлены, прежде чем приступать к конфигурированию. Перейдите в папку pgbouncer-1.9.0 и запустите:
./configure -prefix=/opt/pgbouncer
-prefix
позволит вам указать пользовательский каталог для установки. По умолчанию он будет установлен в /usr/local.
- После настройки выполните следующую команду для установки Pgbouncer
- make
- make install
- После установки ваши конфигурационные файлы и файл запуска Pgbouncer будут установлены в следующие директории
- /opt/pgbouncer/share/doc/pgbouncer
- /opt/pgbouncer/bin
- Чтобы запустить Pgbouncer в режиме демона, выполните следующую команду:
pgbouncer -d /opt/pgbouncer/share/doc/pgbouncer/pgbouncer.ini
Конфигурация:
- Для Pgbouncer важны два конфигурационных файла: pgbouncer.ini и userlist.txt.
- pgbouncer.ini - Этот файл содержит все параметры, которые должны быть настроены для вашего Pgbouncer.
- userlist.txt - Этот файл содержит имя пользователя и пароль вашей базы данных для аутентификации.
- Я настроил
pgbouncer.ini
иuserlist.txt
следующим образом:- Pgbouncer.ini
Benchmarkdb и enterprise - это псевдонимы для двух строк подключения. Обратите внимание, что значение pool_size было установлено только для тестирования. Это не рекомендуемое значение.
- Userslist.txt
Этот файл принимает входные данные в виде "username" "password". Пароль может быть как в обычном формате, так и в формате md5. Мы использовали пароль в формате md5 для обоих пользователей.
- Теперь просто перезапустите службу pgbouncer, как показано ниже
pgbouncer -R -d /opt/pgbouncer/share/doc/pgbouncer/pgbouncer.ini
- Вы можете проверить состояние пула и базы данных, войдя в базу данных pgbouncer, как показано ниже:
Теперь, чтобы проверить и подтвердить влияние пулера соединений, мы будем использовать pgbench для бенчмарка и pgbouncer в режиме пула сессий.
- pgbench был инициализирован с масштабным фактором 30. pgbouncer имеет pool_size равный 100.
- Мы будем тестировать сценарии с увеличением числа одновременных соединений, начиная с 300, 400 и 460. Для каждого соединения pgbench будет выполнять 20 транзакций, что приведет к общему количеству в 6000, 8000 и 9200 транзакций соответственно.
Ниже приведен результат анализа тестов
Общий анализ активности для соединений
- Соединения Pgbouncer
- Прямые соединения
Тесты можно проводить с различными настройками параметров pool_size и pool_mode для получения лучших результатов в соответствии с потребностями приложения.
Помимо параметров pool_size, pool_mode и деталей соединения, вы можете задать и другие параметры в конфигурационном файле pgbouncer. Ниже перечислены некоторые другие полезные параметры: -
- min_pool_size - Этот параметр определяет минимальное количество серверных соединений в пуле. В любой момент времени при использовании pgbouncer вы будете видеть это количество соединений на вашем сервере, как простаивающих, так и активных.
- reserve_pool_size - Дополнительные соединения, которые будут использоваться в случае проблем.
- server_idle_timeout (seconds) - Все соединения с сервером будут удалены после простоя в течение этого количества секунд.
- idle_transaction_timeout (seconds) - Закрывать соединения, которые находятся в состоянии "простоя в транзакции" в течение этого количества секунд.
- max_client_conn - Общее количество клиентов, которые могут подключиться.
Наконец, в заключение, как видно из приведенных выше графиков, с увеличением количества одновременных соединений pgbouncer увеличивает общую пропускную способность.