MariaDB Galera Failover кластер на HAProxy+Keepalived

mariadb-galera-cluster-centos-6
Логичным продожением предыдущей работы будет создание отказоустойчивого кластера с балансировкой нагрузки и единым виртуальным «плавающим» IP для клиентского доступа. В качестве балансировщика нагрузки будем использовать HAProxy. Для управления виртуальным IP адресом — Keepalived.

Установку начинаем с подключения репозитория repoforge:

Устанавливаем HAProxy и Keepalived и добавляем их в автозагрузку при старте системы:

Настройка HAProxy

Заполняем конфигурационный файл:

Запускаем HAProxy:

Открываем порт 80 в iptables:

Можно проверить статистику непосредственно через сокет:

# socat /var/lib/haproxy/stats.sock readline
prompt
> show info
> show stat
> help

или через браузер, авторизовавшись monitor с паролем AdMiN123, которые мы задали в файле конфигурации.

HAProxy Web Interface

Проверяем что балансировка нагрузки работает:

Обратите внимание, мы указываем адрес для подключения явно. Если этого не сделать, подключение будет идти через сокет на localhost.

Настройка Keepalived

Отключаем iptables:

Заполняем конфигурационный файл на третьей ноде:

Убеждаемся, что следующие параметры соответствуют нашим реалиям:
– notification_email
– notification_email_from
– smtp_server – interface
– virtual_router_id (одинаков на всех нодах)
– auth_pass (одинаков на всех нодах)
– virtual_ipaddress (одинаков на всех нодах)
В зависимости от того, какая нода будет иметь наибольший приоритет изменяем значение priority на других нодах. В нашем примере наибольший приоритет будет у первой ноды (priority 102). Обратите внимание на различия в настройке priority для каждой из нод:

router_id haproxy1 haproxy2 haproxy3
virtual_router_id 10 10 10
priority 102 101 100
weight 2+2 2+2 2+2
priority+weight 106 105 104

Параметр weight отображает дополнительное количество единиц, которое получает нода дополненительно к priority если выполняется некое условие, в данном случае условий два: работающий HAproxy и обслуживающий запросы MySQL. Таким образом виртуальный IP будет размещаться на первой ноде.

Создадим простенький скрипт проверки:

Чтобы скрипт сработал, создадим пользователя mysqlchk без привилегий:

Запускаем Keepalived:

Если выполнить:

первая нода будет иметь приоритет 104, что меньше чем у второй ноды, и виртуальный IP адрес «переедет» на вторую ноду.
Приоритет, анонсируемый каждой нодой можно проверить командой:

Тестируем Keepalived. Чтобы убедиться, что система приоритетов работает начните с третьей ноды:

Теперь запускаем на второй:

Видим, что виртуальный IP переместился на вторую ноду, т.к. у нее выше суммарный приоритет.

Если нужно открыть протокол VRRP в iptables:

Пример конфигурации iptables:

Проверить настройки мультикаста на интерфейсах а также членство в мультикаст группах можно следующими командами:

Если мультикаст отключён на интерфейсе (но включен в ядре), включить его можно командой: