Тестирование MySQL-кластера
Краткое определение
NDB Cluster — распределённое хранилище для MySQL, где ndbd — дата-узлы, ndb_mgmd — менеджер кластера, а mysqld (API) — серверы MySQL, подключающиеся к кластеру.
4 — Тестирование MySQL-кластера
Наша конфигурация кластера завершена, теперь её нужно протестировать. На сервере управления кластером (loadb1.example.com) запустите клиент управления кластером ndb_mgm, чтобы проверить, подключены ли узлы:
loadb1.example.com:
ndb_mgm Вы должны увидеть примерно следующее:
| -- NDB Cluster -- Management Client -- ndb_mgm> |
Теперь введите show; в командной строке:
show;Вывод должен выглядеть так:
| ndb_mgm> show; Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.101 (Version: 5.0.19, Nodegroup: 0, Master) id=3 @192.168.0.102 (Version: 5.0.19, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.103 (Version: 5.0.19) [mysqld(API)] 2 node(s) id=4 @192.168.0.101 (Version: 5.0.19) id=5 @192.168.0.102 (Version: 5.0.19) ndb_mgm> |
Если вы видите, что узлы подключены, значит базовая сеть и конфигурация работают.
Введите:
quit;чтобы выйти из консоли ndb_mgm.
Теперь создадим тестовую базу и таблицу с данными на sql1.example.com:
sql1.example.com:
mysql -u root -p
CREATE DATABASE mysqlclustertest;
USE mysqlclustertest;
CREATE TABLE testtable (i INT) ENGINE=NDBCLUSTER;
INSERT INTO testtable () VALUES (1);
SELECT * FROM testtable;
quit;Внимание: в операторе CREATE TABLE обязательно укажите ENGINE=NDBCLUSTER для всех таблиц, которые должны храниться в кластере. Если использовать другой движок, кластерирование не будет работать.
Ожидаемый результат SELECT:
| mysql> SELECT * FROM testtable; +------+ | i | +------+ | 1 | +------+ 1 row in set (0.03 sec) |
Теперь создайте ту же базу на sql2.example.com (структуру базы нужно создать, данные должны реплицироваться автоматически, потому что таблица — NDB):
sql2.example.com:
mysql -u root -p
CREATE DATABASE mysqlclustertest;
USE mysqlclustertest;
SELECT * FROM testtable;SELECT должен вернуть тот же результат, что и на sql1.example.com:
| mysql> SELECT * FROM testtable; +------+ | i | +------+ | 1 | +------+ 1 row in set (0.04 sec) |
Данные были реплицированы с sql1.example.com на sql2.example.com. Теперь вставим ещё строку в testtable на sql2.example.com:
sql2.example.com:
INSERT INTO testtable () VALUES (2);
quit;Вернёмся на sql1.example.com и проверим новую строку:
sql1.example.com:
mysql -u root -p
USE mysqlclustertest;
SELECT * FROM testtable;
quit;Ожидаемый вывод:
| mysql> SELECT * FROM testtable; +------+ | i | +------+ | 1 | | 2 | +------+ 2 rows in set (0.05 sec) |
Таким образом, оба MySQL-узла показывают одинаковые данные.
Проверка отказоустойчивости: остановка узла
Остановите узел 1 (sql1.example.com):
sql1.example.com:
killall ndbd Проверьте, что процессы ndbd завершены:
ps aux | grep ndbd | grep -iv grepЕсли процессы всё ещё видны, повторите killall ndbd, пока они не пропадут.
Теперь проверьте статус кластера на сервере управления (loadb1.example.com):
loadb1.example.com:
ndb_mgmВ консоли ndb_mgm выполните:
show;Вы должны увидеть состояние с одной отключённой нодой:
| ndb_mgm> show; Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from 192.168.0.101) id=3 @192.168.0.102 (Version: 5.0.19, Nodegroup: 0, Master) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.103 (Version: 5.0.19) [mysqld(API)] 2 node(s) id=4 @192.168.0.101 (Version: 5.0.19) id=5 @192.168.0.102 (Version: 5.0.19) ndb_mgm> |
Видно, что sql1.example.com не подключён.
Введите:
quit;чтобы выйти из ndb_mgm.
Проверьте данные на sql2.example.com:
sql2.example.com:
mysql -u root -p
USE mysqlclustertest;
SELECT * FROM testtable;
quit;Результат SELECT должен по-прежнему быть:
| mysql> SELECT * FROM testtable; +------+ | i | +------+ | 1 | | 2 | +------+ 2 rows in set (0.17 sec) |
Это показывает, что при остановке узла данные остаются доступными на другом узле.
Чтобы запустить sql1 снова:
sql1.example.com:
ndbd После перезапуска ещё раз проверьте show; в ndb_mgm, чтобы убедиться, что узел восстановил соединение.
Критерии приёмки
- Все узлы показываются в output команды show; и имеют статус @IP или not connected в соответствии с тестовыми действиями.
- После вставки данных на одном mysqld-запросе те же данные доступны на другом.
- При остановке одного ndbd второй узел продолжает отдавать данные.
- После старта ndbd узел возвращается в кластер без потери данных.
Что может пойти не так — распространённые проблемы и их решения
- Узлы не подключаются: проверьте сетевые правила (файрволы, NAT), правильные IP в config.ini и совпадение версии NDB.
- Данные не реплицируются: убедитесь, что таблица создана с ENGINE=NDBCLUSTER; другие движки не хранятся в NDB.
- ndbd аварийно завершается: проверьте логи ndbd и /var/lib/mysql-cluster/ndb_*.log на предмет ошибок памяти или конфликта портов.
- Менеджер показывает not connected accepting connect: обычно означает, что узел пытается повторно подключиться — проверьте сетевую доступность.
Альтернативные подходы тестирования
- Нагрузочное тестирование: запуск последовательных INSERT/SELECT/UPDATE с помощью sysbench или custom-скриптов.
- Тестирование сетевых разделов: имитация packet loss или high latency с tc/netem.
- Тестирование ошибок диска: подключение нестабильного хранилища на одном из узлов.
Чек-лист ролей
DBA:
- Проверить конфигурацию cluster.conf и версии пакетов.
- Создать тестовую базу и таблицу с ENGINE=NDBCLUSTER.
- Проверить целостность данных после рестарта узлов.
Системный администратор:
- Убедиться в открытых портах между узлами (1186 и порты ndbd).
- Проверить настройки firewall и маршрутизации.
- Следить за журналами и доступностью процессов ndbd/ndb_mgmd.
Тестировщик:
- Вставить/удалить данные, проверяя отражение на всех mysqld.
- Остановить/запустить ndbd и зафиксировать время восстановления.
Мини-методология тестирования (шаги)
- Проверить подключение узлов через ndb_mgm и show;.
- Создать тестовую базу и таблицу ENGINE=NDBCLUSTER на первом mysqld.
- Проверить данные на втором mysqld.
- Вставить данные на втором mysqld, убедиться в репликации на первом.
- Остановить один ndbd, проверить доступность данных на оставшихся узлах.
- Запустить ndbd и проверить повторное подключение узла.
Тест-кейсы и критерии приёмки
- TC1: Подключение узлов — show; возвращает список всех узлов (PASS — все узлы подключены).
- TC2: Репликация вставки — INSERT на sql1 появляется на sql2 (PASS — SELECT на sql2 показывает вставку).
- TC3: Отказ узла — после killall ndbd один узел недоступен, данные на другом остаются (PASS — SELECT возвращает данные).
- TC4: Восстановление узла — после ndbd узел подключается и синхронизируется (PASS — show; показывает узел активным).
Краткий словарь (1 строка)
- ndbd: процесс хранения данных в NDB Cluster.
- ndb_mgmd: менеджер конфигурации кластера.
- mysqld (API): клиент MySQL, взаимодействующий с кластером.
- ENGINE=NDBCLUSTER: движок таблицы, который обеспечивает хранение в NDB.
Итог
Тесты показали стандартный рабочий сценарий: создание таблицы с ENGINE=NDBCLUSTER, успешная репликация между mysqld-узлами, устойчивость к остановке одного ndbd и успешное восстановление после старта. Следуйте чек-листам и тест-кейсам для стабильной рабочей проверки кластера.
Важно: всегда делайте резервные копии конфигурации и данных перед масштабными изменениями или тестами, влияющими на доступность.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента