Установка MariaDB Galera Cluster с HAProxy на CentOS 7
Данное пошаговое руководство показывает, как развернуть MariaDB Galera Cluster на трёх узлах CentOS 7 с балансировщиком HAProxy на отдельном сервере. Описаны подготовка-хостов, установка MariaDB-Galera, настройка firewall и clustercheck, конфигурация HAProxy, тестирование, безопасность, откат и сценарии отладки.
Что это даст
- Высокую доступность и синхронную мульти-мастер репликацию через Galera.
- Балансировку подключений и проверку состояния узлов через HAProxy + clustercheck.
- Инструкции по тестированию, откату, безопасности и мониторингу.
Основные понятия в одну строку
- Galera: синхронная библиотека репликации для MariaDB/MySQL.
- SST: полная передача состояния (State Snapshot Transfer).
- clustercheck: скрипт для проверки состояния MariaDB из прокси.
Предпосылки
- 4 сервера CentOS 7 x86_64 (root-доступ на всех узлах):
- mariadb1 — 192.168.1.132
- mariadb2 — 192.168.1.133
- mariadb3 — 192.168.1.134 (backup)
- haproxy — 192.168.1.135
- Базовые знания работы с SSH, systemd, firewall-cmd и vi.
Шаг 1 — Установка и настройка MariaDB Galera Cluster
Ниже — подробные шаги для трёх узлов базы. Каждый шаг сопровождается полезными пояснениями, примерами конфигураций и вариантами на случай ошибок.
A. Подготовка хостов и базовой системы
- Подключитесь по SSH к каждому серверу базы:
ssh [email protected]
ssh [email protected]
ssh [email protected]- Переключитесь в root:
sudo su- Отредактируйте /etc/hosts, чтобы все узлы знали имена друг друга:
vi /etc/hostsПример содержимого файла:
192.168.1.132 mariadb1
192.168.1.133 mariadb2
192.168.1.134 mariadb3
192.168.1.135 haproxy- Отключите SELinux (рекомендуется для простоты развёртывания Galera на CentOS 7):
sed -i -e 's/SELINUX=permissive/SELINUX=disabled/g' /etc/sysconfig/selinuxПримечание: можно предпочесть оставить SELinux включённым и настроить политики, но это потребует дополнительной проработки контекстов и правил доступа.
B. Установка MariaDB Galera
- Создайте репозиторий MariaDB:
vi /etc/yum.repos.d/mariadb.repoВставьте:
# MariaDB 10.0 CentOS repository list - created 2015-07-09 14:56 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1- Установите пакеты (на всех трёх узлах):
yum -y install MariaDB-Galera-server MariaDB-client galera rsync xinetd percona-toolkit precona-xtrabackup xinetd wgetЗаметки:
- Версия 10.0 используется в примере; при развёртывании в реальной среде рассмотрите более новые ветки MariaDB/Galera и совместимость с приложением.
- precona-xtrabackup кажется опечаткой в исходной команде (должно быть percona-xtrabackup); проверьте имена пакетов в репозитории.
C. Настройка firewalld
Откройте необходимые порты (на всех узлах баз данных и на haproxy по мере необходимости):
Назначение портов:
- 3306 — клиентские соединения MySQL/MariaDB
- 4567 — трафик репликации Galera (wsrep)
- 873 — rsync (SST через rsync)
- 4444 — дополнительные методы SST
- 9200 — xinetd / clustercheck порт
Команды:
systemctl start firewalld
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --permanent --add-port=4567/tcp
firewall-cmd --permanent --add-port=873/tcp
firewall-cmd --permanent --add-port=4444/tcp
firewall-cmd --permanent --add-port=9200/tcp
firewall-cmd --reloadВажное: если сервер находится за внешним фаерволом или в облаке, откройте порты на уровне сети только для доверенных адресов.
D. Конфигурация MariaDB Galera
Отредактируйте /etc/my.cnf.d/server.conf на каждом узле. Пример конфигурации для mariadb1:
cd /etc/my.cnf.d/
vi server.confДобавьте или отредактируйте следующие строки (пример):
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.132,192.168.1.133,192.168.1.134"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
wsrep_cluster_name="mariadb_cluster"
wsrep_node_address="192.168.1.132"
wsrep_sst_method=rsyncНа других узлах поменяйте wsrep_node_address на их локальные IP (192.168.1.133, 192.168.1.134).
Ключевые параметры — пояснения:
- wsrep_provider — путь к библиотеке Galera.
- wsrep_cluster_address — список адресов для первичного соединения (bootstrap не требует этого списка, но его указывать удобно).
- innodb_autoinc_lock_mode=2 — обязательен для мульти-мастерных сценариев Galera.
- wsrep_sst_method — метод SST: rsync (простой) или xtrabackup (инкрементальный, без простоя). Рекомендуется xtrabackup для production.
Запуск кластера:
На первом узле (mariadb1) выполните bootstrap:
/etc/rc.d/init.d/mysql bootstrapОжидаемый результат:
Bootstrapping the cluster.. Starting MySQL.. SUCCESS!На остальных узлах просто стартуйте службу:
/etc/init.d/mysql startПосле старта выполните mysql_secure_installation на каждом узле для настройки пароля root и базовых параметров безопасности.
E. Установка и настройка clustercheck
Clustercheck — скрипт, который позволяет HAProxy опрашивать состояние MariaDB и принимать решение о переводе сервера в состояние UP/DOWN.
- Скачайте скрипт на каждом узле базы:
cd /tmp
wget https://raw.githubusercontent.com/olafz/percona-clustercheck/master/clustercheck
chmod +x clustercheck
mv clustercheck /usr/bin/- Создайте конфигурацию xinetd для clustercheck:
vi /etc/xinetd.d/mysqlchkВставьте:
# default: on
# description: mysqlchk
service mysqlchk
{
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
per_source = UNLIMITED
}- Зарегистрируйте сервис в /etc/services, отредактируйте или добавьте строку:
mysqlchk 9200/tcp # mysqlchk- Запустите xinetd:
systemctl start xinetd- Создайте в MariaDB пользователя для проверки (англ. clustercheckuser) на каждом узле или централизовано, если используете одинаковые учетные данные:
mysql -u root -p
GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';
exit;После этого запустите проверку локально:
/usr/bin/clustercheckОжидаемый код возврата/результат: 200 — означает, что узел отвечает и синхронизирован.

