Это руководство было написано более года назад и это отличный признак,
что оно не обновлялось с тех пор! Если у вас есть вопросы, пишите
или купите мою книгу (US).
Введение
У вас ДОЛЖЕН быть третий сервер, как управляющий узел, но он может
быть выключен после запуска кластера. Заметьте также, что я не
рекомендую выключать управляющий сервер (смотрите дополнительные
замечания внизу документа для получения более полной информации). Вы
не можете запустить mysql кластер всего лишь с двумя серверами И иметь
настоящую избыточность .
Вам следует также запретить SELinux или применить следующие правила:
(большое спасибо Robin Bowes который рассказал мне это):
Несмотря на то, что возможно настроить кластер на двух физических
серверах вы НЕ ПОЛУЧИТЕ возможность "убить" один сервер и чтобы
кластер, при этом, продолжал нормально работать. Для этого вам нужен
третий сервер выполняющий управляющие функции.
Сервер 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
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/
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 [or emacs or any other editor] 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, чтобы видеть что происходит. Пример вывода
выглядит так:
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). Если вы не имеете
физического доступа, сделайте следующее:
В этом случае, игнорируйте команду "grep ndbd" (Последнюю линию), но
убейте первые два процесса, выполнив команду kill -9 pid pid:
kill -9 5578 5579
Потом попробуйте сделать select на другом сервере. Пока вы здесь,
запустите команду SHOW на управляющем узле, чтобы посмотреть, что
сервер отключился. Для рестарта просто введите
ndbd
ЗАМЕТЬТЕ, не
--inital!
Дополнительные замечания об установке
Я настоятельно рекомендую вам прочесть все (и добавить эту страницу в
закладки). Это сэкономит вам много времени поиска.
Управляющий сервер
Я настоятельно рекоммендую, чтобы вы не останавливали управляющий
сервер после запуска по следующим причинам:
* Сервер почти не расходует любые серверные ресурсы.
* Если сервер упадет, вы захотите иметь возможность просто зайти на
него по ssh и написать ndbd для его запуска. Вы не захотите
возиться с другим сервером.
* Если вы захотите сделать резервную копию, то вам будет нужно,
чтобы управляющий сервер был запущен.
* Лог кластера пересылается на управляющий сервер, так что, поэтому
чтобы проверить, что происходит на кластере или или произошло в
последнее время, это хороший инструмент.
* Все команды с клиента ndb_mgm посылаются на управляющий сервер и
таким образом нет команд управления, если нет управляющего
сервера.
* Управляющий сервер необходим в случае реконфигурации кластера
(поломка сети или обрыв сети). В случае, когда он не запущен,
произойдет сценарий "split-brain" (). Арбитражная роль
управляющего сервера требуется для этого типа установки, чтобы
предоставить лучшую сбоеустойчивость (устойчивость к поломкам).
Однако, вы все равно можете остановить сервер, если предпочитаете.
Автоматический запуск и остановка ndbd при загрузке
Чтобы сделать это, выполните следующие команды на обоих узлах mysql1 и
mysql2:
Заметьте, что это действительно быстрый скрипт. Перед тем, как
написать его, вам следует проверить, что 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 через вторую сетевую карту на второй
изолированной сети.
Другие ресурсы
Я нахожу следующие ресурсы очень полезными:
* Документация MySQL-кластера. Она постепенно переписывается и
сейчас действительно хороша.
* On-line Backup of MySQL Cluster.
* Defining MySQL Cluster Storage Nodes для информации, которая
вам потребуется, чтобы разрешить больший объем памяти для БД или
большее количество таблиц, индексов, уникальных индексов.
* MySQL Cluster mailing list.
* Google.
* MySQL Forums.
* IRC-канал #mysql на freenode и EFNet. Если вам нужен (open
source) IRC-клиент, я рекомендую Bersirc.
Благодарности
Я должен поблагодарить several others who have contributed to this:
Mikael Ronstr из MySQL AB за помощь мне заставить это работать и
исправление моих глупых ошибок в самом конце, Lewis Bergman за
внимательное чтение этой страницы и указание на возможные улучшения, и
Martin Pala за объяснение окончательных причин для сохранения
управляющего сервера запущеным, как и несколько маленьких изменений.
Спасибо также Terry из Advanced Network Hosts который платил мне
за установку кластера и одновременное написание HOWTO.
Комментарии/Изменения
Я восхищен всеми, кто посылал любые исправления или комментарии; вы
можете сделать это на Этот адрес e-mail защищен от спам-ботов.
Чтобы увидеть его, у Вас должен быть включен Java-Script . Если вы
также действительно затрудняетесь я могу помочь вам.
Пожалуйста, не копируйте этот документ; просто сделайте ссылку на
него. Это просто для предотвращения появления еще большего количества
устаревшей информации в Интернет. Я буду обновлять его. Если вы хотите
что-то изменить, пожалуйста, напишите мне.