(Источник: http://nikita.rockby.net/2008/02/01/ustanovka-i-nastrojka-mysql-klastera-na-freebsd/)
У меня имелось 4 сервера для создания кластера ( node0 (ip: 192.168.174.193) и node1 (ip: 192.168.174.129) – так называемые Data Nodes, на которых и хранятся файлы баз данных, а также node2 (I) и node3 (ip: 192.168.174.196) – управляющие ноды).
Задача: обеспечить полную работоспособность при выходе одного из серверов из строя.
Рис.1 Схема работы кластера MySQL
На рис.1 представлена схема работы MySQL кластера. MySQL Cluster состоит из набора компьютеров, каждый выполняет ряд процессов, включая сервер MySQL, узлы хранения для NDB, сервер управления и (возможно) специализированные программы доступа к данным. Все эти программы работают вместе, чтобы формировать MySQL Cluster. Когда данные сохранены в NDB Cluster, таблицы сохранены в узлах памяти для NDB Cluster. Такие таблицы непосредственно доступны со всех других серверов MySQL в кластере. Таким образом, в прикладной программе, сохраняющей данные в кластере, если одна прикладная программа что-то модифицирует, все другие серверы, которые сделают запрос, эти данные могут увидеть измененными немедленно.
Нужно отметить, что для корректной работы необходимо наличие как минимум 3-х серверов (одного управляющего и двух серверов с данными). На самом деле, управляющий сервер нужен только при запуске кластера, потом его можно отключить, хотя это крайне не рекомендуется, потому что, если произойдёт сбой, то для того, чтобы включить этот нод снова в кластер, опять будет необходим управляющий нод.
Скачиваем MySQL 5.0 для FreeBSD отсюда: http://dev.mysql.com/downloads/mysql/5.0.html#freebsd
На нодах с данными (node0 и node1) распаковываем скачанный архив и начинаем установку:
[nikita@node0 ~]$ su node0# cp mysql-5.0.45-freebsd6.0-i386.tar.gz /usr/local/ node0# cd /usr/local/ node0# tar -zxvf mysql-5.0.45-freebsd6.0-i386.tar.gz node0# rm -r mysql-5.0.45-freebsd6.0-i386.tar.gz node0# ln -s mysql-5.0.45-freebsd6.0-i386/ mysql
добавляем пользователя mysql:
node0# adduser Username: mysql Full name: Uid (Leave empty for default): Login group [mysql]: Login group is mysql. Invite mysql into other groups? []: Login class [default]: Shell (sh csh tcsh bash nologin) [sh]: nologin Home directory [/home/mysql]: Use password-based authentication? [yes]: no Lock out the account after creation? [no]: Username : mysql Password : Full Name : Uid : 1003 Class : Groups : mysql Home : /home/mysql Shell : /usr/sbin/nologin Locked : no OK? (yes/no): yes adduser: INFO: Successfully added (mysql) to the user database. Add another user? (yes/no): no Goodbye!
и заканчиваем установку:
node0# cd mysql/ node0# scripts/mysql_install_db –user=mysql
При удачной установке должен появиться следующий текст:
Installing MySQL system tables... OK Filling help tables... OK To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: ./bin/mysqladmin -u root password 'new-password' ./bin/mysqladmin -u root -h node0.beltadmn password 'new-password' See the manual for more instructions. You can start the MySQL daemon with: cd . ; ./bin/mysqld_safe & You can test the MySQL daemon with mysql-test-run.pl cd mysql-test ; perl mysql-test-run.pl Please report any problems with the ./bin/mysqlbug script! The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at http://shop.mysql.com
Устанавливаем необходимые права на каталоги и файлы, запускаем сервер и добавляем скрипты запуска в /etc/rc.local для автоматического старта:
node0# chown -R root . node0# chown -R mysql data node0# chgrp -R mysql . node0# cp support-files/mysql.server /usr/local/etc/rc.d/mysql.server node0# /usr/local/etc/rc.d/mysql.server start node0# echo "/usr/local/mysql/bin/ndbd --initial" >> /etc/rc.local node0# echo "/usr/local/etc/rc.d/mysql.server start" >> /etc/rc.local
На управляющих нодах устанавливаем только сервер управления (ndb_mgmd) и консоль (ndb_mgm):
node2# tar -xzvf mysql-5.0.45-freebsd6.0-i386.tar.gz node2# cp mysql-5.0.45-freebsd6.0-i386/bin/ndb_mgm /usr/local/bin/ node2# cp mysql-5.0.45-freebsd6.0-i386/bin/ndb_mgmd /usr/local/bin/ node2# rm -r mysql-5.0.45-freebsd6.0-i386/ node2# mkdir /var/lib node2# mkdir /var/lib/mysql-cluster node2# cd /var/lib/mysql-cluster
Создадим файл настройки config.ini для ndb_mgmd:
node2# vi config.ini node2# cat config.ini
На node2 он у меня получился таким:
[nikita@node2 ~]$ cat /var/lib/mysql-cluster/config.ini [NDBD DEFAULT] NoOfReplicas=2 #MaxNoOfConcurrentOperations= 2000000 #DataMemory= 280M #IndexMemory= 110M TimeBetweenWatchDogCheck= 30000 MaxNoOfOrderedIndexes= 512 [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] # Management Server [NDB_MGMD] HostName=192.168.174.247 # IP address of this server DataDir= /var/lib/mysql-cluster [NDB_MGMD] HostName=192.168.174.196 DataDir= /var/lib/mysql-cluster # Storage Nodes [NDBD] HostName=192.168.174.129 # IP address of storage-node-1 DataDir= /var/lib/mysql-cluster [NDBD] HostName=192.168.174.193 # IP address of storage-node-2 DataDir=/var/lib/mysql-cluster # Setup node IDs for mySQL API-servers (clients of the cluster) [MYSQLD] [MYSQLD] [MYSQLD] [MYSQLD]
На node3:
[nikita@node3 ~]$ cat /var/lib/mysql-cluster/config.ini [NDBD DEFAULT] NoOfReplicas=2 #MaxNoOfConcurrentOperations= 2000000 #DataMemory= 280M #IndexMemory= 110M TimeBetweenWatchDogCheck= 30000 MaxNoOfOrderedIndexes= 512 [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] # Management Server [NDB_MGMD] HostName=192.168.174.196 # IP address of this server DataDir= /var/lib/mysql-cluster [NDB_MGMD] HostName=192.168.174.247 DataDir= /var/lib/mysql-cluster # Storage Nodes [NDBD] HostName=192.168.174.129 # IP address of storage-node-1 DataDir= /var/lib/mysql-cluster [NDBD] HostName=192.168.174.193 # IP address of storage-node-2 DataDir=/var/lib/mysql-cluster # Setup node IDs for mySQL API-servers (clients of the cluster) [MYSQLD] [MYSQLD] [MYSQLD] [MYSQLD]
Теперь можно стартовать ndb_mgmd на node0 и node1. По умолчанию он пытается прочитать файл config.ini в текущей директории.
node2# ndb_mgmd
Чтобы запускать ndb_mgmd из любого места используется:
node2# ndb_mgmd -f /var/lib/mysql-cluster/config.ini
Можно добавить эту команду в /etc/rc.local, чтобы управляющая программа стартовала автоматически:
[nikita@node2 ~]$ cat /etc/rc.local /usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
Теперь попробуем проверить состояние кластера (хоть пока он ещё не создан, но управление им уже начало свою работу):
node2# ndb_mgm ndb_mgm> show
После запуска команды show должно выдаться примерно следующее:
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.174.129) id=4 (not connected, accepting connect from 192.168.174.193) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.174.247 (Version: 5.0.45) id=2 @192.168.174.196 (Version: 5.0.45) [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 сервера на node1 и node0:
[root@node0 ~]# cat /etc/my.cnf [mysqld] ndbcluster ndb-connectstring='host=192.168.174.247:1186' # IP address of the management server ndb-connectstring='host=192.168.174.196:1186' # IP address of the management server [mysql_cluster] ndb-connectstring='host=192.168.174.247:1186' # IP address of the management server ndb-connectstring='host=192.168.174.196:1186' # IP address of the management server [DB DEFAULT] DataMemory: 500M IndexMemory: 100M [root@node1 /usr/local/mysql]# mkdir /var/lib [root@node1 /usr/local/mysql]# mkdir /var/lib/mysql-cluster [root@node1 /usr/local/mysql]# /usr/local/mysql/bin/ndbd --initial [root@node1 /usr/local/mysql]# /usr/local/etc/rc.d/mysql.server start
Запускаем проверяем состояние кластера через консоль управления (на node2):
node2# ndb_mgm ndb_mgm> show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=3 @192.168.174.129 (Version: 5.0.45, Nodegroup: 0, Master) id=4 @192.168.174.193 (Version: 5.0.45, Nodegroup: 0) [ndb_mgmd(MGM)] 2 node(s) id=1 @192.168.174.247 (Version: 5.0.45) id=2 @192.168.174.196 (Version: 5.0.45) [mysqld(API)] 4 node(s) id=5 @192.168.174.193 (Version: 5.0.45) id=6 @192.168.174.129 (Version: 5.0.45) id=7 (not connected, accepting connect from any host) id=8 (not connected, accepting connect from any host)
На node0 и node1 добавляем в /etc/rc.local:
/usr/local/mysql/bin/ndbd --initial /usr/local/etc/rc.d/mysql.server start
[nikita@node0 ~]$ su
node0# cp mysql-5.0.45-freebsd6.0-i386.tar.gz /usr/local/
node0# cd /usr/local/
node0# tar -zxvf mysql-5.0.45-freebsd6.0-i386.tar.gz
node0# rm -r mysql-5.0.45-freebsd6.0-i386.tar.gz
node0# ln -s mysql-5.0.45-freebsd6.0-i386/ mysql