Страница 1 из 1

Настройка кластера Mysql

Добавлено: 08 дек 2010, 09:54
Raven
Это руководство было написано более года назад и это отличный признак, что оно не обновлялось с тех пор! Если у вас есть вопросы, пишите или купите мою книгу (US).

Введение

У вас ДОЛЖЕН быть третий сервер, как управляющий узел, но он может быть выключен после запуска кластера. Заметьте также, что я не рекомендую выключать управляющий сервер (смотрите дополнительные замечания внизу документа для получения более полной информации). Вы не можете запустить mysql кластер всего лишь с двумя серверами и иметь настоящую избыточность .

Вам следует также запретить SELinux или применить следующие правила: (большое спасибо Robin Bowes который рассказал мне это):

Код: Выделить всё

allow mysqld_t port_t:tcp_socket name_connect;
allow mysqld_t var_lib_t:file append;
allow mysqld_t var_lib_t:sock_file create;
allow mysqld_t var_lib_t:file read;
allow mysqld_t var_lib_t:sock_file unlink;
allow mysqld_t var_lib_t:file { getattr write };
Несмотря на то, что возможно настроить кластер на двух физических серверах вы НЕ ПОЛУЧИТЕ возможность "убить" один сервер и чтобы кластер, при этом, продолжал нормально работать. Для этого вам нужен третий сервер выполняющий управляющие функции.

Я продолжу разговор о трех серверах,
mysql1.domain.com 192.168.0.1
mysql2.domain.com 192.168.0.2
mysql3.domain.com 192.168.0.3

Сервер 1 и 2 будут парой, которая будет <кластеризована>. Это должно быть отлично для двух серверов за балансировщиком нагрузки или при использовании round robin DNS, и это хорошая альтернатива репликации. Сервер 3 нуждается только в минимальных изменениях и НЕ требует установки mysql. Это может быть low-end компьютер и он может выполнять другие задачи.

Шаг 1: Установка mysql на первые два сервера:


Выполните следующие действия на обоих mysql1 и mysql2:

Код: Выделить всё

groupadd mysql
useradd -g mysql mysql
cd /usr/local/
wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-max-5.0.15-linux-i686-glibc23.tar.gz
        /from/http://mirror.trouble-free.net/mysql_mirror/
tar -zxvf mysql-max-5.0.15-linux-i686-glibc23.tar.gz
rm mysql-max-5.0.15-linux-i686-glibc23.tar.gz
ln -s mysql-max-5.0.15-linux-i686-glibc23 mysql
cd mysql
scripts/mysql_install_db --user=mysql
chown -R root  .
chown -R mysql data
chgrp -R mysql .
cp support-files/mysql.server /etc/rc.d/init.d/
chmod +x /etc/rc.d/init.d/mysql.server
chkconfig --add mysql.server
Пока не запускайте mysql.

Шаг 2: Установка и настройка управляющего сервера

Вам потребуются следующие файлы из каталога mysql bin/ : ndb_mgm и ndb_mgmd. Загрузите весь тарболл mysql-max и извлеките (достаньте/возьмите) их из каталога bin/.

Код: Выделить всё

mkdir /usr/src/mysql-mgm
cd /usr/src/mysql-mgm
http://dev.mysql.com/get/Downloads/MySQL-4.1/mysql-max-5.0.15-pc-linux-gnu-i686.tar.gz/
        from/http://www.signal42.com/mirrors/mysql/
tar -zxvf mysql-max-5.0.15-pc-linux-gnu-i686.tar.gz
rm mysql-max-5.0.15-pc-linux-gnu-i686.tar.gz
cd mysql-max-5.0.15-pc-linux-gnu-i686
mv bin/ndb_mgm .
mv bin/ndb_mgmd .
chmod +x ndb_mg*
mv ndb_mg* /usr/bin/
cd
rm -rf /usr/src/mysql-mgm
Теперь вам нужно отредактировать конфигурационный файл (для этого управления):

Код: Выделить всё

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vi config.ini
Теперь вставьте следующее (измените немного, как указано):

Код: Выделить всё

