ProxySQL — open-source прокси-сервер, понимающий протокол MySQL. Размещается между приложением и кластером баз данных, прозрачно перехватывая SQL-трафик. Приложение подключается к ProxySQL как к обычному MySQL-серверу, а ProxySQL самостоятельно решает, на какой backend-сервер направить запрос — и всё это без изменения кода приложения.
Как работает
Ключевые возможности ProxySQL:
- Read/Write Splitting — операции
INSERT,UPDATE,DELETE,REPLACEавтоматически направляются на primary (мастер), аSELECT— на один из read-реплик по round-robin или взвешенному алгоритму. Настраивается через правила маршрутизации (mysql_query_rules) с использованием регулярных выражений. - Пул соединений (Connection Pooling) — ProxySQL поддерживает постоянные соединения к backend-серверам. Вместо 1000 соединений от приложения к БД — 20–50 постоянных соединений ProxySQL к MySQL, что снижает overhead рукопожатий.
- Кэширование запросов —
SELECT-запросы, совпадающие с правилом, кэшируются в памяти ProxySQL. TTL настраивается отдельно для каждого правила. - Failover — при падении мастера ProxySQL может автоматически повысить реплику (в связке с MySQL Group Replication или Orchestrator). Мониторинг backend'ов — встроенный (
proxysql_scheduler). - Мультиплексирование — одно backend-соединение обслуживает несколько клиентских соединений последовательно (при отсутствии транзакций).
Конфигурация ProxySQL ведётся через SQL-интерфейс (порт 6032). Все изменения применяются в runtime без перезапуска: LOAD MYSQL SERVERS TO RUNTIME; SAVE MYSQL SERVERS TO DISK;.
ProxySQL поддерживает Galera Cluster, Percona XtraDB Cluster, MySQL Group Replication. Для PostgreSQL аналогом является PgBouncer.
История
ProxySQL создан Рене Кэннаолой (René Cannao) и впервые опубликован на GitHub в 2015 году. Написан на C++. В 2016 году вышла версия 1.0. ProxySQL 2.0 (2019) добавил поддержку MySQL 8.0, GTID и улучшенный мониторинг. К 2020 году ProxySQL стал стандартным компонентом высоконагруженных MySQL-инфраструктур в компаниях типа Booking.com и Percona.
На что обращать внимание
ProxySQL не понимает семантику приложения: если запрос содержит SELECT ... FOR UPDATE или находится в явной транзакции — он направляется на мастер автоматически. Однако неявные транзакции (autocommit=0 у ORM) могут неожиданно блокировать read/write splitting. Мониторьте задержку репликации: при использовании replication_lag_action=pause запросы к запаздывающей реплике автоматически переводятся на мастер, но это создаёт нагрузку. ProxySQL сам должен быть высокодоступным — типовая схема: два ProxySQL-узла за keepalived с Virtual IP.
История ProxySQL
ProxySQL создан Рене Кэнновой в 2015 году как высокопроизводительный прокси для MySQL. ProxySQL 2.0 вышел в 2019 году с поддержкой MySQL 8.0 и шифрованием. К 2023 году используется в LinkedIn, GitHub, Dropbox. ProxySQL написан на C++ и обрабатывает более 1 миллиона запросов в секунду на одном сервере. Администрирование через MySQL-совместимый интерфейс на порту 6032. Конкурирует с MaxScale (MariaDB), MySQL Router, HAProxy (только L4).
Возможности ProxySQL
- Read/Write splitting: SELECT → реплика, INSERT/UPDATE/DELETE → мастер.
- Connection pooling: объединение соединений для снижения нагрузки на MySQL.
- Query routing: направление запросов в разные бэкенды по правилам regex.
- Query caching: кеширование SELECT-запросов в памяти.
- Failover: автоматическое переключение при падении мастера.
Практическое применение на хостинге
На VPS ProxySQL устанавливается между приложением и MySQL-сервером. Конфигурация через SQL-интерфейс: INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES(0,'db-master',3306). ProxySQL Admin (порт 6032) — управляющий интерфейс. Мониторинг через таблицы stats.stats_mysql_query_digest — показывает самые медленные запросы. В связке с Galera Cluster обеспечивает высокодоступный MySQL без простоев.