Как настроить балансируемый 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).
- Скачиваем и компилируем 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.
- Добавляем пути в окружение root (удобство при ручной работе):
echo 'PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/libexec' >>/root/.bash_profile
echo 'export PATH' >>/root/.bash_profile- Создаём директорию для конфигурации кластера и файл 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-адреса под свою сеть.
- Запускаем менеджер кластера:
/usr/local/mysql/libexec/ndb_mgmd -f /usr/local/mysql/var/mysql-cluster/config.ini- Чтобы 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).
- Скачиваем и устанавливаем 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- Устанавливаем 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- Создаём /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- Добавляем PATH в профиль root (опционально):
echo 'PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/libexec' >>/root/.bash_profile
echo 'export PATH' >>/root/.bash_profile- Создаём каталоги для данных и резервных копий, затем инициализируем и запускаем узел:
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 на управляющем узле.
- Устанавливаем пароль для root в MySQL:
mysqladmin -u root password yourrootsqlpassword- Чтобы ndbd запускался при старте системы:
echo '/usr/local/mysql/libexec/ndbd' > /etc/init.d/ndbd
chmod 755 /etc/init.d/ndbd
update-rc.d ndbd defaults4 Настройка балансировщиков (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 Проверка и отладка кластера
- На узле управления подключитесь к демону управления кластером:
ndb_mgm -e "show"Команда покажет статус всех узлов и их ID. Убедитесь, что оба узла ndbd подключены и в статусе «started».
- На любом из 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;- Тестирование отказоустойчивости:
- Остановите один ndbd и убедитесь, что данные доступны через второй ndbd.
- Остановите управляющий узел и проверьте поведение: управляющий должен работать постоянно в продакшн.
- Логирование: проверяйте логи 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» и восстановление
Симптом: два узла хранения имеют несогласованные данные после сетевого разрыва и одновременной недоступности управляющего узла.
Быстрый план действий:
- Остановить все ndbd на узлах, чтобы избежать дальнейшего ухудшения состояния.
- Убедиться, что управляющий узел ndb_mgmd запущен и читает актуальный config.ini.
- На управляющем узле выполнить ndb_mgm и проверить состояние.
- Если необходимо — восстановить один узел из резервной копии перед повторным запуском ndbd (применимо при явном повреждении данных).
- Запустить 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 нагрузок.
Краткая методология развертывания (шаги)
- Подготовить сеть и машины.
- Установить и запустить ndb_mgmd на управляющем узле.
- Установить и запустить ndbd на узлах хранения (ndbd –initial при первом старте).
- Установить mysqld на узлах и настроить my.cnf с ndbconnect.
- Настроить и проверить балансировщики и виртуальный IP.
- Выполнить функциональные и нагрузочные тесты.
- Ввести мониторинг и процедуры аварийного восстановления.
1-строчный глоссарий
- ndb_mgmd — менеджер кластера NDB.
- ndbd — процесс узла хранения NDB.
- MYSQLD — сервер MySQL, использующий NDB как движок.
- ldirectord — демонт для балансировки соединений в Ultra Monkey.
- heartbeat — сервис для проверки живости узлов и назначения виртуального IP.
Заключение
MySQL Cluster 5.1 с балансировкой через Ultra Monkey — рабочее решение для высокодоступных OLTP систем, когда требуется распределённое хранение и автоматическое переключение. Внимательно планируйте сеть, тестируйте сценарии отказа и обеспечьте мониторинг и резервные копии. Этот документ даёт практическую отправную точку; до ввода в продакшн выполните детальное тестирование под вашу нагрузку.
Важно
- Этот материал предоставляется «как есть». Перед вводом в продуктив обязательно выполните собственное тестирование и подготовьте процедуры восстановления.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента