bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

Установка и настройка PgBouncer на VPS для оптимизации соединений PostgreSQL

calendar_month Jul 25, 2026 schedule 20 мин. чтения visibility 42 просмотров
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

Установка и настройка PgBouncer на VPS для оптимизации соединений PostgreSQL

TL;DR

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

  • PgBouncer эффективно управляет пулом соединений, снижая нагрузку на PostgreSQL.
  • Мы настроим безопасное подключение с использованием TLS и аутентификации.
  • Будут рассмотрены различные режимы пулинга (Session, Transaction, Statement).
  • Руководство включает подготовку сервера, установку ПО, детальную конфигурацию и рекомендации по обслуживанию.
  • Все шаги проверяемы и используют актуальные версии ПО на 2026 год.
  • Оптимизация соединений позволит вашим приложениям работать стабильнее и быстрее.

Что мы настраиваем и зачем

Мы будем устанавливать и настраивать PgBouncer – легковесный прокси-сервер, который сидит между вашими клиентскими приложениями и сервером PostgreSQL. Его основная задача – пулинг (объединение) соединений с базой данных. В типичной архитектуре каждое клиентское приложение (например, веб-сервер) открывает собственное соединение с PostgreSQL. При большом количестве клиентов или частых подключениях/отключениях это приводит к значительной нагрузке на сервер базы данных, так как создание и закрытие каждого соединения – ресурсоемкая операция. PostgreSQL выделяет память и процессорное время на каждое активное соединение, что может быстро привести к исчерпанию ресурсов и замедлению работы.

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

Существуют альтернативы, такие как облачные управляемые базы данных (например, Amazon RDS, Google Cloud SQL, Azure Database for PostgreSQL), которые часто включают встроенные решения для пулинга соединений или предлагают масштабирование ресурсов по требованию. Однако, выбор self-hosted решения на VPS имеет свои преимущества. Во-первых, это полный контроль над конфигурацией и оптимизацией, что критично для специфических рабочих нагрузок. Во-вторых, это часто значительно дешевле в долгосрочной перспективе, особенно при стабильной или предсказуемой нагрузке. Наконец, self-hosted решение дает гибкость в интеграции с другими сервисами на вашем VPS и не привязывает вас к конкретному облачному провайдеру, что важно для минимизации vendor lock-in.

Какой VPS-конфиг нужен под эту задачу

Выбор конфигурации VPS для PgBouncer и PostgreSQL зависит от ожидаемой нагрузки, количества одновременных соединений и объема данных. PgBouncer сам по себе очень легковесен и потребляет минимальное количество ресурсов, но он выступает прокси для PostgreSQL, который может быть весьма требовательным.

Минимальные требования для небольших и средних проектов (до 50-100 одновременных подключений к PgBouncer)

  • CPU: 2 vCPU. PostgreSQL активно использует процессор, особенно при сложных запросах.
  • RAM: 4 GB. PostgreSQL может потреблять много RAM для кэширования данных и буферов. PgBouncer же требует очень мало памяти – десятки мегабайт.
  • Диск: 80 GB NVMe SSD. Для базы данных крайне важна скорость дисковой подсистемы. NVMe обеспечивает значительно более высокую производительность по сравнению с обычными SSD или HDD. Объем зависит от размера вашей базы данных и темпов роста.
  • Сеть: 100 Mbps или 1 Gbps. Для большинства задач достаточно 100 Mbps, но для высоконагруженных приложений с большим объемом передаваемых данных между приложением и базой данных лучше 1 Gbps.

Рекомендуемый VPS-план для большинства задач

Для более серьезных проектов, где ожидается до 200-300 одновременных подключений через PgBouncer и активная работа с базой данных, рассмотрите следующие характеристики:

  • CPU: 4 vCPU
  • RAM: 8-16 GB
  • Диск: 160-320 GB NVMe SSD
  • Сеть: 1 Gbps

Например, можно взять VPS с указанными характеристиками, который обеспечит достаточную производительность и стабильность для большинства веб-приложений и сервисов.

Когда нужен dedicated, а не VPS

