Пулінг з'єднань: 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'
);







