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

Как настроить балансируемый MySQL-кластер на MySQL 5.1

• 8 min read • Базы данных • Обновлено 23 Nov 2025
Балансируемый MySQL-кластер на MySQL 5.1
Балансируемый MySQL-кластер на MySQL 5.1

Этот пошаговый гид показывает, как развернуть MySQL Cluster 5.1 с 5 узлами: 1 узел управления, 2 узла хранения и 2 балансировщика нагрузки (Ultra Monkey). Приведены конфигурации, команды установки, советы по проверке работоспособности, план реагирования при сбоях и рекомендации по безопасности и тестированию. Подход протестирован на Debian Etch 4.0 и MySQL 5.1.73.

Основная идея и архитектура

Этот документ показывает одну из простых топологий для MySQL NDB Cluster (версия 5.1): два узла хранения (ndbd), один узел управления (ndb_mgmd) и два узла балансировки (Ultra Monkey с heartbeat и ldirectord). Балансировщики держат виртуальный IP, через который приложения обращаются к кластеру, а управление и мониторинг выполняются с управляющего узла.

Кратко о терминах:

  • NDB — распределённый движок хранения для MySQL Cluster (NDB Cluster).
  • ndb_mgmd — менеджер кластера (management node).
  • ndbd — демон хранения (data node).
  • MYSQLD — обычный сервер MySQL, выступает клиентом к NDB.

Для кого этот материал

Администраторы баз данных, системные администраторы и инженеры DevOps, планирующие развернуть отказоустойчивый кластер MySQL с распределённым хранилищем NDB и балансировкой запросов. Предполагается знакомство с Linux и сборкой ПО из исходников.

Предпосылки и требования

  • OS: Debian Etch 4.0 (в примере); команды нужно адаптировать для других дистрибутивов.
  • MySQL: исходники MySQL 5.1.73 (пример). Версия выбрана для демонстрации возможности хранения неиндексированных колонок на диске (disk-based columns, начиная с 5.1.6).
  • Сеть: все узлы находятся в одной подсети (в примере 10.0.1.x). Нужен виртуальный IP для балансировщиков.
  • Минимум 5 серверов: 2 data, 1 management, 2 load balancer.

Важно: перед вводом в продакшн тщательно протестируйте кластер на стенде. Этот документ даёт практический старт, но не заменяет чтения официальной документации и планирования резервных копий и мониторинга.

1 Топология и адреса в примере

В примере используются машины в сети 10.0.1.x:

  • mysql-mngt.example.com: 10.0.1.30 — узел управления (ndb_mgmd)
  • lb1.example.com: 10.0.1.31 — балансировщик 1 (Ultra Monkey)
  • lb2.example.com: 10.0.1.32 — балансировщик 2 (Ultra Monkey)
  • mysql-data1.example.com: 10.0.1.33 — узел хранения 1 (ndbd)
  • mysql-data2.example.com: 10.0.1.34 — узел хранения 2 (ndbd)

Виртуальный IP: 10.0.1.10 — назначается балансировщиком, используется приложениями.

Аппаратная конфигурация примера (для понимания масштабирования):

  • Узлы хранения: сервера с ≥8 ГБ RAM, RAID1 для дисков.
  • Балансировщики: маломощные сервера, они обслуживают только сетевой трафик и heartbeat.
  • Узел управления: невысокие требования по ресурсам; на нём можно также запускать мониторинг.

2 Подготовка узла управления (management node)

Действия выполняются на mysql-mngt.example.com (10.0.1.30).

  1. Скачиваем и компилируем MySQL из исходников (пример для 5.1.73):
cd /usr/src
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz
tar xvzf mysql-5.1.73.tar.gz
# Добавляем пользователя и группу
groupadd mysql
useradd -g mysql mysql
./configure --prefix=/usr/local/mysql --enable-community-features --with-mysqld-user=mysql --with-mysqlmanager --with-plugins=ndbcluster
make
make install

