Налаштування Connection Pooling (PgBouncer/ProxySQL) для веб-застосунку

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Налаштування Connection Pooling (PgBouncer/ProxySQL) для веб-застосунку
Середня
~2-3 робочих дні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Пулінг з'єднань: PgBouncer та ProxySQL

З'єднання з БД — дорогі ресурси: кожне коштує ОЗУ (стек потоку, буфери), потребує автентифікації, відкриває дескриптор файлу. Веб-додаток зі 100 одночасними користувачами × 10 запитів на користувача = 1000 одночасних з'єднань × 100-200 КБ на з'єднання = 100-200 МБ тільки на оверхед з'єднань.

Пулінг з'єднань розташований між додатком та БД: додаток підключається до пулу, пул утримує 50 реальних з'єднань з БД. Результат: 1000 з'єднань додатку стають 50 з'єднаннями БД.

PgBouncer: пул з'єднань PostgreSQL

Встановлення:

apt-get install pgbouncer

Конфігурація /etc/pgbouncer/pgbouncer.ini:

[databases]
mydb = host=localhost port=5432 dbname=mydb

[pgbouncer]
listen_port = 6432
listen_addr = 127.0.0.1

# Режими пулу
pool_mode = transaction

# Скільки з'єднань утримувати до бекенду
min_pool_size = 10
default_pool_size = 25
max_pool_size = 100

# З'єднання до додатку (клієнти)
max_client_conn = 1000

# Очищення неактивних з'єднань
idle_in_transaction_session_timeout = 300000  # 5 хв
server_idle_timeout = 600  # 10 хв до бекенду

# Логування
logfile = /var/log/pgbouncer/pgbouncer.log
loglevel = info

# Статистика
stats_period = 15

Режими пулу:

  • session — з'єднання до бекенду триває стільки, скільки з'єднання клієнта
  • transaction — з'єднання повертається в пул після кожної транзакції (рекомендовано для веб)
  • statement — з'єднання повертається після кожного запиту (найстрогіший, рідко використовується)

Моніторинг:

# Підключитися до консолі адміна
psql -U pgbouncer -d pgbouncer -p 6432 -h localhost

# Переглянути статистику
SHOW stats;
SHOW clients;
SHOW servers;

# Перезавантажити конфіг без перезавантаження
RELOAD;

ProxySQL: пул з'єднань MySQL та маршрутизація запитів

Встановлення:

apt-get install proxysql

Конфігурація через інтерфейс адміна:

-- Підключитися до інтерфейсу адміна
mysql -u admin -p 'admin' -P 6032 -h 127.0.0.1

-- Додати бекенд-серверів
INSERT INTO mysql_servers (hostgroup_id, hostname, port, weight, max_connections) VALUES
  (0, 'primary-db-1', 3306, 1000, 100),
  (1, 'replica-1', 3306, 1000, 100),
  (1, 'replica-2', 3306, 1000, 100);

-- Правила запитів: маршрутизувати SELECT на реплики
INSERT INTO mysql_query_rules (rule_id, match_pattern, destination_hostgroup, active) VALUES
  (1, '^SELECT ', 1, 1),  -- hostgroup 1 = реплики
  (2, '.*', 0, 1);        -- все інше = primary (hostgroup 0)

-- Застосувати
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;

-- Моніторинг
SHOW STATS;

Додаток підключається через:

$pdo = new PDO(
    'mysql:host=127.0.0.1;port=6033;dbname=mydb',
    'app_user',
    'password'
);