Dedicated сервер становится необходим, когда:

  • Требуется максимальная производительность и изоляция: Для очень больших баз данных, высоконагруженных OLTP-систем или аналитических платформ, где каждый миллисекундный отклик критичен, и вы не хотите делиться ресурсами с другими пользователями.
  • Высокие требования к I/O: Когда дисковая подсистема VPS не справляется с объемом операций ввода-вывода, особенно при использовании RAID-массивов на dedicated сервере.
  • Особые требования к безопасности и комплаенсу: Некоторые регулирующие требования могут предписывать использование физически изолированного оборудования.
  • Масштабирование: Если ресурсы самого большого VPS плана уже не хватает, и требуется дальнейшее горизонтальное или вертикальное масштабирование, dedicated сервер предоставляет больше возможностей.

Локация: на что влияет

Выбор локации VPS имеет прямое влияние на задержку (latency) между вашим приложением и базой данных. Идеально, если ваш VPS с PgBouncer и PostgreSQL находится в том же дата-центре или географическом регионе, что и серверы ваших клиентских приложений. Это минимизирует пинг и обеспечивает наилучшую скорость обмена данными.

  • Близость к пользователям: Если ваши основные пользователи находятся в определенном регионе, размещение сервера там улучшит их опыт.
  • Близость к приложениям: Если ваш веб-сервер находится в одном регионе, а база данных в другом, это добавит задержку к каждому запросу к БД.
  • Законодательство: Некоторые страны имеют строгие законы о хранении данных, что может потребовать размещения данных в определенной юрисдикции.

Подготовка сервера

После провижининга нового VPS необходимо выполнить ряд базовых настроек для обеспечения безопасности и удобства управления. Мы будем использовать Ubuntu Server 24.04 LTS, так как это актуальная и стабильная версия на 2026 год.

1. Обновление системы

Первым делом обновим список пакетов и установленные пакеты до последних версий.


sudo apt update && sudo apt upgrade -y # Обновляем список пакетов и устанавливаем обновления

2. Создание нового пользователя с правами sudo

Работа под пользователем root небезопасна. Создадим нового пользователя и предоставим ему права sudo.


sudo adduser username # Создаем нового пользователя (замените 'username' на желаемое имя)
sudo usermod -aG sudo username # Добавляем пользователя в группу 'sudo'

Теперь выйдите из сессии root и войдите под новым пользователем.

3. Настройка аутентификации по SSH-ключам

Это более безопасный способ аутентификации, чем пароль. Если у вас еще нет пары SSH-ключей, сгенерируйте их на локальной машине (ssh-keygen).


mkdir -p ~/.ssh # Создаем директорию для ключей, если ее нет
chmod 700 ~/.ssh # Устанавливаем правильные права для директории
nano ~/.ssh/authorized_keys # Открываем файл для добавления публичного ключа

Вставьте ваш публичный SSH-ключ (начинается с ssh-rsa AAAA... или ssh-ed25519 AAAA...) в этот файл и сохраните (Ctrl+X, Y, Enter). Затем установите правильные права:


chmod 600 ~/.ssh/authorized_keys # Устанавливаем правильные права для файла ключей

После проверки входа по ключу, отключите вход по паролю для root и всех пользователей в /etc/ssh/sshd_config:


sudo nano /etc/ssh/sshd_config # Открываем конфигурацию SSH-сервера

Найдите и измените (или добавьте) следующие строки:


PermitRootLogin no
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

Сохраните изменения и перезапустите SSH-сервис:


sudo systemctl restart sshd # Перезапускаем SSH-сервер для применения изменений

4. Установка и настройка Fail2Ban

Fail2Ban сканирует логи и временно блокирует IP-адреса, которые показывают признаки вредоносных атак (например, множественные неудачные попытки входа по SSH).


sudo apt install fail2ban -y # Устанавливаем Fail2Ban (версия 0.12.0+ для Ubuntu 24.04)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Копируем конфиг для локальных изменений
sudo nano /etc/fail2ban/jail.local # Редактируем локальный конфиг

В файле jail.local убедитесь, что секция [sshd] включена (enabled = true) и настройте параметры по желанию (bantime, findtime, maxretry). Например:


