MySQL Proxy: Посредник для Базы Данных 🛠️
Опубликовано 28.10.2025
MySQL Proxy — это приложение-посредник, которое находится между клиентскими приложениями (например, вашим веб-сервером) и одним или несколькими серверами MySQL. Оно использует сетевой протокол MySQL (MySQL Network Protocol), что позволяет любому стандартному MySQL-совместимому клиенту подключаться к прокси без изменений, считая, что он общается напрямую с сервером MySQL.
Как Работает MySQL Proxy
В своей базовой конфигурации прокси просто перенаправляет запросы от клиента к серверу MySQL и возвращает ответы обратно.
Однако ключевая особенность MySQL Proxy и его аналогов — мониторинг, анализ и модификация проходящего трафика:
- Перехват — клиентский запрос попадает в прокси.
- Анализ/Модификация — прокси разбирает SQL (например, определяет тип операции:
SELECT,INSERT,UPDATE,DELETE) и может изменить запрос (добавитьWHERE,LIMIT, логирование и т.д.).Оригинальный MySQL Proxy использовал Lua-скрипты для этой логики.
- Маршрутизация/Действие — на основе анализа:
- Отправить на мастер (запись) или реплику (чтение).
- Балансировать нагрузку (Round-Robin, least connections и др.).
- Мультиплексировать соединения — тысячи клиентов → десятки бэкенд-соединений.
- Обработка ответа — модификация или анализ результата перед возвратом клиенту.
Всё это — без изменений в коде приложения и сервере MySQL.
Основные Функции и Задачи
| Категория | Задачи | Примеры применения |
|---|---|---|
| Масштабируемость | Read/Write Split, балансировка, шардинг | Распределение нагрузки в кластере |
| Доступность | Failover, мониторинг состояния серверов | Автоматическое переключение при сбое |
| Оптимизация | Кэширование, мультиплексирование, пулинг | Снижение нагрузки на БД |
| Безопасность | Аудит, фильтрация, блокировка SQL-инъекций | Журналирование, whitelist/blacklist |
| Наблюдаемость | Статистика запросов, профилирование | Поиск медленных запросов |
Типы MySQL Proxy
1. SQL-Aware Прокси (понимают SQL и протокол MySQL)
| Прокси | Разработчик | Основные функции | Мультиплексирование | Кэширование результатов | Read/Write Split | Failover | Шардинг | Активная поддержка |
|---|---|---|---|---|---|---|---|---|
| ProxySQL | ProxySQL Team | Высокая производительность, Query Rules, мониторинг, кэш | ✅ Да | ✅ Да | ✅ Да | ✅ Да | ❌ Нет | ✅ Да (активно) |
| MaxScale | MariaDB | Плагиновая архитектура, мониторы, фильтры, аудит | ❌ Нет | ❌ Нет | ✅ Да | ✅ Да | ✅ Да (через плагины) | ✅ Да |
| MySQL Router | Oracle | Простота, интеграция с InnoDB Cluster | ❌ Нет | ❌ Нет | ✅ Да | ✅ Да | ❌ Нет | ✅ Да |
| Vitess (VTGate) | YouTube / CNCF | Масштабирование на тысячи шард, облако | ✅ Да | ✅ Да (ограниченно) | ✅ Да | ✅ Да | ✅ Да | ✅ Да |
Примечание:
- Мультиплексирование — только ProxySQL и Vitess.
- Кэширование результатов SELECT — только ProxySQL и Vitess.
- Шардинг — Vitess и MaxScale (с плагинами).
2. TCP/Layer 4 Прокси (работают на уровне соединений)
| Прокси | Описание | Ограничения |
|---|---|---|
| HAProxy | Высокопроизводительный TCP/HTTP балансировщик | Не анализирует SQL → read/write split только по портам/IP |
| Keepalived | Обеспечивает VIP (виртуальный IP) для HA | Не прокси, а инструмент для отказоустойчивости самого прокси |
Рекомендация: HAProxy часто используется в связке с SQL-aware прокси (например, HAProxy → несколько ProxySQL).
⚠️ Важно: Оригинальный MySQL Proxy (от Oracle)
Устарел и не поддерживается с 2014 года (последний релиз — 0.8.5).
Не рекомендуется к использованию в продакшене.
Все его функции (и намного больше) реализованы в современных альтернативах.
ℹ️ Oracle не развивает open-source MySQL Proxy.
В MySQL Enterprise есть MySQL Router, но он не заменяет полноценный SQL-aware прокси.
Пример: Простая конфигурация ProxySQL (Read/Write Split)
-- Определяем бэкенды
insert into mysql_servers(hostgroup_id, hostname, port) values
(10, 'mysql-master', 3306), -- hostgroup 10 = запись
(20, 'mysql-slave-1', 3306), -- hostgroup 20 = чтение
(20, 'mysql-slave-2', 3306);
-- Правило: SELECT → на реплики, всё остальное → на мастер
insert into mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup) values
(1, 1, '^SELECT.*FOR UPDATE$', 10),
(2, 1, '^SELECT', 20),
(3, 1, '.*', 10);
load mysql servers to runtime;
save mysql servers to disk;
load mysql query rules to runtime;
save mysql query rules to disk;
Как выбрать прокси?
| Задача | Рекомендация | Почему |
|---|---|---|
| Read/Write Split + кэш + мультиплексирование | ProxySQL | Лёгкий, быстрый, гибкие правила |
| MariaDB + плагины + шардинг | MaxScale | Глубокая интеграция с MariaDB |
| MySQL InnoDB Cluster / Group Replication | MySQL Router | Официальная поддержка Oracle |
| Масштабирование на 1000+ шард (облако) | Vitess | Крупномасштабная архитектура |
| Простой балансер перед несколькими ProxySQL | HAProxy + Keepalived | TCP-уровень + HA |
Заключение
MySQL Proxy — мощный инструмент для масштабирования, отказоустойчивости и безопасности баз данных. Современные решения (ProxySQL, MaxScale, Vitess) полностью вытеснили устаревший оригинальный прокси от Oracle.
Выбирайте SQL-aware прокси, если нужна гибкость. TCP-прокси — только для простых сценариев или в связке.