· 15 мин чтения

MariaDB MaxScale: настройка умного прокси перед кластером баз данных

MariaDB MaxScale: настройка умного прокси перед кластером баз данных

Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет эксплуатации MariaDB/MySQL в корпоративных проектах я перепробовал всё: HAProxy, ProxySQL, Galera Load Balancer, самописные скрипты failover. И чаще всего останавливался на MaxScale — когда требуется именно умный прокси, понимающий SQL. В дата-центре МТС у меня работают три инсталляции MaxScale перед Galera-кластерами на Dell Xeon Platinum 8280, которые держат десятки тысяч транзакций в час без единой ошибки failover.

Что делает MaxScale и зачем он нужен

MaxScale — это прокси от разработчиков MariaDB, который стоит между приложением и кластером БД. В отличие от HAProxy, он разбирает MySQL-протокол и принимает решения на основе типа запроса, состояния узлов, сессии пользователя.

Установка MaxScale 23.08

# Ubuntu 22.04
curl -LsS https://r.mariadb.com/downloads/mariadb_repo_setup | \
  sudo bash -s -- --mariadb-maxscale-version="23.08"

apt update
apt install maxscale

# Проверка
maxscale --version
systemctl status maxscale

Подготовка пользователей на узлах БД

MaxScale нужно два сервисных аккаунта: один для чтения схем и мониторинга, второй для проксирования клиентских соединений. Создаются на любом узле Galera — репликация разнесёт.

-- Пользователь мониторинга
CREATE USER 'maxscale_mon'@'%' IDENTIFIED BY 'MonPass2026!';
GRANT SELECT ON mysql.user TO 'maxscale_mon'@'%';
GRANT SELECT ON mysql.db TO 'maxscale_mon'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale_mon'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxscale_mon'@'%';
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'maxscale_mon'@'%';
GRANT SLAVE MONITOR ON *.* TO 'maxscale_mon'@'%';

-- Пользователь проксирования
CREATE USER 'maxscale_router'@'%' IDENTIFIED BY 'RouterPass2026!';
GRANT SELECT ON mysql.* TO 'maxscale_router'@'%';
GRANT SHOW DATABASES ON *.* TO 'maxscale_router'@'%';

FLUSH PRIVILEGES;

Основной конфигурационный файл

# /etc/maxscale.cnf
[maxscale]
threads=auto
syslog=true
log_info=true

# Серверы Galera-кластера
[server1]
type=server
address=10.0.10.11
port=3306
protocol=MariaDBBackend

[server2]
type=server
address=10.0.10.12
port=3306
protocol=MariaDBBackend

[server3]
type=server
address=10.0.10.13
port=3306
protocol=MariaDBBackend

# Мониторинг Galera
[Galera-Monitor]
type=monitor
module=galeramon
servers=server1,server2,server3
user=maxscale_mon
password=MonPass2026!
monitor_interval=2s
available_when_donor=false
disable_master_failback=false

# Сервис с readwritesplit
[Galera-Service]
type=service
router=readwritesplit
servers=server1,server2,server3
user=maxscale_router
password=RouterPass2026!
max_slave_connections=100%
master_failure_mode=fail_on_write
causal_reads=true
transaction_replay=true

# Listener — точка входа для клиентов
[Galera-Listener]
type=listener
service=Galera-Service
protocol=MariaDBClient
port=4006

# Веб-интерфейс и REST API
[MaxAdmin-Listener]
type=listener
service=MaxInfo
protocol=HTTPD
port=8989

Запуск и проверка

systemctl enable --now maxscale
systemctl status maxscale

# Посмотреть состояние серверов
maxctrl list servers

# Состояние сервиса
maxctrl list services
maxctrl show service Galera-Service

# Статистика соединений
maxctrl list sessions

В выводе maxctrl list servers вы увидите роли: Master, Slave, Synced. При правильной настройке Galera один узел будет Master (куда идёт запись), остальные — Slave+Synced.

Master-Slave репликация: readconnroute

Для классического master-slave с асинхронной репликацией используется другой роутер — readconnroute. Он проще и быстрее, но не умеет разбирать транзакции.

[MySQL-Monitor]
type=monitor
module=mariadbmon
servers=master1,slave1,slave2
user=maxscale_mon
password=MonPass2026!
auto_failover=true
auto_rejoin=true
enforce_read_only_slaves=true

