Настройка кластера Mysql
Добавлено: 08 дек 2010, 09:54
Введение
У вас ДОЛЖЕН быть третий сервер, как управляющий узел, но он может быть выключен после запуска кластера. Заметьте также, что я не рекомендую выключать управляющий сервер (смотрите дополнительные замечания внизу документа для получения более полной информации). Вы не можете запустить 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
Шаг 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
Шаг 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
Сейчас мы создадим каталог данных и запустим движок базы:
Код: Выделить всё
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
/usr/local/mysql/bin/ndbd --initial
/etc/rc.d/init.d/mysql.server start
Шаг 4: Проверка работоспособности
Теперь вы можете вернуться к управляющему серверу (mysql3) и войти в консоль управления:
Код: Выделить всё
/usr/local/mysql/bin/ndb_mgm
Код: Выделить всё
[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]
Если же здесь все в порядке - время проверить MySQL. На любом сервере mysql1 или mysql2 введите следующие команды: Заметьте, что мы еще не имеем пароля root.
Код: Выделить всё
mysql
use test;
CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;
INSERT INTO ctest () VALUES (1);
SELECT * FROM ctest;
Если это работает, теперь идите к другому серверу и запустите такой же 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
Код: Выделить всё
kill -9 5578 5579
Код: Выделить всё
ndbd
Код: Выделить всё
--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
Использование 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
Важное замечание по изменению 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.
Благодарности
Я должен поблагодарить 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