// 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. Команды выполняются в административном интерфейсе:

sql
-- серверы: 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 от OracleMySQL Router
Инфраструктура на MariaDB с подпискойMaxScale
Один сервер без репликпрокси не нужен: достаточно настроить пул соединений в приложении

Прокси сам становится точкой отказа, поэтому в продакшене его ставят минимум в двух экземплярах — например, рядом с каждым сервером приложения или парой за общим адресом.

Типичные ошибки

  • Все SELECT на реплики без учёта задержки. Пользователь сохраняет данные и не видит их после обновления страницы.
  • Один экземпляр прокси. Отказ прокси останавливает приложение так же, как отказ базы.
  • Административный интерфейс доступен снаружи. Его порт закрывают межсетевым экраном и меняют учётные данные по умолчанию.
  • Изменения только в runtime. Без SAVE … TO DISK настройки пропадут после перезапуска.

Полезные ссылки

// Похожая задача

Если у вас похожая ситуация

Эта статья относится к одной из рабочих тем. Можно продолжить чтение по теме, перейти на главную, чтобы понять, чем я занимаюсь, или сразу открыть услуги.

Тема статьи

Серверы и инфраструктура

VPS, Linux, веб-стек, миграции, хостинг, базы данных и базовая эксплуатация.

Часто с этим приходят

  • Перенести сайт или сервис на новый сервер
  • Настроить Linux, Nginx, базу данных и бэкапы
  • Разобраться, почему всё работает нестабильно

// Следующий шаг

Если вам нужна не только статья, а помощь по этой теме, удобнее сразу перейти в услугу. Главная и подборка материалов остаются рядом.

Открыть услуги

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