Установка MySQL Cluster в Debian Lenny
Введение
Кластерное решение на базе MySQL является отказоустойчивым, избыточным и масштабируемым решением для баз данных, основанным на открытых исходных текстах. Использование такой схемы позволяет достигнуть надежности в 99.999 %. В этой статье мы опишем процесс установки, настройки и тестирования кластера MySQL, состоящего из четырех узлов.
Для этого нам понадобится четыре машины с установленной на них операцонной системой Debian 5.0 (можно виртуальных, если в ознакомительных целях. Так было в моём случае – поставил под VirtualBox Debian и клонировал его.)
Схема подключения

Аппаратное обеспечение
Наши четыре машины относятся к одной из трех ролей:
- Хранилище (Storage node) 192.168.0.11 и 192.168.0.12.
- API node 192.168.0.14.
- Сервер управления и консоль управления (Management node) 192.168.0.13
Обратите внимание, что узлы хранилища также являются API нодами, но API нода не является хранилищем. Узел API — полноправный член кластера, но он не хранит никаких данных кластера и его состояние (работает/не работает) не затрагивает целостность или доступность данных. Об этой ноде можно думать как о «клиенте» кластера. Приложения, такие как Web-сервер, установлены на ноде API и общаются с процессом MySQL, запущенным локально, именно этот процесс запрашивает данные от хранилищ. На хранилищах также могут быть установлены приложения, поскольку они совмещают в себе API ноды, но для промышленного применения такое совмещение нежелательно.
Для начала нужно настроить сеть – идём в /etc/network и редактируем файл interfaces, тем самым создаём локальную сеть между тремя машинами (пусть у управляющей ноды (Management node) будет ip 192.168.0.13, а у хранилищ (Storage node) 192.168.0.11 и 192.168.0.12, соответственно . Не забудьте поставить на все ноды mysql-server.
Пример файла /etc/network/interfaces
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.11
netmask 255.255.255.0
Конфигурация управляющей ноды (management node)
Необходимо создать файл ndb_mgmd.cnf в директории /etc/mysql/.
Пример файла /etc/mysql/ndb_mgmd.cnf
NoOfReplicas=2
DataMemory=10MB
IndexMemory=25MB
MaxNoOfTables=256
MaxNoOfOrderedIndexes=256
MaxNoOfUniqueHashIndexes=128
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Management Node
[NDB_MGMD]
Id=1
HostName=192.168.0.13
DataDir=/var/lib/mysql-cluster
# Storage Nodes (one for each node)
[NDBD]
Id=2
HostName=192.168.0.11
DataDir= /var/lib/mysql-cluster
[NDBD]
Id=3
HostName=192.168.0.12
DataDir=/var/lib/mysql-cluster
# SQL Nodes (one for each node)
[MYSQLD]
Id=4
HostName=192.168.0.14
[MYSQLD]
Id=5
HostName=192.168.0.11
[MYSQLD]
Id=6
HostName=192.168.0.12
Некоторые пояснения по конфигу. На самом деле, вы можете пока смело закомментировать все директивы в секции [NDBD DEFAULT] кроме первых трёх. Остальные параметры по тонкой настроке кластера, даны тут скорее для примера — в реальности их намного больше, чем в этом конфигурационном файле и я оставил их, чтобы показать, что они вообще-то есть, потому что в упоминаемых мной статьях приводятся только именно первые три и больше ничего. За подробными пояснениями по данным параметрам, вам нужно сходить на сайт MySQL и почитать документацию по развёртыванию кластера, но краткие пояснения я дам
NoOfReplicas=2 говорит, что в нашем кластере два узла
MaxNoOfOrderedIndexes=256 это количество индексов, которые может обслуживать кластер. Сюда входят все индексы, в том числе и первичные ключи. Если индексов в вашей БД будет больше, чем значение этого паметра, вы получите ошибку и ваш кластер работать не будет!
MaxNoOfUniqueHashIndexes=128 это количество индексов, созданных с ключевым словом HASH. В остальном всё аналогично предыдущему параметру.
Запускаем сервер управления
Конфигурация хранилищ (Storage nodes)
Переходим к настройке хранилища, которое у нас распологаются на наших следующих (двух) серверах 192.168.0.11 и 192.168.0.12 соответственно. Будем редактировать файл /etc/mysql/my.cnf . Для начала необходимо сообщить нодам где “искать” управляющую ноду, добавив две строки в конфиг (секция [mysqld]):
ndb-connectstring=192.168.0.13:1186
В конце файла my.cnf должна быть секция [MYSQL_CLUSTER] , которую необходимо раскомментировать и для ndb-connectstring указать IP управляющей ноды. Если Вы ставите отдельно на разные сервера ноды данных и sql-ноды, то обратите внимание на то, что секция [mysqld] отвечает за sql-ноды, а [MYSQL_CLUSTER] за ноды данных (data-nodes).
ndb-connectstring=192.168.0.13:1186
Перезапустим хранилище и сервер MySQL
/etc/init.d/mysql restart
Аналогичную операцию необходимо произвести для второго хранилища.
Проверяем состояние кластера на управляющей ноде
root@cluster3:~# ndb_mgm
— NDB Cluster — Management Client —
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.11 (Version: 5.0.51, Nodegroup: 0, Master)
id=3 @192.168.0.12 (Version: 5.0.51, Nodegroup: 0)[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.13 (Version: 5.0.51)[mysqld(API)] 3 node(s)
id=4 (not connected, accepting connect from 192.168.0.14)
id=5 @192.168.0.11 (Version: 5.0.51)
id=6 @192.168.0.12 (Version: 5.0.51)
Тестирование хранилища
Необходимо на двух хранилищах создать базу данных clustertest.
Выполним следующие команды на 192.168.0.11
root@cluster1:~# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.51a-24+lenny2 (Debian)Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> create database clustertest;
Query OK, 1 row affected (0.01 sec)mysql>
Выполним следующие команды на 192.168.0.12
root@cluster2:~# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.51a-24+lenny2 (Debian)Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.
mysql> create database clustertest;
Query OK, 1 row affected (0.00 sec)
Создадим тестовую таблицу ndb_test для проверки хранилища и вставим одну запись.
root@cluster1:~# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 29 Server version: 5.0.51a-24+lenny2 (Debian) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use clustertest; Database changed mysql> create table ndb_test (id int) engine=ndbcluster; Query OK, 0 rows affected (0.20 sec) mysql> insert into ndb_test values (15); Query OK, 1 row affected (0.01 sec) mysql> select * from ndb_test; +------+ | id | +------+ | 15 | +------+ 1 row in set (0.00 sec) mysql>
Проверим наличие записи на другом хранилище.
root@cluster2:~# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 30 Server version: 5.0.51a-24+lenny2 (Debian) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use clustertest; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from ndb_test; +------+ | id | +------+ | 15 | +------+ 1 row in set (0.00 sec) mysql>
Как Вы заметили, что не достаточно создать БД на любом из узлов кластера. Необходимо её создать на обоих узлах кластера! Кластер от MySQL работает не так! Далее, вам следует уяснить, что кластера как такового у вас нет! Поясняю. Всё что даёт вам кластер — это новый так называемый Storage Engine или говоря по простому — способ хранения данных в БД MySQL.
В итоге оказывается, что кластерный Storage Engine имеет ещё и следующие ограничения(перечисляю не все):
- Количество атрибутов в таблице не может быть больше 128. Т.е. если у вас в таблице больше 128 полей — до свидания, работать не будет.
- Полнотекстовые индексы не поддерживаются.
- Внешние ключи (FOREIGN KEY) игнорируются.
- Размер одной записи (строки) в таблице не может превышать 8кбайт. При этом любое поле BLOB или TEXT занимает 264 байта
- Количество объектов в кластере (БД, таблицы, индексы) не может превышать 20320
- Имена объектов и таблиц, содержащие специальные символы не всегда корректно подхватываются другими узлами
- Вы не можете создавать индексы на поля типа TEXT и BLOB
- Поле типа BIT не может быть индексом иначе как в составном индексе (ни первичным ключём, ни уникальным и т.д.)
- Для каждой таблице возможно только одно поле с AUTO_INCREMENT
Подключение API node
Настройка API node схожа с настройкой хранилища, необходимо редактировать файл /etc/mysql/my.cnf . Необходимо сообщить API где “искать” управляющую ноду, добавив две строки в конфиг (секция [mysqld]):
ndb-connectstring=192.168.0.13:1186
После изменения пере запускаем MySQL
Перезапустим хранилище и сервер MySQL
На управляющей ноде можно увидеть подключенный API node.
ndb_mgm> show Connected to Management Server at: 192.168.0.13:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.0.11 (Version: 5.0.51, Nodegroup: 0, Master) id=3 @192.168.0.12 (Version: 5.0.51, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.0.13 (Version: 5.0.51) [mysqld(API)] 3 node(s) id=4 @192.168.0.14 (Version: 5.0.51) id=5 @192.168.0.11 (Version: 5.0.51) id=6 @192.168.0.12 (Version: 5.0.51)
Тестируем API node
root@cluster4:~# mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 28 Server version: 5.0.51a-24+lenny2 (Debian) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> create database clustertest; Query OK, 1 row affected (0.03 sec) mysql> use clustertest; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +-----------------------+ | Tables_in_clustertest | +-----------------------+ | ndb_test | +-----------------------+ 1 row in set (0.02 sec) mysql> select * from ndb_test; +------+ | id | +------+ | 15 | +------+ 1 row in set (0.01 sec) mysql>
Установка хранилища по умолчанию
[mysqld] default-table-type=NDBCLUSTER
