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

Перезапуск кластера и настройка балансировщиков MySQL

9 min read Базы данных Обновлено 29 Oct 2025
Перезапуск кластера и настройка балансировщиков MySQL
Перезапуск кластера и настройка балансировщиков 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;

Плейбук быстрого перезапуска (шаги для быстрого восстановления)

Ниже — компактный чек-лист действий для быстрого и безопасного перезапуска кластера:

  1. На узле управления: ndb_mgm -> shutdown; -> quit;
  2. Если вносились изменения в config.ini, убедитесь в синхронизации файла и прав доступа;
  3. Запустить ndb_mgmd -f /path/to/config.ini;
  4. На узлах данных: ndbd (или ndbd –initial при изменениях config);
  5. Проверить ndb_mgm -> show; чтобы убедиться, что все узлы подключены;
  6. При проблемах — посмотреть логи /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/hosts
127.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/authkeys
auth 3
3 md5 somerandomstring

somerandomstring — общий секрет между демонами 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).

Проверочные тесты:

  1. Остановить процесс ndbd на mysql-data1 и убедиться, что данные остаются доступны через виртуальный IP (трафик на mysql-data2).
  2. Остановить активный балансировщик (mysql-lb1) и выполнить failover: виртуальный IP должен перейти на mysql-lb2.
  3. Сделать полный перезапуск кластера согласно плейбуку и измерить время восстановления.

Роль-ориентированные чек-листы

Администратор баз данных (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 в тестовом окружении до применения в продакшене.

Важно: адаптируйте все примеры конфигураций под вашу сеть и политику безопасности.

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

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

Herodotus: механизм и защита Android‑трояна
Кибербезопасность

Herodotus: механизм и защита Android‑трояна

Включить новое меню «Пуск» в Windows 11
Windows руководство

Включить новое меню «Пуск» в Windows 11

Панель полей сводной таблицы в Excel — руководство
Excel

Панель полей сводной таблицы в Excel — руководство

Включить новое меню «Пуск» в Windows 11
Windows 11

Включить новое меню «Пуск» в Windows 11

Дубликаты Диспетчера задач в Windows 11 — как исправить
Windows

Дубликаты Диспетчера задач в Windows 11 — как исправить

История просмотров Reels в Instagram — как найти
Instagram

История просмотров Reels в Instagram — как найти