[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
bantime = 1h # Время блокировки IP (1 час)
findtime = 10m # Время, за которое считаются попытки (10 минут)
maxretry = 3 # Максимальное количество попыток до блокировки

sudo systemctl enable fail2ban # Включаем автозапуск Fail2Ban при старте системы
sudo systemctl start fail2ban # Запускаем сервис Fail2Ban

5. Настройка брандмауэра (UFW)

UFW (Uncomplicated Firewall) – это простой интерфейс для настройки правил iptables. По умолчанию разрешим только SSH, HTTP(S) и порты для PostgreSQL/PgBouncer.


sudo apt install ufw -y # Устанавливаем UFW
sudo ufw allow ssh # Разрешаем SSH (порт 22)
sudo ufw allow http # Разрешаем HTTP (порт 80)
sudo ufw allow https # Разрешаем HTTPS (порт 443)
sudo ufw allow 5432/tcp # Разрешаем стандартный порт PostgreSQL
sudo ufw allow 6432/tcp # Разрешаем стандартный порт PgBouncer (мы будем использовать его)
sudo ufw enable # Включаем брандмауэр (подтвердите 'y')
sudo ufw status # Проверяем статус брандмауэра

Установка ПО — пошагово

Теперь, когда сервер подготовлен, приступим к установке PostgreSQL и PgBouncer. Мы будем использовать актуальные версии, доступные в репозиториях Ubuntu 24.04 LTS или из официальных источников.

1. Установка PostgreSQL

На 2026 год в Ubuntu 24.04 LTS скорее всего будет доступна PostgreSQL 16.x или 17.x через стандартные репозитории, но для максимальной актуальности и использования новых функций, мы будем ориентироваться на PostgreSQL 18.0+. Для этого добавим официальный репозиторий PostgreSQL.


sudo apt install curl gnupg2 -y # Устанавливаем утилиты для работы с ключами и репозиториями
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/postgresql.gpg # Добавляем GPG ключ PostgreSQL
echo "deb http://apt.postgresql.org/pub/repos/apt/ noble-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list > /dev/null # Добавляем репозиторий PostgreSQL для Ubuntu 24.04 (Noble Numbat)
sudo apt update # Обновляем список пакетов после добавления репозитория
sudo apt install postgresql-18 -y # Устанавливаем PostgreSQL 18 (актуальная версия на 2026 год)

Проверяем статус PostgreSQL:


sudo systemctl status postgresql # Проверяем, что PostgreSQL запущен

По умолчанию PostgreSQL создает пользователя postgres и базу данных postgres. Для безопасности и удобства создадим отдельного пользователя и базу данных для вашего приложения.


sudo -i -u postgres # Переключаемся на пользователя postgres
psql # Запускаем консоль psql

В консоли psql:


CREATE USER myappuser WITH PASSWORD 'your_strong_password'; -- Создаем пользователя для приложения
CREATE DATABASE myappdb OWNER myappuser; -- Создаем базу данных для приложения, владельцем которой является myappuser
GRANT ALL PRIVILEGES ON DATABASE myappdb TO myappuser; -- Предоставляем все права на базу данных
\q # Выходим из psql
exit # Выходим из пользователя postgres

2. Установка PgBouncer

PgBouncer также доступен через стандартные репозитории Ubuntu. На 2026 год ожидается версия 1.23.0 или выше.


sudo apt install pgbouncer -y # Устанавливаем PgBouncer

Проверяем, что PgBouncer установлен и его версия:


pgbouncer --version # Проверяем версию PgBouncer (ожидается 1.23.0+)

По умолчанию PgBouncer не запущен или настроен на минимальные параметры. Мы настроим его в следующем разделе.

3. Настройка PostgreSQL для работы с PgBouncer

PgBouncer будет подключаться к PostgreSQL как обычный клиент. Необходимо убедиться, что PostgreSQL разрешает подключения с локального хоста. Редактируем файл pg_hba.conf.


sudo nano /etc/postgresql/18/main/pg_hba.conf # Открываем файл конфигурации доступа к хосту

Добавьте следующую строку в конец файла, чтобы разрешить PgBouncer подключаться с локального хоста:


# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

Также убедитесь, что PostgreSQL слушает на локальном интерфейсе. Редактируем postgresql.conf:


sudo nano /etc/postgresql/18/main/postgresql.conf # Открываем основной конфигурационный файл PostgreSQL

Найдите строку listen_addresses и убедитесь, что она включает localhost:


listen_addresses = 'localhost' # PostgreSQL будет слушать только на локальном интерфейсе

Сохраните изменения и перезапустите PostgreSQL:


sudo systemctl restart postgresql # Перезапускаем PostgreSQL для применения изменений

Конфигурация

Теперь мы перейдем к детальной настройке PgBouncer. Основной конфигурационный файл находится по адресу /etc/pgbouncer/pgbouncer.ini.

1. Основной конфигурационный файл PgBouncer (pgbouncer.ini)

Откроем файл для редактирования:


sudo nano /etc/pgbouncer/pgbouncer.ini # Открываем конфигурационный файл PgBouncer

Вот пример конфигурации с важными комментариями:


[databases]
# Имя базы данных, как ее будут видеть клиенты PgBouncer
# Формат: <имя_БД_для_клиента> = host=<хост_PostgreSQL> port=<порт_PostgreSQL> dbname=<имя_БД_PostgreSQL> user=<пользователь_PgBouncer>
# В нашем случае PgBouncer будет подключаться к локальному PostgreSQL
myappdb = host=127.0.0.1 port=5432 dbname=myappdb user=pgbouncer_admin

[pgbouncer]
listen_addr = 0.0.0.0 # PgBouncer будет слушать на всех сетевых интерфейсах
listen_port = 6432 # Порт, на котором PgBouncer будет принимать соединения от клиентов

auth_type = md5 # Тип аутентификации для клиентов, подключающихся к PgBouncer (md5, plain, hba, cert, trust, any)
auth_file = /etc/pgbouncer/userlist.txt # Файл со списком пользователей и их паролей для PgBouncer

admin_users = pgbouncer_admin # Пользователи, которые могут подключаться к псевдо-БД "pgbouncer" для управления
stats_users = pgbouncer_admin # Пользователи, которые могут просматривать статистику

pool_mode = session # Режим пулинга: session, transaction, statement
# session: соединение возвращается в пул только после отключения клиента. Самый простой, но наименее эффективный.
# transaction: соединение возвращается в пул после каждой транзакции. Рекомендуется для большинства веб-приложений.
# statement: соединение возвращается в пул после каждого запроса (statement). Самый агрессивный, но может нарушить логику приложений, использующих сессионные переменные.

default_pool_size = 20 # Количество соединений, которые PgBouncer будет поддерживать с каждой БД по умолчанию
min_pool_size = 5 # Минимальное количество соединений, которые PgBouncer будет держать открытыми
max_client_conn = 1000 # Максимальное количество клиентов, которые могут подключиться к PgBouncer
max_db_connections = 0 # Максимальное количество соединений PgBouncer к одной БД (0 = no limit)
max_user_connections = 0 # Максимальное количество соединений для одного пользователя (0 = no limit)

# Таймауты
server_lifetime = 3600 # Соединение с сервером PostgreSQL будет пересоздаваться каждые 3600 секунд (1 час)
server_idle_timeout = 600 # Закрывать бездействующие соединения с PostgreSQL через 600 секунд
client_idle_timeout = 300 # Закрывать бездействующие соединения клиентов PgBouncer через 300 секунд

# Логирование
logfile = /var/log/pgbouncer/pgbouncer.log
pidfile = /var/run/pgbouncer/pgbouncer.pid
log_connections = 1
log_disconnections = 1
log_pooler_errors = 1

# TLS/SSL настройки для соединений между PgBouncer и PostgreSQL
# Если ваш PostgreSQL настроен на использование TLS, PgBouncer должен его использовать
server_tls_sslmode = prefer # Режим SSL для PgBouncer -> PostgreSQL (disable, allow, prefer, require, verify-ca, verify-full)
server_tls_ca_file = /etc/ssl/certs/ca-certificates.crt # CA сертификат для проверки PostgreSQL сервера
server_tls_key_file = # Если PgBouncer нужен клиентский сертификат для PostgreSQL
server_tls_cert_file = # Если PgBouncer нужен клиентский сертификат для PostgreSQL

# TLS/SSL настройки для соединений между клиентами и PgBouncer
# Клиенты могут подключаться к PgBouncer по TLS
client_tls_sslmode = disable # Режим SSL для Client -> PgBouncer (disable, allow, prefer, require, verify-ca, verify-full)
client_tls_key_file = /etc/ssl/private/pgbouncer-key.pem # Закрытый ключ для TLS
client_tls_cert_file = /etc/ssl/certs/pgbouncer-cert.pem # Сертификат для TLS

Сохраните изменения.

2. Файл пользователей PgBouncer (userlist.txt)

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


sudo nano /etc/pgbouncer/userlist.txt # Открываем файл для редактирования

Добавьте следующую строку, заменив your_pgbouncer_admin_password на надежный пароль. Для пароля клиента myappuser используйте тот же пароль, что и при создании пользователя в PostgreSQL.


"pgbouncer_admin" "your_pgbouncer_admin_password"
"myappuser" "your_strong_password"

Важно: Пароли здесь хранятся в открытом виде. Убедитесь, что права на файл userlist.txt очень строгие.


sudo chmod 600 /etc/pgbouncer/userlist.txt # Устанавливаем строгие права

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


sudo -i -u postgres # Переключаемся на пользователя postgres
psql # Запускаем консоль psql

В консоли psql:


CREATE USER pgbouncer_admin WITH PASSWORD 'your_pgbouncer_admin_password'; -- Создаем пользователя PgBouncer
GRANT CONNECT ON DATABASE myappdb TO pgbouncer_admin; -- Предоставляем права на подключение к базе данных
\q # Выходим из psql
exit # Выходим из пользователя postgres

3. Настройка TLS/SSL для PgBouncer

Для безопасного соединения между клиентом и PgBouncer, а также между PgBouncer и PostgreSQL, рекомендуется использовать TLS. Если вы используете Certbot для веб-сервера, вы можете переиспользовать его сертификаты, либо сгенерировать самоподписанные для внутренних нужд. Для публичного доступа используйте Certbot/Caddy.

Предположим, вы хотите использовать Certbot для получения сертификатов. Если у вас уже есть домен, настроенный на вашем VPS, и вы используете Caddy или Nginx, вы можете получить сертификат для вашего домена (например, pg.yourdomain.com).


sudo apt install certbot -y # Устанавливаем Certbot
sudo certbot certonly --standalone -d pg.yourdomain.com # Получаем сертификат для домена (замените на свой)

После получения сертификатов, Certbot поместит их в /etc/letsencrypt/live/pg.yourdomain.com/. Скопируйте их в место, доступное PgBouncer, и установите правильные права:


sudo mkdir -p /etc/ssl/pgbouncer # Создаем директорию для сертификатов PgBouncer
sudo cp /etc/letsencrypt/live/pg.yourdomain.com/fullchain.pem /etc/ssl/pgbouncer/pgbouncer-cert.pem
sudo cp /etc/letsencrypt/live/pg.yourdomain.com/privkey.pem /etc/ssl/pgbouncer/pgbouncer-key.pem
sudo chmod 600 /etc/ssl/pgbouncer/pgbouncer-key.pem # Закрытый ключ должен быть доступен только PgBouncer
sudo chown pgbouncer:pgbouncer /etc/ssl/pgbouncer/ # Меняем владельца файлов на пользователя pgbouncer

Обновите pgbouncer.ini, указав правильные пути к сертификатам:


client_tls_sslmode = require # Требовать TLS от клиентов
client_tls_key_file = /etc/ssl/pgbouncer/pgbouncer-key.pem
client_tls_cert_file = /etc/ssl/pgbouncer/pgbouncer-cert.pem

Если вы хотите, чтобы PgBouncer также использовал TLS для подключения к PostgreSQL (что рекомендуется), убедитесь, что ваш PostgreSQL настроен на TLS, и укажите server_tls_sslmode = require, а также server_tls_ca_file. Если PostgreSQL находится на том же сервере, вы можете использовать системные CA-сертификаты. Для PostgreSQL 18+ TLS включен по умолчанию с самоподписанным сертификатом, но для продакшена лучше использовать CA-подписанные.

4. Запуск и проверка PgBouncer

После всех настроек перезапустите PgBouncer.


sudo systemctl restart pgbouncer # Перезапускаем PgBouncer
sudo systemctl enable pgbouncer # Включаем автозапуск PgBouncer
sudo systemctl status pgbouncer # Проверяем статус PgBouncer

Убедитесь, что PgBouncer запущен и не содержит ошибок в логах (sudo journalctl -u pgbouncer).

5. Проверка работоспособности

Теперь попробуем подключиться к базе данных через PgBouncer с локального сервера.


psql -h 127.0.0.1 -p 6432 -U myappuser -d myappdb # Подключаемся к PgBouncer

Вас попросят ввести пароль для myappuser. После успешного подключения вы окажетесь в консоли psql, но уже через PgBouncer. Выполните простой запрос:


SELECT 1;
\conninfo # Покажет, что вы подключены к PgBouncer, а не напрямую к PostgreSQL
\q

Для проверки статистики PgBouncer, подключитесь к специальной псевдо-базе данных pgbouncer с пользователем pgbouncer_admin:


psql -h 127.0.0.1 -p 6432 -U pgbouncer_admin -d pgbouncer # Подключаемся к админ-интерфейсу PgBouncer

В консоли psql:


SHOW STATS; # Показать общую статистику пулинга
SHOW POOLS; # Показать статус пулов соединений
SHOW CLIENTS; # Показать активных клиентов
SHOW SERVERS; # Показать активные соединения с PostgreSQL
\q

Эти команды помогут вам мониторить работу PgBouncer.

Бэкапы и обслуживание

Надежная стратегия резервного копирования и регулярное обслуживание критически важны для любой production-системы с базой данных.

1. Что бэкапить

  • Базы данных PostgreSQL: Это самый важный компонент. Необходимо регулярно создавать полные дампы баз данных.
  • Конфигурационные файлы: /etc/postgresql/18/main/postgresql.conf, /etc/postgresql/18/main/pg_hba.conf, /etc/pgbouncer/pgbouncer.ini, /etc/pgbouncer/userlist.txt, а также любые скрипты или файлы Certbot, связанные с TLS.
  • Данные приложений: Если ваше приложение хранит пользовательские файлы или другие данные на диске VPS, их также нужно бэкапить.

2. Простой скрипт автобэкапа PostgreSQL

Мы создадим простой скрипт, который будет создавать дамп всех баз данных PostgreSQL и сохранять его в зашифрованном виде. Для шифрования и эффективного хранения можно использовать borgbackup или restic, но для простоты пока ограничимся pg_dumpall и сжатием.


sudo mkdir -p /opt/backups # Создаем директорию для бэкапов
sudo nano /opt/backups/backup_pg.sh # Создаем скрипт бэкапа

Содержимое backup_pg.sh:


#!/bin/bash

# Путь для сохранения бэкапов
BACKUP_DIR="/opt/backups"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILE="$BACKUP_DIR/postgresql_all_databases_$DATE.sql.gz"
CONFIG_BACKUP_DIR="$BACKUP_DIR/configs"

# Создаем директории, если их нет
mkdir -p "$BACKUP_DIR"
mkdir -p "$CONFIG_BACKUP_DIR"

echo "Начинаем создание бэкапа PostgreSQL..."

# Создаем дамп всех баз данных PostgreSQL
sudo -u postgres pg_dumpall | gzip > "$BACKUP_FILE"

if [ $? -eq 0 ]; then
    echo "Бэкап базы данных успешно создан: $BACKUP_FILE"
else
    echo "Ошибка при создании бэкапа базы данных!"
    exit 1
fi

echo "Начинаем бэкап конфигурационных файлов..."

# Копируем конфигурационные файлы
cp /etc/postgresql/18/main/postgresql.conf "$CONFIG_BACKUP_DIR/postgresql.conf_$DATE"
cp /etc/postgresql/18/main/pg_hba.conf "$CONFIG_BACKUP_DIR/pg_hba.conf_$DATE"
cp /etc/pgbouncer/pgbouncer.ini "$CONFIG_BACKUP_DIR/pgbouncer.ini_$DATE"
cp /etc/pgbouncer/userlist.txt "$CONFIG_BACKUP_DIR/userlist.txt_$DATE"

echo "Бэкап конфигурационных файлов завершен."

# Удаляем старые бэкапы (например, старше 7 дней)
find "$BACKUP_DIR" -name "postgresql_all_databases_.sql.gz" -mtime +7 -delete
find "$CONFIG_BACKUP_DIR" -name "_$DATE" -mtime +7 -delete

echo "Удалены старые бэкапы."
echo "Бэкап завершен."

sudo chmod +x /opt/backups/backup_pg.sh # Делаем скрипт исполняемым

Настроим выполнение скрипта с помощью cron. Например, ежедневно в 3:00 ночи.


sudo crontab -e # Открываем crontab для root (или sudo crontab -e -u username)

Добавьте следующую строку в конец файла:


0 3    /opt/backups/backup_pg.sh > /var/log/backup_pg.log 2>&1 # Ежедневный бэкап в 3 утра

3. Куда складывать бэкапы

Никогда не храните бэкапы на том же сервере, что и оригинальные данные. Если сервер выйдет из строя, вы потеряете и данные, и бэкапы.

  • Внешний S3-совместимый объектный сторадж: Наиболее рекомендуемый вариант. Дешево, надежно, масштабируемо. Используйте утилиты типа s3cmd, rclone или awscli для автоматической синхронизации бэкапов с S3.
  • Отдельный VPS: Вы можете арендовать небольшой VPS специально для хранения бэкапов и использовать rsync или scp для их передачи по SSH.
  • Сетевое хранилище (NFS/SMB): Если у вас есть собственная инфраструктура.

Пример отправки на S3 с rclone (после его настройки):


# Добавьте в ваш скрипт backup_pg.sh после создания бэкапов
echo "Отправка бэкапов на S3..."
rclone sync "$BACKUP_DIR" "my-s3-remote:my-backup-bucket/pgbouncer-vps/" # Замените 'my-s3-remote' и 'my-backup-bucket'
echo "Отправка на S3 завершена."

4. Обновления: rolling vs maintenance window

  • Обновления ОС и PgBouncer: Для незначительных обновлений безопасности можно использовать rolling-обновления, но всегда с тестовым прогоном. Для мажорных версий лучше планировать окно обслуживания. PgBouncer можно перезапускать без остановки PostgreSQL, но при этом все активные клиентские соединения будут разорваны.
  • Обновления PostgreSQL: Мажорные обновления PostgreSQL (например, с 17 до 18) требуют миграции данных и всегда должны выполняться в заранее запланированное окно обслуживания, с полным бэкапом и планом отката. Минорные обновления (например, 18.1 до 18.2) обычно безопасны и могут быть применены с минимальным временем простоя.
  • Мониторинг: После любых обновлений критически важно отслеживать логи и метрики производительности.

Troubleshooting + FAQ

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

1. Ошибка "Connection refused" при подключении к PgBouncer

Что проверить: Убедитесь, что PgBouncer запущен и слушает на правильном IP-адресе и порту. Проверьте статус сервиса pgbouncer (sudo systemctl status pgbouncer) и логи (sudo journalctl -u pgbouncer). Также убедитесь, что брандмауэр (UFW) разрешает входящие соединения на порт PgBouncer (по умолчанию 6432) – sudo ufw status.

Как фиксить: Если PgBouncer не запущен, запустите его (sudo systemctl start pgbouncer). Если порт заблокирован, добавьте правило UFW (sudo ufw allow 6432/tcp). Проверьте listen_addr и listen_port в /etc/pgbouncer/pgbouncer.ini.

2. Ошибка "Authentication failed" при подключении клиента к PgBouncer

Что проверить: Убедитесь, что пользователь и пароль, которые клиент использует для подключения к PgBouncer, корректно указаны в файле /etc/pgbouncer/userlist.txt. Проверьте регистр символов и опечатки. Убедитесь, что auth_type в pgbouncer.ini соответствует ожидаемому (например, md5).

Как фиксить: Исправьте пароль в userlist.txt или обновите пароль клиента. Перезапустите PgBouncer (sudo systemctl restart pgbouncer) после изменения userlist.txt.

3. PgBouncer не может подключиться к PostgreSQL (ошибка "server connection failed")

Что проверить: Убедитесь, что PostgreSQL запущен и слушает на IP-адресе и порту, указанных в секции [databases] файла pgbouncer.ini (по умолчанию 127.0.0.1:5432). Проверьте статус postgresql (sudo systemctl status postgresql). Убедитесь, что пользователь, которого PgBouncer использует для подключения к PostgreSQL (например, pgbouncer_admin), существует в PostgreSQL и имеет правильный пароль, а также что pg_hba.conf разрешает этому пользователю подключаться с 127.0.0.1.

Как фиксить: Проверьте listen_addresses в /etc/postgresql/18/main/postgresql.conf и правила в /etc/postgresql/18/main/pg_hba.conf. Убедитесь, что пользователь PgBouncer (например, pgbouncer_admin) создан в PostgreSQL с тем же паролем, что и в userlist.txt. Перезапустите PostgreSQL после изменений в его конфигах.

4. Медленная работа приложения после внедрения PgBouncer

Что проверить: Проверьте режим пулинга (pool_mode) в pgbouncer.ini. Режим statement может вызывать проблемы, если ваше приложение полагается на сессионные переменные или временные таблицы. Убедитесь, что default_pool_size и max_client_conn достаточно велики для вашей нагрузки.

Как фиксить: Попробуйте изменить pool_mode на transaction, который подходит для большинства веб-приложений. Увеличьте default_pool_size, чтобы PgBouncer поддерживал больше активных соединений с PostgreSQL. Проанализируйте логи PgBouncer и PostgreSQL на предмет ошибок или предупреждений, связанных с блокировками или нехваткой соединений.

5. Какой VPS-конфиг минимально подойдёт?

Минимальный VPS-конфиг для PgBouncer и PostgreSQL для небольших проектов (до 50 одновременных подключений) должен включать 2 vCPU, 4 GB RAM и 80 GB NVMe SSD. Этого будет достаточно для базовой работы и тестирования, а также для небольших веб-приложений. Для более серьезных задач рекомендуется увеличивать ресурсы.

6. Что выбрать — VPS или dedicated для этой задачи?

Для большинства средних проектов и стартапов VPS будет оптимальным выбором, предлагая хороший баланс между стоимостью и производительностью. Dedicated сервер рекомендуется для очень высоконагруженных систем, критически важных приложений с жесткими требованиями к производительности I/O, или когда требуется полная изоляция ресурсов и максимальный контроль над аппаратным обеспечением. Если вы только начинаете, VPS — это более гибкий и экономичный вариант.

7. Как мониторить PgBouncer?

Вы можете использовать специальную псевдо-базу данных pgbouncer для получения статистики. Подключитесь к ней как psql -h 127.0.0.1 -p 6432 -U pgbouncer_admin -d pgbouncer, а затем используйте команды SHOW STATS;, SHOW POOLS;, SHOW CLIENTS;, SHOW SERVERS;. Для более продвинутого мониторинга можно интегрировать PgBouncer с Prometheus и Grafana, используя экспортер PgBouncer.

8. Как обновить PgBouncer без простоя?

Для обновления PgBouncer можно использовать команду RELOAD через админ-интерфейс (psql -h 127.0.0.1 -p 6432 -U pgbouncer_admin -d pgbouncer, затем RELOAD;). Это перезагрузит конфигурацию без разрыва существующих соединений. Для мажорных обновлений или обновлений, требующих перезапуска сервиса, можно использовать команду PAUSE, затем RESTART, что позволит существующим транзакциям завершиться, прежде чем PgBouncer перезапустится и примет новые соединения.

Выводы и следующие шаги

Поздравляем! Вы успешно установили и настроили PgBouncer на вашем VPS, значительно улучшив управление соединениями с PostgreSQL. Теперь ваше приложение будет работать стабильнее, потреблять меньше ресурсов базы данных и быть более устойчивым к пиковым нагрузкам. Вы получили полный контроль над пулингом соединений, что является ключевым элементом для масштабируемых и высокопроизводительных систем.

Следующие шаги для дальнейшей оптимизации и развития:

  1. Мониторинг производительности: Внедрите комплексную систему мониторинга (например, Prometheus + Grafana) для отслеживания метрик PgBouncer (количество соединений, задержки) и PostgreSQL (нагрузка на CPU/RAM, дисковые операции, медленные запросы). Это поможет выявить узкие места и скорректировать конфигурацию.
  2. Оптимизация запросов: Проанализируйте медленные запросы в PostgreSQL (используя pg_stat_statements) и оптимизируйте их, добавляя индексы, переписывая запросы или денормализуя данные. Даже с PgBouncer неоптимизированные запросы могут стать бутылочным горлышком.
  3. Масштабирование PostgreSQL: По мере роста нагрузки рассмотрите возможности горизонтального масштабирования PostgreSQL, такие как репликация (для чтения), шардинг или использование логической репликации для аналитических задач. PgBouncer может быть настроен для работы с несколькими репликами.

Был ли этот гайд полезен?

Ваш отзыв помогает нам улучшать гайды.

Поделиться записью:

Отправьте гайд тому, кому он может пригодиться.

Telegram VKVK WhatsApp Facebook LinkedIn XX

установка и настройка pgbouncer на vps для оптимизации соединений postgresql
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.