Шаг 2 — Установка и конфигурация HAProxy
HAProxy будет проксировать клиентские подключения к порту 3030 и проверять состояние узлов через clustercheck (порт 9200).
A. Подготовка сервера HAProxy
- Подключитесь и станьте root:
ssh [email protected]
sudo su
vi /etc/hostsДобавьте записи для mariadb1/mariadb2/mariadb3 как на остальных серверах.
- Установите haproxy:
yum -y install haproxy- Настройте логирование (rsyslog): откройте UDP-приём, затем добавьте файл конфигурации для haproxy:
vi /etc/rsyslog.confУбедитесь, что включён приём по UDP:
$ModLoad imudp
$UDPServerRun 51Добавьте конфиг логирования HAProxy:
vi /etc/rsyslog.d/haproxy.confСодержимое:
local2.=info /var/log/haproxy-access.log
local2.notice /var/log/haproxy-info.logПерезапустите rsyslog:
systemctl restart rsyslogB. Конфигурация HAProxy
- Сделайте резервную копию текущего конфига и создайте новый:
cd /etc/haproxy/
mv haproxy.cfg haproxy.cfg.orig
vi /etc/haproxy/haproxy.cfg- Пример конфигурации haproxy.cfg:
global
log 127.0.0.1 local2
maxconn 1024
user haproxy
group haproxy
daemon
stats socket /var/run/haproxy.sock mode 600 level admin
defaults
log global
mode http
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 1024
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
listen mariadb_cluster 0.0.0.0:3030
mode tcp
balance leastconn
option httpchk
server mariadb1 192.168.1.132:3306 check port 9200
server mariadb2 192.168.1.133:3306 check port 9200
server mariadb3 192.168.1.134:3306 check port 9200 backup
listen stats 0.0.0.0:9000
mode http
stats enable
stats uri /stats
stats realm HAProxy\ Statistics
stats auth howtoforge:howtoforge
stats admin if TRUEКомментарии и рекомендации:
- balance leastconn — распределяет новые соединения на узел с наименьшим количеством активных соединений. Подходит для коротких транзакций; для длиннопротяжённых операций подумайте о других алгоритмах.
- check port 9200 — HAProxy использует clustercheck через xinetd/9200 для определения состояния MariaDB.
- Пометка backup для mariadb3 делает его резервным: трафик направляется туда только при отказе основных.
- Откройте порты на firewalld и запустите HAProxy:
systemctl start firewalld
firewall-cmd --permanent --add-port=9000/tcp
firewall-cmd --permanent --add-port=3030/tcp
firewall-cmd --reload
systemctl start haproxyШаг 3 — Тестирование и валидация
A. Тест репликации
Подключитесь к каждому узлу MariaDB и создайте уникальные тестовые базы, чтобы убедиться в синхронности:
mysql -u root -p
create database this_mariadb1; -- выполнить на mariadb1
create database this_mariadb2; -- выполнить на mariadb2
create database this_mariadb3; -- выполнить на mariadb3Проверьте наличие баз на всех узлах — Galera должен синхронизировать изменения автоматически.

B. Доступ через HAProxy
Чтобы использовать балансировщик, откройте удалённый доступ в MariaDB (напр., создать root@’%’ или отдельного пользователя).
mysql -u root -p
GRANT ALL PRIVILEGES ON *.* TO root@'%' IDENTIFIED BY "aqwe123";Теперь выполните команду, которая подключается через HAProxy и выводит таблицу mysql.user:
mysql -u root -p -h 192.168.1.135 -P 3030 -e "select Host, User, Password from mysql.user"Если всё настроено верно, вы увидите список пользователей, а соединение будет проксировано HAProxy на один из доступных узлов.

Проверьте поведение алгоритма leastconn (на хосте haproxy в логах и в GUI):

C. Веб-интерфейс HAProxy
Откройте:
http://192.168.1.135:9000/stats
Данные для входа в примере: howtoforge:howtoforge

Безопасность и эксплуатация
Эти рекомендации помогут сделать развёртывание более надёжным и безопасным.
- Отключите доступ к портам управления (rsyslog udp, xinetd/9200) из внешних сетей, отдавайте доступ только с HAProxy и доверенных адресов.
- Используйте SSL/SSH туннелирование для административного доступа при необходимости.
- Для production рассмотрите wsrep_sst_method=xtrabackup-v2 или mariabackup: они поддерживают бесшовную передачу данных без длительного простоя узла.
- Создавайте регулярные бэкапы (полные и инкрементальные) и проверяйте восстановление на тестовой среде.
- Используйте мониторинг (zabbix/prometheus) и alerting: мониторьте задержки репликации, количество потоков, свободное место и CPU.
Короткий чек-лист безопасности (роли и действия):
- Системный администратор:
- Ограничить доступ по IP, настроить SELinux/iptables при необходимости.
- Настроить ротацию логов и резервирование /var/lib/mysql.
- DBA:
- Настроить пароли, политики паролей, бэкапы и проверку целостности.
- Избегать крупных DDL-перемещений на работающий кластер без теста.
Диагностика и частые проблемы
Узел не присоединяется к кластеру:
- Проверьте /var/log/mysqld.log и /var/log/messages на наличие ошибок wsrep.
- Убедитесь, что порты 4567/4444/4568 (если используются) открыты и доступ к wsrep_provider корректный.
- Проверьте корректность wsrep_cluster_address и wsrep_node_address.
SST через rsync занимает много времени или вызывает простой:
- Рассмотрите переход на xtrabackup для снижения времени восстановления и отсутствия блокировок.
- Проверьте скорость сети и диск на donor (узел, который отдаёт снимок).
HAProxy считает узел DOWN, но MySQL работает:
- Убедитесь, что clustercheck возвращает 200 локально.
- Проверьте доступность порта 9200 на каждом узле из haproxy: telnet 192.168.1.132 9200
Конфликты AUTO_INC:
- innodb_autoinc_lock_mode=2 рекомендовано для Galera, чтобы избежать конфликтов при автоинкрементных столбцах.
Откат и план аварийного восстановления (runbook)
Минимальный план отката при критическом сбое:
- Определить состояние кворума — если два из трёх узлов активны, кластер работоспособен.
- Если кластер потерял все узлы, восстановите данные из последнего консистентного бэкапа на отдельном сервере и создайте новый кластер (bootstrap).
- Для безопасного удаления проблемного узла: остановите mysql, удалите /var/lib/mysql/grastate.dat (при необходимости) и заново выполните SST на этом узле.
Критерии приёмки
- Кластер успешно стартует и показывает состояние синхронизированного узла на всех трёх MariaDB серверах.
- HAProxy помечает основные два узла как UP и резервный как BACKUP.
- При создании/удалении базы изменения видны с любого узла через HAProxy.
Методология развёртывания (мини-SOP)
- Подготовить и обновить ОС на всех узлах.
- Настроить /etc/hosts и базовую сетевую связность.
- Установить и настроить MariaDB-Galera на всех узлах, но выполнить bootstrap только на одном.
- Установить clustercheck и xinetd.
- Развернуть HAProxy, протестировать health-checks.
- Провести набор тестов (чтение/запись, отказ/восстановление, ребалансировка).
- Документировать конфигурации и подготовить варианты отката.
Тесты и критерии приёмки
Пример тест-кейсов:
- TC1: Создать базу на mariadb1 — база доступна на mariadb2 и mariadb3 (проверка через HAProxy).
- TC2: Остановить mariadb1 — HAProxy переводит трафик на mariadb2; mariadb3 остаётся резервом.
- TC3: Выполнить SST на новом узле; убедиться, что он присоединился и синхронизирован.
- TC4: Проверить журнал HAProxy и clustercheck при отказе одного из узлов.
Критерии приёмки: все тест-кейсы пройдены, значения latency и ошибок в пределах допустимых для вашего приложения.
Альтернативы и когда это не подходит
- Если требуется географически распределённый кластер с низкой задержкой, Galera может не подойти из-за синхронной природы; рассмотрите асинхронные решения (replication, Aurora, Vitess).
- Для OLAP нагрузок с большими bulk-операциями синхронная репликация может негативно сказываться на производительности.
Полезные команды (cheat sheet)
- Проверить статус wsrep на узле:
mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep_%'";- Просмотреть текущие соединения:
ss -tnlp | grep mysql- Проверить доступность clustercheck из haproxy:
curl -sI http://192.168.1.132:9200 | head -n 1- Посмотреть логи MariaDB:
tail -n 200 /var/log/mysqld.logРоль-ориентированные чек-листы
DBA:
- Убедиться, что innodb_autoinc_lock_mode=2 и binlog_format=row.
- Настроить резервное копирование и периодические проверки целостности.
- Планировать DDL операции в окне обслуживания.
SysAdmin:
- Настроить firewall, SELinux/политики, rsyslog и ротацию логов.
- Настроить мониторинг и алерты по сети и дискам.
DevOps:
- Интегрировать проверки состояния в CI/CD (smoke tests через HAProxy).
- Обеспечить автоматизированный recovery Playbook в Ansible/Terraform.
Короткий глоссарий
- Galera — библиотека синхронной репликации для MySQL/MariaDB.
- SST — State Snapshot Transfer, метод полного восстановления узла.
- IST — Incremental State Transfer, передача только недостающих транзакций.
- clustercheck — скрипт для проверки доступности MariaDB для HAProxy.
Примеры принятия решений (Mermaid)
flowchart TD
A[Новый узел присоединяется] --> B{Есть кворум доноров?}
B -- Да --> C[Выполнить IST]
B -- Нет --> D[Выполнить SST 'полный']
C --> E[Синхронизация завершена]
D --> E
E --> F[Узел в составе кластера]FAQ
Q: Можно ли использовать другой балансировщик вместо HAProxy?
A: Да. Nginx stream, keepalived + LVS и коммерческие LB также подходят, если умеют проверять порт 9200 или выполнять SQL-healthchecks.
Q: Какой SST-метод лучше для production?
A: Percona XtraBackup (xtrabackup) или mariabackup предпочтительнее rsync — они поддерживают горячие бэкапы без длительных блокировок.
Q: Нужно ли отключать SELinux?
A: Не обязательно, но в многих простых инструкциях SELinux отключают для упрощения. В production лучше оставить и правильно настроить политики.
Заключение
MariaDB Galera Cluster вместе с HAProxy — надёжное и проверенное решение для высокодоступных MySQL-совместимых баз. Его сильные стороны — синхронная мульти-мастер репликация, автоматическое присоединение узлов и интеграция с балансировщиками по проверке состояния. Для production-окружения рекомендуются доработки: переход на xtrabackup, настройка мониторинга и жесткая политика доступа. Следуйте приведённым SOP, тестам и планам отката, чтобы минимизировать риски при внедрении.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента