К основному содержимому

ProxySQL: разделение чтения и записи между узлами

MySQL / MariaDB · 29.09.2026

Что такое ProxySQL и зачем он нужен

ProxySQL — это прокси-сервер уровня SQL, который стоит между приложением и серверами MySQL или MariaDB. Он принимает соединения от клиента на порту 6033, разбирает каждый запрос и решает, на какой сервер его отправить. Главная задача ProxySQL — разделение чтения и записи: запросы на запись (INSERT, UPDATE, DELETE) уходят на мастер, а SELECT-запросы распределяются между репликами.

Без прокси такую логику приходится зашивать в код приложения: держать два подключения, вручную выбирать соединение под тип запроса. ProxySQL убирает эту нагрузку с приложения и переносит её на отдельный слой, который можно менять без правки кода.

Как ProxySQL разделяет чтение и запись

В основе лежат три сущности: mysql_servers, mysql_users и mysql_query_rules. Серверы группируются в hostgroups — обычно группа 10 для записи (мастер) и группа 20 для чтения (реплики). Query rules — это правила с регулярными выражениями, которые проверяют текст запроса и назначают ему hostgroup.

  • Запрос начинается с SELECT — направляется в hostgroup чтения.
  • Запрос содержит SELECT ... FOR UPDATE — идёт на запись, чтобы не читать устаревшие данные.
  • INSERT, UPDATE, DELETE и DDL всегда идут в hostgroup записи.

Установка ProxySQL на Ubuntu и Debian

ProxySQL ставится из отдельного репозитория, в стандартных репозиториях Ubuntu его обычно нет. Пакет берут со страницы релизов проекта ProxySQL на GitHub. После установки сервис слушает два порта: 6032 для администрирования и 6033 для клиентских подключений.

wget -O /tmp/proxysql.deb repo.proxysql.com/deb/proxysql_2.6.0-ubuntu22_amd64.deb
dpkg -i /tmp/proxysql.deb
systemctl enable --now proxysql
mysql -u admin -padmin -h 127.0.0.1 -P 6032

Настройка серверов и hostgroups

После входа в административный интерфейс добавляют серверы и пользователей. Пароль пользователя в ProxySQL должен совпадать с паролем на реальном MySQL-сервере — прокси не хранит отдельную базу учётных данных, а лишь передаёт соединение дальше.

ПараметрЗначениеНазначение
hostgroup_id 10мастерприём записи и транзакций
hostgroup_id 20репликиприём SELECT-запросов
max_connections200лимит подключений к серверу
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (10, '10.0.0.11', 3306);
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES (20, '10.0.0.12', 3306);
INSERT INTO mysql_users(username, password, default_hostgroup) VALUES ('app', 'secret', 10);
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL USERS TO DISK;

Query rules: как направить запросы по нужным серверам

Правила добавляются в таблицу mysql_query_rules и применяются по порядку номеров. Первое совпадение побеждает, поэтому специфичные правила ставят выше общих. Настройку проверяют перед тем, как переключать боевой трафик через репликацию master-slave, чтобы прокси видел актуальный список реплик.

INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (100, 1, '^SELECT.*FOR UPDATE', 10, 1);
INSERT INTO mysql_query_rules(rule_id, active, match_pattern, destination_hostgroup, apply)
VALUES (200, 1, '^SELECT', 20, 1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;

Как проверить, что балансировка работает

После загрузки правил стоит понаблюдать за статистикой прокси: сколько запросов ушло на каждый hostgroup и нет ли ошибок подключения к репликам. Если у вас настроена GTID-репликация, ProxySQL умеет автоматически определять смену мастера через модуль ProxySQL Cluster или скрипт-чекер.

  • Таблица stats_mysql_query_digest показывает, какие запросы и на какой hostgroup идут чаще всего.
  • Таблица mysql_server_connect_log фиксирует ошибки подключения к серверам.
  • Команда SHOW MYSQL STATUS в интерфейсе 6032 выводит счётчики активных соединений.

Частые ошибки при настройке ProxySQL

Большинство проблем связано не с самим прокси, а с окружением вокруг него.

  • Пароль пользователя в mysql_users не совпадает с паролем на сервере MySQL — соединение падает с ошибкой доступа.
  • Забыли выполнить LOAD ... TO RUNTIME — изменения видны в конфигурации, но не применяются к трафику.
  • Реплика отстаёт от мастера, а SELECT ушёл на неё — приложение читает устаревшие данные. Здесь помогает мониторинг задержки репликации.
  • Лимит max_connections на сервере MySQL меньше, чем суммарная нагрузка от прокси — растёт число ошибок Too many connections.

Итог: чек-лист внедрения ProxySQL

  • Установить ProxySQL и проверить доступ к портам 6032 и 6033.
  • Добавить серверы в mysql_servers с правильными hostgroup_id.
  • Синхронизировать пользователей и пароли с реальными серверами MySQL.
  • Написать query rules от частных случаев к общим и загрузить их в runtime.
  • Настроить проверку статуса реплик и задержки перед боевым запуском.
← Назад в базу знаний Задать вопрос поддержке