0

Установка MySQL Cluster в Debian Lenny

Posted by Hades on 20 Сентябрь 2009 in Новости |

Введение

Кластерное решение на базе MySQL является отказоустойчивым, избыточным и масштабируемым решением для баз данных, основанным на открытых исходных текстах. Использование такой схемы позволяет достигнуть надежности в 99.999 %. В этой статье мы опишем процесс установки, настройки и тестирования кластера MySQL, состоящего из четырех узлов.

Для этого нам понадобится четыре  машины с установленной на них операцонной системой Debian 5.0 (можно виртуальных, если в ознакомительных целях. Так было в моём случае – поставил под VirtualBox Debian и клонировал его.)

Схема подключения

cluster7_architecture_md

Аппаратное обеспечение

Наши четыре машины относятся к одной из трех ролей:

  1. Хранилище (Storage node) 192.168.0.11 и 192.168.0.12.
  2. API node 192.168.0.14.
  3. Сервер управления и консоль управления (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

# The loopback network interface
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

[NDBD DEFAULT]
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. В остальном всё аналогично предыдущему параметру.

Запускаем сервер управления

/etc/init.d/mysql-ndb-mgm start

Конфигурация хранилищ (Storage nodes)

Переходим к настройке хранилища, которое у нас распологаются на наших следующих (двух) серверах 192.168.0.11 и 192.168.0.12 соответственно. Будем редактировать файл /etc/mysql/my.cnf .  Для начала необходимо сообщить нодам где “искать” управляющую ноду, добавив две строки в конфиг (секция [mysqld]):

ndbcluster
ndb-connectstring=192.168.0.13:1186

В конце файла my.cnf должна быть секция [MYSQL_CLUSTER] , которую необходимо раскомментировать и для ndb-connectstring указать IP управляющей ноды. Если Вы ставите отдельно на разные сервера ноды данных и sql-ноды, то обратите внимание на то, что секция [mysqld] отвечает за sql-ноды, а [MYSQL_CLUSTER] за ноды данных (data-nodes).

[MYSQL_CLUSTER]
ndb-connectstring=192.168.0.13:1186

Перезапустим хранилище и сервер MySQL

/etc/init.d/mysql-ndb restart
/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 имеет ещё и следующие ограничения(перечисляю не все):

  1. Количество атрибутов в таблице не может быть больше 128. Т.е. если у вас в таблице больше 128 полей — до свидания, работать не будет.
  2. Полнотекстовые индексы не поддерживаются.
  3. Внешние ключи (FOREIGN KEY) игнорируются.
  4. Размер одной записи (строки) в таблице не может превышать 8кбайт. При этом любое поле BLOB или TEXT занимает 264 байта
  5. Количество объектов в кластере (БД, таблицы, индексы) не может превышать 20320
  6. Имена объектов и таблиц, содержащие специальные символы не всегда корректно подхватываются другими узлами
  7. Вы не можете создавать индексы на поля типа TEXT и BLOB
  8. Поле типа BIT не может быть индексом иначе как в составном индексе (ни первичным ключём, ни уникальным и т.д.)
  9. Для каждой таблице возможно только одно поле с AUTO_INCREMENT

Подключение API node

Настройка API node схожа с настройкой хранилища, необходимо редактировать файл /etc/mysql/my.cnf . Необходимо сообщить API где “искать” управляющую ноду, добавив две строки в конфиг (секция [mysqld]):

ndbcluster
ndb-connectstring=192.168.0.13:1186

После изменения пере запускаем MySQL

Перезапустим хранилище и сервер MySQL

/etc/init.d/mysql restart

На управляющей ноде можно увидеть подключенный 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

Случайные статьи:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Security Code:

Copyright © 2008-2012 C миру по нитке… All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.0.2, from BuyNowShop.com.