Перезапуск кластера и настройка балансировщиков MySQL
Введение
Этот документ объясняет два связанных процесса: 1) корректный порядок действий для перезапуска MySQL Cluster (NDB) и 2) настройку активного/резервного (active/passive) уровня балансировщиков, которые обеспечивают виртуальный IP и распределяют нагрузку между узлами кластера. Описанные команды и конфигурации соответствуют классическому окружению на Linux с MySQL Cluster и UltraMonkey.
Кому полезно: администраторы баз данных, системные администраторы и инженеры DevOps, которые настраивают отказоустойчивую инфраструктуру MySQL.
Важно: в примерах используются имена узлов и адреса вида mysql-mngt.example.com, mysql-data1.example.com, mysql-lb1.example.com и пр. Адаптируйте их под вашу сеть. Не меняйте порядок запуска/останова без тестирования в тестовом окружении.
Оглавление
- Перезапуск кластера
- Плейбук быстрого перезапуска
- Проверка статуса кластера
- Настройка балансировщиков (IPVS + UltraMonkey)
- Конфигурация heartbeat
- Конфигурация ldirectord
- Создание базы ldirectord на кластере
- Подготовка реальных серверов для виртуального IP
- Отладка и типичные ошибки
- Альтернативы и рекомендации
- Контрольные тесты и критерии приёмки
- Резюме
- Краткий глоссарий
Перезапуск кластера
Ниже — стандартный порядок корректного останова и запуска MySQL Cluster через ndb_mgm.
На узле управления (mysql-mngt.example.com) используйте клиент управления кластером:
mysql-mngt.example.com:
ndb_mgmВ консоли ndb_mgm выполните команду остановки:
shutdown; Вы увидите примерно такой вывод:
ndb_mgm> shutdown;
Node 3: Cluster shutdown initiated
Node 2: Node shutdown completed.
2 NDB Cluster node(s) have shutdown.
NDB Cluster management server shutdown.
ndb_mgm>Этот вывод означает, что узлы данных (например, mysql-data1.example.com и mysql-data2.example.com) и сервер управления остановлены.
Затем выйдите из консоли:
quit;Запуск кластера
Чтобы снова поднять кластер, сначала запустите демона управления на узле управления:
mysql-mngt.example.com:
ndb_mgmd -f /usr/local/mysql/mysql-cluster/config.iniНа узлах данных (mysql-data1.example.com и mysql-data2.example.com) запустите демоны NDB:
mysql-data1.example.com / mysql-data2.example.com:
ndbdЕсли вы изменяли конфигурацию management-сервера (файл config.ini), при первом запуске после изменений применяйте параметр –initial:
ndbd --initialПосле старта вернитесь на узел управления и проверьте статус кластера:
mysql-mngt.example.com:
ndb_mgmВ консоли выполните:
show;Команда show; покажет текущий статус всех узлов. Учтите, что после перезапуска может пройти несколько секунд до того, как все узлы будут помечены как connected.
Завершите работу с клиентом:
quit;Плейбук быстрого перезапуска (шаги для быстрого восстановления)
Ниже — компактный чек-лист действий для быстрого и безопасного перезапуска кластера:
- На узле управления: ndb_mgm -> shutdown; -> quit;
- Если вносились изменения в config.ini, убедитесь в синхронизации файла и прав доступа;
- Запустить ndb_mgmd -f /path/to/config.ini;
- На узлах данных: ndbd (или ndbd –initial при изменениях config);
- Проверить ndb_mgm -> show; чтобы убедиться, что все узлы подключены;
- При проблемах — посмотреть логи /var/lib/mysql-cluster/ или /usr/local/mysql/var/mysql-cluster/ (зависит от установки).
Важно: выполняйте шаги в указанном порядке и перед перезапуском убедитесь, что конфигурация config.ini корректна на узле управления.
Полезные сценарии и когда это может не сработать
- Если ndb_mgmd не стартует, проверьте права на config.ini и наличие правильных путей к директориям данных.
- При несовместимых версиях ndbd и ndb_mgmd кластер не соберётся — убедитесь, что версии компонентов совпадают.
- Если узлы не видят друг друга в сети — проверьте firewall и настройки iptables/ufw, маршрутизацию и DNS/hosts.
Настройка балансировщиков (UltraMonkey, IPVS)
Цель: сделать так, чтобы приложения использовали единый виртуальный IP, который распределяет соединения между mysql-data1 и mysql-data2. В случае падения одного из узлов виртуальный IP сохраняет доступность сервиса на другом узле.
В этой инструкции используется UltraMonkey (heartbeat + ldirectord) с IPVS (в ядре Linux). Мы настраиваем два балансировщика в active/passive режиме: mysql-lb1.example.com (active) и mysql-lb2.example.com (standby).
Требования
- Поддержка IPVS в ядрах обоих балансировщиков (модули IPVS).
- Доступ между балансировщиками и узлами кластера по указанным IP.
- Права root для установки пакетов и изменения сетевых настроек.
Включение модулей IPVS
На mysql-lb1.example.com и mysql-lb2.example.com выполните:
modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrr
Чтобы загружать эти модули автоматически при загрузке, добавьте их в /etc/modules:
mysql-lb1.example.com / mysql-lb2.example.com:
vi /etc/modulesДобавьте в файл следующие строки:
ip_vs_dh
ip_vs_ftp
ip_vs
ip_vs_lblc
ip_vs_lblcr
ip_vs_lc
ip_vs_nq
ip_vs_rr
ip_vs_sed
ip_vs_sh
ip_vs_wlc
ip_vs_wrrУстановка UltraMonkey
Добавьте репозитории UltraMonkey в /etc/apt/sources.list, затем обновите пакеты и установите:
mysql-lb1.example.com / mysql-lb2.example.com:
vi /etc/apt/sources.listДобавьте (не удаляйте существующие репозитории):
deb http://www.ultramonkey.org/download/3/ sarge main
deb-src http://www.ultramonkey.org/download/3 sarge mainЗатем выполните:
apt-get update
apt-get install ultramonkey libdbi-perl libdbd-mysql-perl libmysqlclient14-dev
Если появляется предупреждение про libsensors3, его можно проигнорировать, если вы не используете соответствующее аппаратное мониторирование.
Ответы инсталлятора:
- “Do you want to automatically load IPVS rules on boot?” — No
- “Select a daemon method.” — none
Пакет libdbd-mysql-perl может не поддерживать MySQL 5, поэтому в статье предлагается собрать актуальный DBD::mysql из CPAN:
mysql-lb1.example.com / mysql-lb2.example.com:
cd /tmp
wget http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-3.0002.tar.gz
tar xvfz DBD-mysql-3.0002.tar.gz
cd DBD-mysql-3.0002
perl Makefile.PL
make
make installПримечание: URL указывает на примерный архив; в реальном окружении используйте актуальную версию и проверенные зеркала CPAN.
Не забудьте включить форвардинг пакетов:
vi /etc/sysctl.confДобавьте:
# Enables packet forwarding
net.ipv4.ip_forward = 1Примените настройки:
sysctl -pНастройка heartbeat
Создайте одинаковый набор конфигурационных файлов на обоих балансировщиках (mysql-lb1.example.com и mysql-lb2.example.com).
Создайте /etc/ha.d/ha.cf:
vi /etc/ha.d/ha.cfСодержимое:
logfacility local0
bcast eth0
mcast eth0 225.0.0.1 694 1 0
auto_failback off
node mysql-lb1
node mysql-lb2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=haclusterВажно: укажите имена узлов, как возвращает uname -n. IP-адреса в ha.cf не поддерживаются — нужно указывать имена.
Добавьте записи в /etc/hosts на обоих балансировщиках:
vi /etc/hosts127.0.0.1 localhost
10.0.1.31 mysql-lb1.example.com mysql-lb1
10.0.1.32 mysql-lb2.example.com mysql-lb2Настройте виртуальный IP в /etc/ha.d/haresources:
vi /etc/ha.d/haresourcesПример содержимого:
loadb1 \
ldirectord::ldirectord.cf \
LVSSyncDaemonSwap::master \
IPaddr2::10.0.1.10/24/eth0/10.0.1.255Пояснение: укажите имя активного узла (здесь loadb1), виртуальный IP (10.0.1.10), маску (24) и широковещательный адрес (10.0.1.255). При сомнениях используйте справочные сервисы по подсетям.
Настройте файл аутентификации /etc/ha.d/authkeys:
vi /etc/ha.d/authkeysauth 3
3 md5 somerandomstringsomerandomstring — общий секрет между демонами heartbeat. Файл должен быть доступен только root:
chmod 600 /etc/ha.d/authkeysНастройка ldirectord
Создайте конфиг ldirectord на обоих балансировщиках:
vi /etc/ha.d/ldirectord.cfПример:
# Global Directives
checktimeout=10
checkinterval=2
autoreload=no
logfile="local0"
quiescent=yes
virtual = 10.0.1.10:3306
service = mysql
real = 10.0.1.33:3306 gate
real = 10.0.1.34:3306 gate
checktype = negotiate
login = "ldirector"
passwd = "ldirectorpassword"
database = "ldirectordb"
request = "SELECT * FROM connectioncheck"
scheduler = wrrПараметры и пояснения:
- virtual — виртуальный IP и порт (по умолчанию MySQL 3306);
- real — IP реальных серверов и порт; флаг gate означает, что проверка идёт через SQL (MySQL);
- checktype=negotiate — ldirectord попытается выполнить указанный SQL-запрос;
- login/passwd — учётные данные пользователя для проверки доступности;
- database — база, в которой находится таблица для проверки;
- request — SQL-запрос, используемый для проверки узла;
- scheduler — алгоритм распределения (wrr = weighted round robin).
После создания конфигов создайте системные ссылки и настройте порядок автозапуска:
update-rc.d -f heartbeat remove
update-rc.d heartbeat start 75 2 3 4 5 . stop 05 0 1 6 .
update-rc.d -f ldirectord removeИдея: ldirectord будет стартовать под контролем heartbeat, поэтому его автозапуск удаляется.
Создание базы ldirectord на кластере
Создайте базу ldirectordb и пользователя ldirector на всех нодах кластера, чтобы ldirectord мог проверять доступность узлов.
mysql-data1.example.com:
mysql -u root -p
GRANT ALL ON ldirectordb.* TO 'ldirector'@'%' IDENTIFIED BY 'ldirectorpassword';
FLUSH PRIVILEGES;
CREATE DATABASE ldirectordb;
USE ldirectordb;
CREATE TABLE connectioncheck (I INT) ENGINE=NDBCLUSTER;
INSERT INTO connectioncheck () VALUES (1);
quit;mysql-data2.example.com:
mysql -u root -p
GRANT ALL ON ldirectordb.* TO 'ldirector'@'%' IDENTIFIED BY 'ldirectorpassword';
FLUSH PRIVILEGES;
CREATE DATABASE ldirectordb;
quit;Пояснение: таблица connectioncheck используется для простого SQL-запроса и должна быть доступна на обоих узлах (ENGINE=NDBCLUSTER реплицирует таблицу по кластеру).
Подготовка узлов к приёму виртуального IP
Узлы mysql-data1 и mysql-data2 должны быть настроены так, чтобы корректно обрабатывать ARP и виртуальный IP. Устанавливаем iproute и настраиваем sysctl:
mysql-data1.example.com / mysql-data2.example.com:
apt-get install iprouteОтредактируйте /etc/sysctl.conf и добавьте:
# Enable configuration of arp_ignore option
net.ipv4.conf.all.arp_ignore = 1
# When an arp request is received on eth0, only respond if that address is
# configured on eth0. In particular, do not respond if the address is
# configured on lo
net.ipv4.conf.eth0.arp_ignore = 1
# Enable configuration of arp_announce option
net.ipv4.conf.all.arp_announce = 2
# Use an address that is configured on eth0 as the source of ARP requests
net.ipv4.conf.eth0.arp_announce = 2Примените настройки:
sysctl -pДобавьте виртуальный IP на loop-интерфейс, чтобы реальный сервер мог принимать трафик для виртуального адреса:
vi /etc/network/interfacesДобавьте:
auto lo:0
iface lo:0 inet static
address 10.0.1.10
netmask 255.255.255.255
pre-up sysctl -p > /dev/nullЗатем поднимите интерфейс:
ifup lo:0Пояснение: маска 255.255.255.255 и привязка на lo минимизируют нежелательные ARP-анонcы со стороны реального сервера.
Отладка и типичные ошибки
- Нода не присоединяется: проверьте версии ndbd/ndb_mgmd, права на директории данных и синхронизацию config.ini.
- ldirectord помечает все узлы как недоступные: проверьте, что пользователь ldirector и база ldirectordb существуют и доступны с балансировщика; попробуйте подключиться с балансировщика к MySQL напрямую: mysql -h10.0.1.33 -u ldirector -p
- heartbeat не фaйловерит: проверьте корректность /etc/ha.d/ha.cf, /etc/hosts, совпадение имен nodename и вывод uname -n.
- ARP-коллизии: убедитесь, что на реальных серверах включены настройки arp_ignore/arp_announce и виртуальный IP назначается только через loop-интерфейс.
Логи для проверки:
- /var/log/syslog или /var/log/daemon.log (heartbeat, ldirectord)
- логи MySQL на узлах данных (/var/lib/mysql или /usr/local/mysql/var/mysql-cluster)
Альтернативы и когда их использовать
- HAProxy или ProxySQL: вместо UltraMonkey ldirectord можно использовать HAProxy/ProxySQL для балансировки MySQL. Они дают больше гибкости (прослойка SQL-aware, более гибкие health checks), но сами не обеспечивают виртуального IP и failover на уровне узлов; в сочетании с keepalived или corosync/pcs они дают эффективную стойкую архитектуру.
- keepalived + LVS: современная альтернатива heartbeat + ldirectord. Keepalived умеет управлять виртуальным IP и взаимодействовать с IPVS.
Выбор зависит от требований к мониторингу, политике обновлений и опыта команды.
Тесты приёмки и чек-листы
Критерии приёмки:
- Все узлы кластера в статусе connected после перезапуска (ndb_mgm -> show;).
- Виртуальный IP корректно переключается между балансировщиками при ручном аварийном останове активного LB.
- ldirectord корректно помечает недоступный узел и перенаправляет трафик на рабочий.
- Приложение продолжает обслуживаться в течение failover (отсутствие долгих простоев > допустимого RTO).
Проверочные тесты:
- Остановить процесс ndbd на mysql-data1 и убедиться, что данные остаются доступны через виртуальный IP (трафик на mysql-data2).
- Остановить активный балансировщик (mysql-lb1) и выполнить failover: виртуальный IP должен перейти на mysql-lb2.
- Сделать полный перезапуск кластера согласно плейбуку и измерить время восстановления.
Роль-ориентированные чек-листы
Администратор баз данных (DBA):
- Проверить целостность config.ini перед перезапуском.
- Подготовить бэкапы и проверить их доступность.
- Убедиться, что CREATE TABLE … ENGINE=NDBCLUSTER применён для таблицы connectioncheck.
Системный администратор (Sysadmin):
- Установить модули IPVS и настроить /etc/modules.
- Настроить sysctl параметры (ipforward, arp*).
- Проверить файлы /etc/hosts и соответствие имен узлам.
Сетевой инженер:
- Убедиться в корректности маршрутов и прав на firewall между балансировщиками и узлами кластера.
- Проверить возможность ARP-анонcов и отсутствие конфликтов.
Decision flow (Mermaid)
Ниже — упрощённая логика failover балансировщика в виде диаграммы.
flowchart TD
A[Проверка здоровья Real-узла] -->|OK| B[Добавить в пул]
A -->|Не OK| C[Исключить из пула]
C --> D{Есть резервный узел?}
D -->|Да| E[Перенаправить трафик]
D -->|Нет| F[Сигнал об инциденте]
E --> G[Логировать событие]
B --> GБезопасность и примечания по приватности
- Файлы /etc/ha.d/authkeys и другие секреты должны быть доступны только root (chmod 600).
- Пароли в конфигурации ldirectord (passwd) хранятся в открытом виде; по возможности ограничьте доступ к файлу конфигурации и используйте отдельного пользователя с минимальными привилегиями (только SELECT на тестовой таблице).
- При переносе конфигураций между окружениями не храните секреты в системах контроля версий.
Советы по миграции и совместимости
- Проверяйте совместимость версии DBD::mysql / libmysqlclient с версией MySQL.
- Если вы используете более новые дистрибутивы, рассмотрите замену UltraMonkey на более поддерживаемые инструменты (keepalived + HAProxy/ProxySQL).
Короткий глоссарий
- NDB Cluster: слой хранения данных в MySQL Cluster, обеспечивающий распределённое хранение.
- ndb_mgm: клиент управления NDB Cluster.
- ndb_mgmd: демони управления кластером.
- ndbd: демони узлов данных.
- IPVS: IP Virtual Server — механизм балансировки на уровне ядра.
- ldirectord: часть UltraMonkey, проводящая проверки и наполняющая IPVS реальными серверами.
- heartbeat: механизм обнаружения отказа и failover ресурсов.
Резюме
- Для корректного перезапуска кластера используйте ndb_mgm -> shutdown; затем запуск ndb_mgmd и ndbd (с опцией –initial при изменениях config.ini).
- Для балансировки клиентских подключений используйте два балансировщика в active/passive режиме с IPVS и UltraMonkey (heartbeat + ldirectord), назначая виртуальный IP.
- Обязательно настройте параметры ARP на реальных серверах и создайте тестовую базу ldirectordb с таблицей connectioncheck для health-check’ов.
- Всегда тестируйте процедуру перезапуска и failover в тестовом окружении до применения в продакшене.
Важно: адаптируйте все примеры конфигураций под вашу сеть и политику безопасности.
Похожие материалы
Herodotus: механизм и защита Android‑трояна
Включить новое меню «Пуск» в Windows 11
Панель полей сводной таблицы в Excel — руководство
Включить новое меню «Пуск» в Windows 11
Дубликаты Диспетчера задач в Windows 11 — как исправить