Гид по технологиям

Установка MariaDB Galera Cluster с HAProxy на CentOS 7

• 9 min read • Базы данных • Обновлено 23 Nov 2025
MariaDB Galera + HAProxy на CentOS 7 — пошагово
MariaDB Galera + 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. Подготовка хостов и базовой системы

  1. Подключитесь по SSH к каждому серверу базы:
ssh [email protected]
ssh [email protected]
ssh [email protected]
  1. Переключитесь в root:
sudo su
  1. Отредактируйте /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
  1. Отключите SELinux (рекомендуется для простоты развёртывания Galera на CentOS 7):
sed -i -e 's/SELINUX=permissive/SELINUX=disabled/g' /etc/sysconfig/selinux

Примечание: можно предпочесть оставить SELinux включённым и настроить политики, но это потребует дополнительной проработки контекстов и правил доступа.

B. Установка MariaDB Galera

  1. Создайте репозиторий 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
  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.

  1. Скачайте скрипт на каждом узле базы:
cd /tmp
wget https://raw.githubusercontent.com/olafz/percona-clustercheck/master/clustercheck
chmod +x clustercheck
mv clustercheck /usr/bin/
  1. Создайте конфигурацию 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
}
  1. Зарегистрируйте сервис в /etc/services, отредактируйте или добавьте строку:
mysqlchk        9200/tcp                # mysqlchk
  1. Запустите xinetd:
systemctl start xinetd
  1. Создайте в MariaDB пользователя для проверки (англ. clustercheckuser) на каждом узле или централизовано, если используете одинаковые учетные данные:
mysql -u root -p
GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!';
exit;

После этого запустите проверку локально:

/usr/bin/clustercheck

Ожидаемый код возврата/результат: 200 — означает, что узел отвечает и синхронизирован.

Add clustercheck user in MariaDB


Шаг 2 — Установка и конфигурация HAProxy

HAProxy будет проксировать клиентские подключения к порту 3030 и проверять состояние узлов через clustercheck (порт 9200).

A. Подготовка сервера HAProxy

  1. Подключитесь и станьте root:
ssh [email protected]
sudo su
vi /etc/hosts

Добавьте записи для mariadb1/mariadb2/mariadb3 как на остальных серверах.

  1. Установите haproxy:
yum -y install haproxy
  1. Настройте логирование (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 rsyslog

B. Конфигурация HAProxy

  1. Сделайте резервную копию текущего конфига и создайте новый:
cd /etc/haproxy/
mv haproxy.cfg haproxy.cfg.orig
vi /etc/haproxy/haproxy.cfg
  1. Пример конфигурации 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 делает его резервным: трафик направляется туда только при отказе основных.
  1. Откройте порты на 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 должен синхронизировать изменения автоматически.

Show databases.

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 на один из доступных узлов.

Test MySQL cluster

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

Test leastconn algorithm in HAProxy.

C. Веб-интерфейс HAProxy

Откройте:

http://192.168.1.135:9000/stats

Данные для входа в примере: howtoforge:howtoforge

HAProxy GUI


Безопасность и эксплуатация

Эти рекомендации помогут сделать развёртывание более надёжным и безопасным.

  • Отключите доступ к портам управления (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-перемещений на работающий кластер без теста.

Диагностика и частые проблемы

  1. Узел не присоединяется к кластеру:

    • Проверьте /var/log/mysqld.log и /var/log/messages на наличие ошибок wsrep.
    • Убедитесь, что порты 4567/4444/4568 (если используются) открыты и доступ к wsrep_provider корректный.
    • Проверьте корректность wsrep_cluster_address и wsrep_node_address.
  2. SST через rsync занимает много времени или вызывает простой:

    • Рассмотрите переход на xtrabackup для снижения времени восстановления и отсутствия блокировок.
    • Проверьте скорость сети и диск на donor (узел, который отдаёт снимок).
  3. HAProxy считает узел DOWN, но MySQL работает:

    • Убедитесь, что clustercheck возвращает 200 локально.
    • Проверьте доступность порта 9200 на каждом узле из haproxy: telnet 192.168.1.132 9200
  4. Конфликты AUTO_INC:

    • innodb_autoinc_lock_mode=2 рекомендовано для Galera, чтобы избежать конфликтов при автоинкрементных столбцах.

Откат и план аварийного восстановления (runbook)

Минимальный план отката при критическом сбое:

  1. Определить состояние кворума — если два из трёх узлов активны, кластер работоспособен.
  2. Если кластер потерял все узлы, восстановите данные из последнего консистентного бэкапа на отдельном сервере и создайте новый кластер (bootstrap).
  3. Для безопасного удаления проблемного узла: остановите mysql, удалите /var/lib/mysql/grastate.dat (при необходимости) и заново выполните SST на этом узле.

Критерии приёмки

  • Кластер успешно стартует и показывает состояние синхронизированного узла на всех трёх MariaDB серверах.
  • HAProxy помечает основные два узла как UP и резервный как BACKUP.
  • При создании/удалении базы изменения видны с любого узла через HAProxy.

Методология развёртывания (мини-SOP)

  1. Подготовить и обновить ОС на всех узлах.
  2. Настроить /etc/hosts и базовую сетевую связность.
  3. Установить и настроить MariaDB-Galera на всех узлах, но выполнить bootstrap только на одном.
  4. Установить clustercheck и xinetd.
  5. Развернуть HAProxy, протестировать health-checks.
  6. Провести набор тестов (чтение/запись, отказ/восстановление, ребалансировка).
  7. Документировать конфигурации и подготовить варианты отката.

Тесты и критерии приёмки

Пример тест-кейсов:

  • 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, тестам и планам отката, чтобы минимизировать риски при внедрении.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро