Создание кластера MySQL

По документации минимальные требования для кластера mysql это два сервера данных и один сервер управления. Сервер управления нужен лишь во время старта кластера, но лучше держать его постоянно включенным. Нужно иметь 2 ноды для серверов баз данных и 1 ноду для управления. Итого требуется 3 физических компьютера, либо 3 виртуальные машины на двух физических серверах.
Пусть ноды с данными будут node1.domain.ru и node2.domain.ru, а управляющая нода mgmt.domain.ru. DNS резолвинг настроен, все ноды видят друг друга как по IP так и по FQDN. Так же необходимо чтобы на нодах данных был открыт порт 3306 для всех нод-участников кластера, а на ноде управления открыт порт 1186.
Допустим IP адреса у серверов такие:
node1 192.168.1.1
node2 192.168.1.2
mgmt 192.168.1.3

Добавим кластерную конфигурацию, создадим конфиг файл /etc/my.cnf со следующими парамметрами:
[mysqld]
ndbcluster
ndb-connectstring='host=192.168.1.3:1186'

[mysql_cluster]
ndb-connectstring='host=192.168.1.3:1186'

[DB DEFAULT]
DataMemory: 500M
IndexMemory: 100M

Далее создадим на каждой ноде каталог /var/lib/mysql-cluster/

Ставим из портов /usr/ports/misc/compat6x
make
make install
rehash

Создаем пользователя и группу mysql

Скачиваем последнюю версию дистрибутива 5.0 с сайта разработчика (в версиях 5.1 и 6.0 кластерная составляющая отсутствует, к тому же в коллекции портов FreeBSD даже в версии 5.0 ее тоже нет) и распаковываем архив в /usr/local/
переименовываем папку в mysql чтобы получилось /usr/local/mysql
идем туда и создаем системные базы данных
scripts/mysql_install_db --user=mysql

Меняем права на папки (находясь в каталоге /usr/local/mysql):
chown -R root .
chown -R mysql data
chgrp -R mysql .

копируем стартстопный скрипт
cp support-files/mysql.server /usr/local/etc/rc.d/mysql.server
Запускаем его
/usr/local/etc/rc.d/mysql.server start

создаем файл etc/rc.local и добавляем туда скрипты старта кластера
/usr/local/mysql/bin/ndbd
/usr/local/etc/rc.d/mysql.server start

Меняем пароли root сервера mysql:
node1:
/usr/local/mysql/bin/mysqladmin -u root -h node1.domain.ru password пароль
/usr/local/mysql/bin/mysqladmin -u root password пароль

node2:
/usr/local/mysql/bin/mysqladmin -u root -h node2.domain.ru password пароль
/usr/local/mysql/bin/mysqladmin -u root password пароль

Оставим пока сервера данных и займемся нодой управления:
Ставим из портов /usr/ports/misc/compat6x
make
make install
rehash

Нам нужны консоль и демон управления ndb_mgm и ndb_mgmd соответственно. Взять их можно из архива дистрибутива mysql в каталоге /bin. Распаковываем эти два файла в /usr/local/bin
Создаем каталог /var/lib/mysql-cluster/ и создаем в нем конфигурационный файл для управления config.ini:

[NDBD DEFAULT]
NoOfReplicas=2
TimeBetweenWatchDogCheck= 30000
MaxNoOfOrderedIndexes= 512
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
[NDB_MGMD]
HostName=192.168.1.3
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName=192.168.1.1
DataDir= /var/lib/mysql-cluster
[NDBD]
HostName=192.168.1.2
DataDir=/var/lib/mysql-cluster
[MYSQLD]
[MYSQLD]
[MYSQLD]
[MYSQLD]

Стартуем демон управления(для автозапуска при загрузке сервера эту строку нужно добавить в /etc/rc.local):
#/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Запускаем проверку работоспособности консоли:
/usr/local/bin/ndb_mgm
в окне приглашения вводим show, и видим следующую картину:

Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=3 (not connected, accepting connect from 192.168.1.1)
id=4 (not connected, accepting connect from 192.168.1.2)

[ndb_mgmd(MGM)] 2 node(s)
id=1 @192.168.1.3 (Version: 5.0.85)

