Архив метки: MySQL

Создание кластера 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

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

Простой FTP с базой в MySQL на FreeBSD

Быстрая настройка PureFTPd на FreeBSD.

На mysql создаем базу ftp на 4 поля
User varchar(16) ключ
Password varchar(16)
Dir varchar(32)
Uid int(11)
Gid int(11)

создаем пользователя ftp с правами чтения на базу ftp

устанавливаем порт pure-ftpd
/usr/ports/ftp/pure-ftpd
make
выбираем опции
MySQL
PAM
SENDFILE

make install
в /etc/rc.conf добавляем
pureftpd_enable="YES"

если версия freebsd до 5.х то в /usr/local/etc/rc.d/pure-ftpd.sh
правим строчку
etc/rc.subr
на
. "/usr/local/etc/rc.subr"

в противном случае демон не запустится и выдаст ошибку:
# ./pure-ftpd.sh start
.: Can't open etc/rc.subr: No such file or directory

Если версия FreeBSD выше 5 то правка не обязательна.

Правим конфигурационные файлы, их понадобится два (в листинге приведен минимальный набор параметров для запуска демона):
Файл /usr/local/etc/pure-ftpd.conf
он должен содержать такие инструкции:
ChrootEveryone yes
BrokenClientsCompatibility no
MaxClientsNumber 50
Daemonize yes
MaxClientsPerIP 8
VerboseLog no
DisplayDotFiles no
AnonymousOnly no
NoAnonymous no
SyslogFacility ftp
DontResolve yes
MaxIdleTime 15
MySQLConfigFile /usr/local/etc/pureftpd-mysql.conf
LimitRecursion 10000 16
AnonymousCanCreateDirs no
MaxLoad 4
PassivePortRange 30000 40000
AntiWarez yes
Bind YYY.YYY.YYY.YYY,21
Umask 133:022
MinUID 80
AllowUserFXP no
AllowAnonymousFXP no
ProhibitDotFilesWrite no
ProhibitDotFilesRead no
AutoRename no
AnonymousCantUpload no
MaxDiskUsage 99
CustomerProof yes

Где YYY.YYY.YYY.YYY - адрес где демон будет слушать, 21 - порт по умолчанию (можно заменить на любой)
MinUID - минимальное значение UID которе будет пропускаться демоном. Рекомендуется выставлять то значение, с которого начинаются
системные пользователи, которые будут работать с ftp.
PassivePortRange - диапазон портов для пассивного режима (полезно выставить ограниченный диапазон для организации открытия портов на firewall)
Остальные параметры совершенно прозрачны и пояснений не требуют.

Файл /usr/local/etc/pureftpd-mysql.conf
MYSQLServer localhost
MYSQLPort 3306
MYSQLUser ftp
MYSQLPassword ftp
MYSQLDatabase ftp
MYSQLCrypt cleartext
MYSQLGetPW SELECT Password FROM Users WHERE User="\L"
MYSQLGetDir SELECT Dir FROM Users WHERE User="\L"
MYSQLGetUID SELECT Uid FROM Users WHERE User="\L"
MYSQLGetGID SELECT Gid FROM Users WHERE User="\L"

При условии что наш MySQL сервер слушает localhost на 3306 порту. Если иначе - исправляем на свои значения.

Создаем в базе данных пользователя с логином паролем и его корневой директорией, задаем ему uid и gid 80 (можно другие, но выше 80 в нашем случе.
Я делал 80 так как нужны были фтп доступы к веб директориям Apache, чтобы не приходилось менять владельцев после залива по фтп контента).
Все. можно запускать pure-ftpd и коннектиться с заданным аккаунтом к искомой директории.
Можно так же расширить таблицу в базе данных до соответствующих полей на квоты и прочие прелести (там все довольно прозрачно), но для минимального
подъема демона это не требуется.

Восстановление потерянного пароля root в MySQL

Часто на новом месте работы приходится принимать автопилотные сервера с MySQL, где root пароли от системы еще известны, а вот у служб - уже нет. Рассмотрю смену пароля MySQL на платформе FreeBSD. Для других О решение в принципе аналогичное. Итак нам надо:

1. остановить сервер
/usr/local/etc/rc.d/mysql-server.sh stop
2. запустить в режиме игнорирования таблицы безопасности
mysqld_safe --skip-grant-tables &
3. законнектиться под рутом
mysql -u root
4. выбрать системную таблицу где хранятися пароли
use mysql
5. сменить пароль командой
UPDATE user SET Password=PASSWORD("Ваш новый пароль") WHERE User='root';
6. обновить привилегии
FLUSH PRIVILEGES;
7. выйти из mysql
exit
8. остановить mysq -демона в режиме игнора
/usr/local/etc/rc.d/mysql-server.sh stop
9. запустить в нормальном режиме
/usr/local/etc/rc.d/mysql-server.sh start

И все. Сервер работает, пароль root заменен.

Установка MySQL на FreeBSD

Краткий кукбук по установке MySQL на FreeBSD.

Ставим из портов (версия порта меняется), описано для примера 5.1:
cd usr/ports/databases/mysql51-server
make install clean
rehash

в etc/rc.conf добавляем
mysql_enable="YES"

выполняем инициализацию системных БД
cd /usr/local/
bin/mysql_install_db --user=mysql --ldata=/var/db/mysql

запускаем сервер
/usr/local/etc/rc.d/mysql-server start

меняем пассы рута, потому как по умолчанию пустышки
/usr/local/bin/mysqladmin -u root password пароль
/usr/local/bin/mysqladmin -u root -h ns1.mydomain.ru password пароль (если запущен слушать и на ns1.mydomain.ru)

обычно я оставляю только root пароль для localhost, остальное удаляю. Так как чаще всего mysql нужен только локально, то лишние учетные записи, равно как и работа демона на интерфейсах отличных от localhost не нужны.

если обновили mysql с предыдущей версии то запускаем mysql_upgrade сразу после обновления