Двухнодовый кластер MySQL на FreeBSD

Минимальные требования для кластера mysql это два сервера для данных и один сервер для управления. Сервер управления нужен лишь во время запуска кластера, но желательно держать его постоянно включенным. Итого требуется 3 физических компьютера, либо 3 виртуальные машины на двух физических серверах.

Пусть ноды с данными будут node1.host.ru и node2.host.ru, а управляющая нода mgmt.host.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

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

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong



coded by nessus