Примечание: в /usr/local/mysql появятся bin и libexec, где содержится ndb_mgmd.

  1. Добавляем пути в окружение root (удобство при ручной работе):
echo 'PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/libexec' >>/root/.bash_profile
echo 'export PATH' >>/root/.bash_profile
  1. Создаём директорию для конфигурации кластера и файл config.ini:
mkdir -p /usr/local/mysql/var/mysql-cluster
cd /usr/local/mysql/var/mysql-cluster
vi config.ini

Вставьте в config.ini (пример):

[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=80M    # How much memory to allocate for data storage
IndexMemory=18M   # How much memory to allocate for index storage

[MYSQLD DEFAULT]

[NDB_MGMD DEFAULT]

[TCP DEFAULT]

# Section for the cluster management node
[NDB_MGMD]
# IP address of the management node (this system)
HostName=10.0.1.30

# Section for the storage nodes
[NDBD]
# IP address of the first storage node
HostName=10.0.1.33
DataDir=/usr/local/mysql/var/mysql-cluster
BackupDataDir=/usr/local/mysql/var/mysql-cluster/backup
DataMemory=2048M

[NDBD]
# IP address of the second storage node
HostName=10.0.1.34
DataDir=/usr/local/mysql/var/mysql-cluster
BackupDataDir=/usr/local/mysql/var/mysql-cluster/backup
DataMemory=2048M

# one [MYSQLD] per storage node
[MYSQLD]
[MYSQLD]

Замените IP-адреса под свою сеть.

  1. Запускаем менеджер кластера:
/usr/local/mysql/libexec/ndb_mgmd -f /usr/local/mysql/var/mysql-cluster/config.ini
  1. Чтобы ndb_mgmd запускался при старте системы, создайте init-скрипт:
echo '/usr/local/mysql/libexec/ndb_mgmd -f /usr/local/mysql/var/mysql-cluster/config.ini' > /etc/init.d/ndb_mgmd
chmod 755 /etc/init.d/ndb_mgmd
update-rc.d ndb_mgmd defaults

Важно: менеджер должен быть доступен по сети для узлов ndbd — убедитесь, что фаерволлы не блокируют порты.

3 Подготовка узлов хранения (data nodes)

Действия выполняются на mysql-data1 и mysql-data2 (10.0.1.33 и 10.0.1.34).

  1. Скачиваем и устанавливаем MySQL аналогично управляемому узлу:
cd /usr/src
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz
tar xvzf mysql-5.1.73.tar.gz
groupadd mysql
useradd -g mysql mysql
cd /usr/src/mysql-5.1.73
./configure --prefix=/usr/local/mysql --enable-community-features --with-mysqld-user=mysql --with-plugins=ndbcluster
make
make install
/usr/src/mysql-5.1.73/scripts/mysql_install_db --user=mysql
cd /usr/local/mysql
chown -R root:mysql .
chown -R mysql.mysql /usr/local/mysql/var
  1. Устанавливаем init-скрипт для mysql.server и автозагрузку:
cp /usr/src/mysql-5.1.73/support-files/mysql.server /etc/init.d/
chmod 755 /etc/init.d/mysql.server
update-rc.d mysql.server defaults
  1. Создаём /etc/my.cnf с включённым ndbcluster:
vi /etc/my.cnf

Пример содержимого my.cnf:

[client]
port=3306
socket=/tmp/mysql.sock

[mysqld]
ndbcluster
# IP address of the cluster management node
ndb-connectstring=10.0.1.30
default-storage-engine=NDBCLUSTER

#Those are for future tuning
#max_connections=341
#query_cache_size=16M
#thread_concurrency = 4

[mysql_cluster]
# IP address of the cluster management node
ndb-connectstring=10.0.1.30
  1. Добавляем PATH в профиль root (опционально):
echo 'PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/libexec' >>/root/.bash_profile
echo 'export PATH' >>/root/.bash_profile
  1. Создаём каталоги для данных и резервных копий, затем инициализируем и запускаем узел:
mkdir -p /usr/local/mysql/var/mysql-cluster
mkdir -p /usr/local/mysql/var/mysql-cluster/backup
cd /var/lib/mysql-cluster
/usr/local/mysql/libexec/ndbd --initial
/etc/init.d/mysql.server start

Примечание: ndbd –initial нужно запускать только при первом старте узла или при изменении конфигурации config.ini на управляющем узле.

  1. Устанавливаем пароль для root в MySQL:
mysqladmin -u root password yourrootsqlpassword
  1. Чтобы ndbd запускался при старте системы:
echo '/usr/local/mysql/libexec/ndbd' > /etc/init.d/ndbd
chmod 755 /etc/init.d/ndbd
update-rc.d ndbd defaults

4 Настройка балансировщиков (Ultra Monkey)

Балансировщики (lb1 и lb2) используют пакет Ultra Monkey (heartbeat + ldirectord). Вкратце:

  • heartbeat обеспечивает отслеживание живости (node heartbeat) и переключение виртуального IP.
  • ldirectord распределяет входящие TCP-соединения между реальными узлами MySQL (по порту 3306).

Для каждого балансировщика настройте:

  • heartbeat: следит за удалённым балансировщиком и назначает виртуальный IP при отказе.
  • ldirectord: указывает backend-серверы (10.0.1.33 и 10.0.1.34) и условия здоровья (healthcheck по TCP/порт 3306).

Пример конфигурации ldirectord и heartbeat выходит за рамки этого примера, но общие шаги:

  • Установите Ultra Monkey (или эквивалентный пакет в вашем дистрибутиве).
  • Сконфигурируйте /etc/ha.d/ha.cf и /etc/ha.d/haresources для heartbeat.
  • Сконфигурируйте /etc/ha.d/ldirectord.cf с backend-адресами и virtual IP 10.0.1.10.

Проверяйте, что при выключении lb1 виртуальный IP успешно реанимируется на lb2, а ldirectord корректно убирает вышедшие из строя backend-узлы.

5 Проверка и отладка кластера

  1. На узле управления подключитесь к демону управления кластером:
ndb_mgm -e "show"

Команда покажет статус всех узлов и их ID. Убедитесь, что оба узла ndbd подключены и в статусе «started».

  1. На любом из mysql серверах выполните подключение MySQL и создайте тестовую таблицу:
mysql -u root -p
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE t1 (id INT PRIMARY KEY, v VARCHAR(100)) ENGINE=NDBCLUSTER;
INSERT INTO t1 VALUES (1,'hello');
SELECT * FROM t1;
  1. Тестирование отказоустойчивости:
  • Остановите один ndbd и убедитесь, что данные доступны через второй ndbd.
  • Остановите управляющий узел и проверьте поведение: управляющий должен работать постоянно в продакшн.
  1. Логирование: проверяйте логи ndb_mgmd, ndbd и mysqld при возникновении ошибок.

Когда такой подход НЕ подходит (контрпримеры)

  • Если у вас низкая задержка сети между узлами невозможна (NDB чувствителен к сетевой латентности).
  • Если данные не подходят для распределённого хранения (очень большие blob-ы, частые пакеты больших транзакций).
  • Если вы хотите просто реплицировать отдельный сервер — тогда проще использовать master-slave или Group Replication/Galera.

Альтернативные подходы

  • Galera / Percona XtraDB Cluster — синхронная репликация для InnoDB (простее шаблона мастер-мастер, подходит для веб-приложений).
  • Async replication (master-slave) — простая и понятная схема для чтения с реплик.
  • ProxySQL или HAProxy вместо Ultra Monkey для балансировки и интеллектуального роутинга запросов.

Роли и чек-листы перед вводом в продакшн

Администратор БД:

  • Проверить целостность данных и корректность движков таблиц (ENGINE=NDBCLUSTER).
  • Настроить резервное копирование (блокировки и снимки NDB требуют особого подхода).
  • Выполнить нагрузочное тестирование и замер латентности.

Системный администратор:

  • Проверить сетевую инфраструктуру (MTU, VLAN, firewall).
  • Убедиться в корректности конфигураций heartbeat и ldirectord.
  • Настроить мониторинг (Nagios, Zabbix) на все узлы.

DevOps/CI:

  • Добавить тесты интеграции на CI, которые проверяют доступность виртуального IP и корректные ответы.

План инцидента: «split-brain» и восстановление

Симптом: два узла хранения имеют несогласованные данные после сетевого разрыва и одновременной недоступности управляющего узла.

Быстрый план действий:

  1. Остановить все ndbd на узлах, чтобы избежать дальнейшего ухудшения состояния.
  2. Убедиться, что управляющий узел ndb_mgmd запущен и читает актуальный config.ini.
  3. На управляющем узле выполнить ndb_mgm и проверить состояние.
  4. Если необходимо — восстановить один узел из резервной копии перед повторным запуском ndbd (применимо при явном повреждении данных).
  5. Запустить ndbd –initial на каждом узле по одному и проверять синхронизацию через ndb_mgm.

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

Безопасность и hardening

  • Ограничьте доступ к портам управления кластера (ndb_mgmd) по IP.
  • Используйте отдельную сеть для внутреннего трафика кластера (например, изолированную VLAN).
  • Минимизируйте привилегии MySQL пользователей и используйте сильные пароли.
  • Регулярно проверяйте обновления безопасности для ОС и используемого ПО.

Тестовые сценарии и критерии приёмки

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

  • Виртуальный IP 10.0.1.10 отвечает на запросы при работающем любом из балансировщиков.
  • При выключении одного узла хранения данные остаются доступны без потери для операций чтения и допустимой части операций записи.
  • После восстановления узла данные корректно синхронизируются и кластер возвращается в статус «started».
  • Мониторинг подаёт оповещение при падении узла.

Минимальные тестовые сценарии:

  • CRUD-операции на тестовой таблице ENGINE=NDBCLUSTER.
  • Отключение одного ndbd и проверка доступности данных.
  • Отключение lb1 и проверка фейловера на lb2.

Миграция и совместимость

  • Перед миграцией таблиц в NDB проверьте ограничения по типам данных и размерам. NDB имеет свои ограничения на максимальный размер строки и индексов.
  • Тестируйте приложения на предмет транзакций и задержек; NDB оптимизирован для высокоскоростных OLTP нагрузок.

Краткая методология развертывания (шаги)

  1. Подготовить сеть и машины.
  2. Установить и запустить ndb_mgmd на управляющем узле.
  3. Установить и запустить ndbd на узлах хранения (ndbd –initial при первом старте).
  4. Установить mysqld на узлах и настроить my.cnf с ndbconnect.
  5. Настроить и проверить балансировщики и виртуальный IP.
  6. Выполнить функциональные и нагрузочные тесты.
  7. Ввести мониторинг и процедуры аварийного восстановления.

1-строчный глоссарий

  • ndb_mgmd — менеджер кластера NDB.
  • ndbd — процесс узла хранения NDB.
  • MYSQLD — сервер MySQL, использующий NDB как движок.
  • ldirectord — демонт для балансировки соединений в Ultra Monkey.
  • heartbeat — сервис для проверки живости узлов и назначения виртуального IP.

Заключение

MySQL Cluster 5.1 с балансировкой через Ultra Monkey — рабочее решение для высокодоступных OLTP систем, когда требуется распределённое хранение и автоматическое переключение. Внимательно планируйте сеть, тестируйте сценарии отказа и обеспечьте мониторинг и резервные копии. Этот документ даёт практическую отправную точку; до ввода в продакшн выполните детальное тестирование под вашу нагрузку.

Важно

  • Этот материал предоставляется «как есть». Перед вводом в продуктив обязательно выполните собственное тестирование и подготовьте процедуры восстановления.
Поделиться: 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 быстро