[mysqld(API)] 4 node(s)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)

Это означает что конфиг настроен правильно, но ноды данных еще не работают в кластере. Вернемся к нодам данных. На каждой из них останавливаем mysql и инициализируем кластер и перезапускаем сервер:
/usr/local/etc/rc.d/mysql.server stop
/usr/local/mysql/bin/ndbd --initial
/usr/local/etc/rc.d/mysql.server start

На ноде управления снова проверяем работу кластера через ndb_mgm:
mgmt# /usr/local/bin/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.1.1 (Version: 5.0.85, Nodegroup: 0, Master)
id=3 @192.168.1.2 (Version: 5.0.85, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.3 (Version: 5.0.85)

[mysqld(API)] 4 node(s)
id=4 @192.168.1.1 (Version: 5.0.85)
id=5 @192.168.1.2 (Version: 5.0.85)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)

Если в строках id1 id2 id3 id4 и id5 видно работающие, отвечающие демоны как это видно выше, то все ок и кластер работает. Если нет - еще раз смотрим эту документацию.
Проверяем отказоустойчивость кластера:

Допустим на первой ноде заходим в mysql и создаем табличку в базе test:
#/usr/local/mysql/bin/mysql -u root -pпароль
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.85 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;
Database changed
mysql> CREATE TABLE clustered (i INT) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (1.53 sec)
mysql> INSERT INTO clustered () VALUES (1);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM clustered;
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.01 sec)

mysql> exit
Bye

Теперь на второй ноде делаем SELECT из базы test:
node2# /usr/local/mysql/bin/mysql -u root -pпароль
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.85 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;
Database changed
mysql> SELECT * FROM clustered;
+------+
| i |
+------+
| 1 |
+------+
1 row in set (0.02 sec)

mysql> exit
Bye

Как видим, на второй ноде у нас уже есть данные, которые были на первой, а значит кластер работает. Можно еще проверить записав в таблицу значение на второй ноде и запустить SELECT на первой - увидим все данные.

Теперь перезапустим например node2
при этом пока нода будет перезагружаться в ndb_mgm мы последовательно будем видеть такие ее состояния:
нода выключена:
id=3 (not connected, accepting connect from 192.168.1.2)
потом когда mysql на ней запустится станет:
id=3 @192.168.1.2 (Version: 5.0.85, starting, Nodegroup: 0)
потом когда кластер войдет в рабочий режим:
id=3 @192.168.1.2 (Version: 5.0.85, Nodegroup: 0)

Теперь можно проверить работу баз при отказе ноды. Для этого выключим одну из нод из сети, а на второй ноде подключаемся к mysql и дописываем в таблицу еще одно значение:
#/usr/local/mysql/bin/mysql -u root -pпароль
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.0.85 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use test;
Database changed
mysql> CREATE TABLE clustered (i INT) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (1.53 sec)
mysql> INSERT INTO clustered () VALUES (1);
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM clustered;
+------+
| i |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.02 sec)

mysql> exit
Bye

Как видно, база данных не потерялась а продолжает работать и без одной ноды. Теперь проверим восстанавливаемость кластера, подключив к сети отключенную ранее ноду и сделав на ней SELECT из этой же базы:
/usr/local/mysql/bin/mysql -u root -pпароль
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.85 MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test;
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 clustered;
+------+
| i |
+------+
| 2 |
| 1 |
+------+
2 rows in set (0.01 sec)

mysql> exit
Bye

Все работает!

Поделиться

Опубликовать в Facebook
Опубликовать в LiveJournal

Создание кластера MySQL: 2 комментария

  1. Спасибо большое за статью!

    Я новичок в этой сфере, у меня такой вопрос:

    Установил три разных сервера Linux Debian.
    Установил на каждом из серверов percona-xtradb-cluster-56.
    Как настроить кластер так, чтобы управляющей была вторая нода. Например, первая нода имеет адрес 192.168.0.15, вторая нода: 192.168.0.18, и третья нода 192.168.0.20. Как в качестве управляющей ноды назначить сервер с ip: 192.168.0.18?

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

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

*

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