[Read-Service]
type=service
router=readconnroute
router_options=slave
servers=master1,slave1,slave2
user=maxscale_router
password=RouterPass2026!

[Write-Service]
type=service
router=readconnroute
router_options=master
servers=master1,slave1,slave2
user=maxscale_router
password=RouterPass2026!

[Read-Listener]
type=listener
service=Read-Service
port=4008

[Write-Listener]
type=listener
service=Write-Service
port=4009

Приложение подключается к 4008 для SELECT и к 4009 для INSERT/UPDATE/DELETE. Модульнее и предсказуемее, чем умный readwritesplit.

HA самого MaxScale через Keepalived

Один MaxScale — единая точка отказа. Я всегда ставлю минимум два экземпляра на разные виртуалки и связываю их через Keepalived с плавающим IP.

# /etc/keepalived/keepalived.conf на активном узле
vrrp_script check_maxscale {
    script "/usr/bin/systemctl is-active maxscale"
    interval 2
    weight 10
}

vrrp_instance VI_MAXSCALE {
    state MASTER
    interface ens18
    virtual_router_id 51
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass MaxScaleVRRP2026
    }
    virtual_ipaddress {
        10.0.10.100/24
    }
    track_script {
        check_maxscale
    }
}

На резервном узле те же настройки, только state BACKUP и priority 100. Приложение подключается к 10.0.10.100:4006 — и ничего не знает про переключения.

SSL между приложением и MaxScale

[Galera-Listener]
type=listener
service=Galera-Service
port=4006
ssl=required
ssl_cert=/etc/maxscale/certs/server-cert.pem
ssl_key=/etc/maxscale/certs/server-key.pem
ssl_ca_cert=/etc/maxscale/certs/ca-cert.pem
ssl_version=MAX

Кейс: MaxScale перед Galera для интернет-магазина

В феврале 2026 мы подключили MaxScale к Galera-кластеру клиента — интернет-магазин электроники на Битрикс24 с пиковой нагрузкой 450 запросов в секунду. До внедрения прокси приложение подключалось к одному узлу Galera; при его падении магазин лежал минут 5–15 (админ вручную менял IP в настройках). За 6 месяцев — три инцидента, суммарно 38 минут простоя.

Развернули пару MaxScale на двух виртуалках в дата-центре МТС, связали Keepalived с VIP 10.0.10.100. В настройках Битрикс24 заменили прямой IP БД на VIP. После внедрения:

Стоимость внедрения — 65 000 руб, сопровождение — 12 000 руб/мес.

Мониторинг и типовые проблемы

Настройка MaxScale и архитектуры БД

Проектирую HA-архитектуру MariaDB с MaxScale, Galera, Keepalived, ProxySQL. Работаю как с новыми инсталляциями, так и с миграцией существующих односерверных установок на кластерную схему. Работа с серверами в дата-центре МТС на оборудовании Dell Xeon Platinum 8280.

Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш

FAQ — MariaDB MaxScale

Чем MaxScale лучше HAProxy?
MaxScale понимает SQL-протокол, разделяет чтение/запись, делает failover. HAProxy работает на TCP.
Лицензия MaxScale коммерческая?
BSL: бесплатно до 3 серверов БД. Больше — коммерческая лицензия. Альтернатива — ProxySQL (GPLv3).
Как обеспечить HA самого MaxScale?
Два инстанса + Keepalived с плавающим VIP.
Какой порт использовать?
По умолчанию 4006 для readwritesplit.
MaxScale работает с PostgreSQL?
Нет. Для PostgreSQL — pgpool-II, pgbouncer или Patroni+HAProxy.

Подпишитесь на рассылку ITfresh

Раз в неделю — практические гайды для руководителя IT и сисадмина: безопасность, 1С, миграции, резервные копии, лайфхаки из реальных проектов.

Реквизиты оператора персональных данных

ООО «АЙТИ-ФРЕШ», ИНН 7719418495, КПП 771901001. Юридический адрес: 105523, г. Москва, Щёлковское шоссе, д. 92, корп. 7. Контакт: info@itfresh.ru, +7 903 729-62-41. Оператор обрабатывает e-mail подписчика в целях рассылки информационных и рекламных материалов до момента отзыва согласия.