[NDBD DEFAULT]
NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Managment Server (управляющий сервер)
[NDB_MGMD]
# the IP of THIS SERVER (IP этого сервера)
HostName=192.168.0.3
# Storage Engines (Движки хранилищ)
[NDBD]
# the IP of the FIRST SERVER (STORAGE NODE) (IP первого сервера)
HostName=192.168.0.1
DataDir= /var/lib/mysql-cluster
[NDBD]
# the IP of the SECOND SERVER (STORAGE NODE) (IP второго сервера)
HostName=192.168.0.2
DataDir=/var/lib/mysql-cluster
# 2 MySQL Clients (2 клиента MySQL)
# Я оставил это пустым, чтобы позволить быстрые изменения клиентов MySQL
# Вы можете ввести ниэних двух серверов здесь - Я предлагаю вам этого не делать
[MYSQLD]
[MYSQLD]
Теперь запустите управляющий сервер:

Код: Выделить всё

ndb_mgmd
Это управляющий сервер mysql, не консоль управления. Следовательно, не ожидайте никакого вывода (мы запустим консоль позже).

Шаг 3: Настройка серверов хранения БД / SQL и запуск mysql

На каждом из двух серверов хранения БД / SQL (192.168.0.1 и 192.168.0.2) введите следующее (измените немного, как указано):
vi /etc/my.cnf

Нажмите i для перехода в режим вставки снова и вставьте это на обоих серверах (измените IP адреса на IP адреса управляющего сервера который вы настроили на шаге 2):

Код: Выделить всё

[mysqld]
ndbcluster
# the IP of the MANAGMENT (THIRD) SERVER (IP управляющего (третьего) сервера)
ndb-connectstring=192.168.0.3
[mysql_cluster]
# the IP of the MANAGMENT (THIRD) SERVER(IP управляющего (третьего) сервера)
ndb-connectstring=192.168.0.3
Знайте, что все в секции [mysql_cluster] заместит умолчания в [mysql], поэтому, если вы определите nodeid, а затем попытаетесь запустить несколько демонов на тех-же машинах, вам следует знать это!


Сейчас мы создадим каталог данных и запустим движок базы:

Код: Выделить всё

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
/usr/local/mysql/bin/ndbd --initial
/etc/rc.d/init.d/mysql.server start
Если вы сделали один сервер, теперь вернитесь назад к началу шага 3 и повторите в точности ту же процедуру на втором сервере. Заметьте, что вам следует использовать только --initial , если вы начали сначала или сделали изменения в файле config.ini на управляющем сервере.

Шаг 4: Проверка работоспособности

Теперь вы можете вернуться к управляющему серверу (mysql3) и войти в консоль управления:

Код: Выделить всё

/usr/local/mysql/bin/ndb_mgm
Введите команду SHOW, чтобы видеть что происходит. Пример вывода выглядит так:

Код: Выделить всё

[root@mysql3 mysql-cluster]# /usr/local/mysql/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.0.1  (Version: 5.0.15, Nodegroup: 0, Master)
id=3    @192.168.0.2  (Version: 5.0.15, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.0.3  (Version: 5.0.15)

[mysqld(API)]   2 node(s)
id=4   (Version: 5.0.15)
id=5   (Version: 5.0.15)

ndb_mgm>
Если вы видите

Код: Выделить всё

not connected, accepting connect from 192.168.0.[1/2/3]
в первой или в последних двух строках, то у вас проблемы. Пожалуйста, напишите мне, предоставив столько подробностей, сколько возможно, и я могу попытаться найти, где вы сделали ошибку и изменить это HOWTO , чтобы исправить это.


Если же здесь все в порядке - время проверить MySQL. На любом сервере mysql1 или mysql2 введите следующие команды: Заметьте, что мы еще не имеем пароля root.

Код: Выделить всё

mysql
use test;
CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
INSERT INTO ctest () VALUES (1);
SELECT * FROM ctest;
Вы должны увидеть 1 возвращенный ряд (со значением 1).


Если это работает, теперь идите к другому серверу и запустите такой же SELECT, и посмотрите, что вы получите. Сделайте Insert с этого хоста и идите назад к хосту 1, и посмотрите, работает ли это. Если это работает, поздравляем.

Последний тест - это убить один из серверов, чтобы посмотреть, что произойдет. Если вы имеете физический доступ к машине, просто отключите ее сетевой кабель и смотрите, что другой сервер продолжает работать хорошо (попробуйте запрос SELECT). Если вы не имеете физического доступа, сделайте следующее:

Код: Выделить всё

ps aux | grep ndbd
Вы получите вывод, похожий на этот:

Код: Выделить всё

root      5578  0.0  0.3  6220 1964 ?        S    03:14   0:00 ndbd
root      5579  0.0 20.4 492072 102828 ?     R    03:14   0:04 ndbd
root     23532  0.0  0.1  3680  684 pts/1    S    07:59   0:00 grep ndbd
В этом случае, игнорируйте команду "grep ndbd" (Последнюю линию), но убейте первые два процесса, выполнив команду kill -9 pid pid:

Код: Выделить всё

kill -9 5578 5579
Потом попробуйте сделать select на другом сервере. Пока вы здесь, запустите команду SHOW на управляющем узле, чтобы посмотреть, что сервер отключился. Для рестарта просто введите ЗАМЕТЬТЕ, не

Код: Выделить всё

--inital!
Дополнительные замечания об установке



Я настоятельно рекомендую вам прочесть все (и добавить эту страницу в закладки). Это сэкономит вам много времени поиска.

Управляющий сервер


Я настоятельно рекоммендую, чтобы вы не останавливали управляющий сервер после запуска по следующим причинам:
  • Сервер почти не расходует любые серверные ресурсы.
  • Если сервер упадет, вы захотите иметь возможность просто зайти на него по ssh и написать ndbd для его запуска. Вы не захотите возиться с другим сервером.
  • Если вы захотите сделать резервную копию, то вам будет нужно, чтобы управляющий сервер был запущен.
  • Лог кластера пересылается на управляющий сервер, так что, поэтому чтобы проверить, что происходит на кластере или или произошло в последнее время, это хороший инструмент.
  • Все команды с клиента ndb_mgm посылаются на управляющий сервер и таким образом нет команд управления, если нет управляющего сервера.
  • Управляющий сервер необходим в случае реконфигурации кластера (поломка сети или обрыв сети). В случае, когда он не запущен, произойдет сценарий "split-brain" (<разделение мозга>). Арбитражная роль управляющего сервера требуется для этого типа установки, чтобы предоставить лучшую сбоеустойчивость (устойчивость к поломкам).

Однако, вы все равно можете остановить сервер, если предпочитаете.


Автоматический запуск и остановка ndbd при загрузке

Чтобы сделать это, выполните следующие команды на обоих узлах mysql1 и mysql2:

Код: Выделить всё

echo "#!/bin/sh" > /etc/rc.d/init.d/ndbd
echo "ndbd" >> /etc/rc.d/init.d/ndbd
chmod +x /etc/rc.d/init.d/ndbd
chkconfig --add ndbd
Заметьте, что это действительно быстрый скрипт. Перед тем, как написать его, вам следует проверить, что ndbd уже запущен на машине.

Использование hostname

Вы заметите, что я использую IP-адреса специально для этой установки. Это для того, что использование hostname просто увеличивает количество вещей, которые могут пойти неправильно. Mikael Ronstr пояснил: "Hostname, конечно, работают с кластером MySQL. Но использование hostname приводит к появлению нескольких источников ошибок, так система DNS lookup должна быть установлена, иногда /etc/hosts должен быть отредактирован и они могут быть заблокированы, гарантируя, что связь между определенными машинами невозможна, кроме как через определенные порты". Я настоятельно рекомендую, чтобы во время тестирования вы использовали IP-адреса, если это возможно, а когда это все заработает изменить их на hostname.

RAM

Используйте следующую формулу для вычисления объема RAM , который вам потребуется на каждом узле базы:
(Size of database * NumberofReplicas * 1.1) / Number of storage nodes
[ (Размер БД * КоличествоРепликаций * 1.1)/Количество узлов ]

NumberofReplicas по-умолчанию, равен 2. Вы можете изменить его в config.ini , если вы этого хотите. Так, например, чтобы запустить базу данных на 4GB с NoOfReplicas , установленным на 2, вам потребуется всего около 9GB RAM (4 * 2 * 1.1), так что, если у вас есть два узла БД, вам будет нужно 4.5GB RAM на каждом узле. Для узлов SQL и управляющего узла вам не требуется много памяти. Помните, что если у вас поля переменной ширины в MySQL Cluster 4.0 или 5.0, вы можете обнаружить, что вам потребуется НАМНОГО больше RAM, чем вычисляется по указанной формуле.

Замечание: Многие люди присылали мне вопросы по вышеприведенной математике! Помните, что кластер является отказоустойчивым, и каждый фрагмент данных сохраняется на, как минимум, двух узлах. (2 по-умолчанию, как установленно в NumberOfReplicas). Так что вам потребуется ДВОЙНОЕ пространство, нужное для одной копии данных, помноженное на 1.1 для запаса.

Добавление узлов БД

Если вы желаете добавить узлы БД, помните, что 3 - не оптимальное значение. Если вы переходите с 2 (выше) , то переходите на 4.

Добавление узлов SQL

Если вы хотите добавить другие узлы SQL (например, у вас есть другой сервер, который вы хотите добавить в кластер, но вам не нужно делать его узлом БД), поэтому просто добавьте следующее в /etc/my.cnf на сервере (это должен быть сервер mysql-max):

Код: Выделить всё

[mysqld]
ndbcluster
# the IP of the MANAGMENT (THIRD) SERVER (IP управляющего (третьего) сервера)
ndb-connectstring=192.168.0.3
[mysql_cluster]
# the IP of the MANAGMENT (THIRD) SERVER(IP управляющего (третьего) сервера)
ndb-connectstring=192.168.0.3
Далее вы должны убедиться, что есть еще одна линия [MYSQLD] в конце файла config.ini на управляющем сервере. Перезапустите кластер (смотрите важное замечание далее) и перезапустите mysql на новом API. Он должен быть подключен.


Важное замечание по изменению config.ini


Если вы всего лишь изменили config.ini , вы должны остановить весь кластер и перезапустить его для повторного чтения файла конфигурации. Остановите кластер командой SHUTDOWN к пакету ndb_mgm на управляющем сервере , а затем перезапустите все узлы БД.


Несколько полезных опций конфигурации, которые вам потребуются, если у вас большие таблицы:


DataMemory: определяет пространство, доступное для хранения актуальных (текущих) записей в БД. Вся DataMemory будет распределена (выделена) в памяти , поэтому важно, чтобы машина содержала достаточное количество памяти для обработки размера DataMemory. Заметьте, что DataMemory также используется для хранения упорядоченных индексов. Упорядоченные индексы используют около 10 байтов на запись. По-умолчанию: 80MB IndexMemory IndexMemory - это параметр, который контролирует пространство, используемое для хэш-индексов кластера MySQL. Хэш-индексы всегда используются для индексов первичного ключа, уникальных индексов, и уникальных constraints (принуждать/ограничивать). По-умолчанию: 18MB MaxNoOfAttributes Этот параметр определяет количество атрибутов, которые могут быть определены в кластере. По- умолчанию: 1000 MaxNoOfTables Очевидно (помните, что каждое поле BLOB создает другую таблицу по различным причинам - это тоже надо учитывать). По-умолчанию: 128


Смотрите эту страницу на mysql.com для полной информации об опциях, которые вы можете включить в секцию [NDBD] файла config.ini

Замечание о безопасности

Кластер MySQL не является безопасным. По-умолчанию, каждый может подключиться к вашему управляющему серверу и все испортить. Я предлагаю следующие меры предосторожности:
  • Установите APF и заблокируйте все порты, за исключением используемых вами ( НЕ включая любые порты кластера MySQL). Добавьте IP-адреса узлов вашего кластера в файл /etc/apf/allow_hosts.
  • Запускайте кластер MySQL через вторую сетевую карту на второй изолированной сети.
Другие ресурсы

Я нахожу следующие ресурсы очень полезными:

Благодарности

Я должен поблагодарить several others who have contributed to this: Mikael Ronstr из MySQL AB за помощь мне заставить это работать и исправление моих глупых ошибок в самом конце, Lewis Bergman за внимательное чтение этой страницы и указание на возможные улучшения, и Martin Pala за объяснение окончательных причин для сохранения управляющего сервера запущеным, как и несколько маленьких изменений. Спасибо также Terry из Advanced Network Hosts который платил мне за установку кластера и одновременное написание HOWTO.

Комментарии/Изменения

Я восхищен всеми, кто посылал любые исправления или комментарии; вы можете сделать это на alex 'at' davz.net . Если вы также действительно затрудняетесь я могу помочь вам.

Пожалуйста, не копируйте этот документ; просто сделайте ссылку на него. Это просто для предотвращения появления еще большего количества устаревшей информации в Интернет. Я буду обновлять его. Если вы хотите что-то изменить, пожалуйста, напишите мне.

Автор: Alex Davies
Перевод: TuxR