Что такое 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_connections | 200 | лимит подключений к серверу |
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.
- Настроить проверку статуса реплик и задержки перед боевым запуском.