// Engineering Log
Базы данных: Часть 7 — Прокси для MySQL: ProxySQL, MySQL Router и MaxScale
Опубликовано 22.09.2026
// Быстрый маршрут
Эта статья относится к теме Серверы и инфраструктура.
Прокси для MySQL — это программа между приложением и серверами базы данных. Приложение подключается к прокси как к обычному MySQL, а прокси решает, на какой сервер отправить запрос: запись — на основной, чтение — на реплики, а при отказе основного — на новый основной. Для приложения схема базы данных может меняться, а адрес подключения остаётся одним.
Зачем он нужен
- Разделение чтения и записи. Когда у базы есть реплики, прокси отправляет
SELECTна них, а изменения — на основной сервер. Приложение при этом не нужно переписывать под несколько адресов. - Пул соединений и мультиплексирование. Сотни клиентских подключений обслуживаются меньшим числом реальных соединений с сервером.
- Отказоустойчивость. Прокси проверяет серверы и перестаёт отправлять запросы на недоступный.
- Правила и защита. Можно ограничить или переписать опасные запросы, перенаправить тяжёлые отчёты на отдельную реплику, закешировать частые ответы.
Прокси не заменяет репликацию и резервные копии: он только распределяет запросы между уже настроенными серверами. Как устроена репликация в MySQL — во второй части цикла.
MySQL Proxy — историческое название
Проект MySQL Proxy давно не развивается: его репозиторий на GitHub переведён в архив, последние изменения датированы июлем 2015 года. Под этим названием его иногда ищут до сих пор, но для новых установок используют инструменты ниже.
ProxySQL
ProxySQL — самый распространённый прокси для MySQL и MariaDB, лицензия GPLv3, актуальная ветка — 3.0 (выпуск 3.0.11 вышел в августе 2026 года).
Основные понятия:
- hostgroup — группа серверов с одной ролью: например, 1 — основной сервер для записи, 2 — реплики для чтения;
- правила запросов (
mysql_query_rules) — регулярные выражения по тексту запроса, которые отправляют его в нужную группу; - интерфейс администратора — конфигурация хранится в таблицах и меняется командами SQL; изменения применяются командой
LOAD … TO RUNTIMEи сохраняются командойSAVE … TO DISK.
Пример разделения чтения и записи по документации ProxySQL. Команды выполняются в административном интерфейсе:
-- серверы: 1 — запись, 2 — чтение
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, '10.0.0.10', 3306);
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (2, '10.0.0.11', 3306);
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (2, '10.0.0.12', 3306);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
-- по умолчанию пользователь пишет в группу 1
UPDATE mysql_users SET default_hostgroup = 1;
LOAD MYSQL USERS TO RUNTIME;
-- SELECT ... FOR UPDATE — на основной сервер, остальные SELECT — на реплики
INSERT INTO mysql_query_rules (rule_id, active, match_digest, destination_hostgroup, apply)
VALUES (1, 1, '^SELECT.*FOR UPDATE', 1, 1),
(2, 1, '^SELECT', 2, 1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;Правило SELECT ... FOR UPDATE стоит первым: такие запросы блокируют строки и должны выполняться там же, где идёт запись. Разработчики ProxySQL советуют не начинать с отправки всех SELECT на реплики, а сначала найти по статистике (stats_mysql_query_digest) самые тяжёлые запросы и переносить на реплики только их.
Главный риск разделения чтения и записи — задержка реплик: сразу после записи реплика может ещё не содержать новых данных, и пользователь не увидит только что сохранённое. Запросы, которые читают только что записанное, оставляйте на основном сервере.
MySQL Router
MySQL Router — легковесный маршрутизатор от Oracle, часть экосистемы MySQL InnoDB Cluster и InnoDB ClusterSet. Он получает информацию о составе кластера из метаданных и сам переключает приложение на новый основной сервер после отказа. Правил запросов, как в ProxySQL, у него нет: чтение и запись обычно разделяют по разным портам, а приложение само выбирает, куда подключаться. Router уместен, если кластер уже построен средствами Oracle (MySQL Shell, Group Replication).
MaxScale
MaxScale — прокси компании MariaDB с разделением чтения и записи, фильтрами запросов и автоматическим переключением. Важная деталь — лицензия: это не открытое ПО, а Business Source License 1.1. Для версии 24.08 бесплатное использование разрешено, если в продакшене в сумме меньше трёх серверов баз данных; через оговорённый срок (для 24.08 — 09.09.2027) код переходит под GPL. Для большей инсталляции нужна коммерческая подписка MariaDB.
Что выбрать
| Ситуация | Выбор |
|---|---|
| Основной сервер и реплики MySQL или MariaDB, нужен пул и гибкие правила | ProxySQL |
| Кластер MySQL InnoDB Cluster от Oracle | MySQL Router |
| Инфраструктура на MariaDB с подпиской | MaxScale |
| Один сервер без реплик | прокси не нужен: достаточно настроить пул соединений в приложении |
Прокси сам становится точкой отказа, поэтому в продакшене его ставят минимум в двух экземплярах — например, рядом с каждым сервером приложения или парой за общим адресом.
Типичные ошибки
- Все
SELECTна реплики без учёта задержки. Пользователь сохраняет данные и не видит их после обновления страницы. - Один экземпляр прокси. Отказ прокси останавливает приложение так же, как отказ базы.
- Административный интерфейс доступен снаружи. Его порт закрывают межсетевым экраном и меняют учётные данные по умолчанию.
- Изменения только в runtime. Без
SAVE … TO DISKнастройки пропадут после перезапуска.
Полезные ссылки
// Похожая задача
Если у вас похожая ситуация
Эта статья относится к одной из рабочих тем. Можно продолжить чтение по теме, перейти на главную, чтобы понять, чем я занимаюсь, или сразу открыть услуги.
Тема статьи
Серверы и инфраструктура
VPS, Linux, веб-стек, миграции, хостинг, базы данных и базовая эксплуатация.
Часто с этим приходят
- Перенести сайт или сервис на новый сервер
- Настроить Linux, Nginx, базу данных и бэкапы
- Разобраться, почему всё работает нестабильно
// Следующий шаг
Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.
Открыть услуги// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related