Ключевые слова:mysql, cluster, replication, (найти похожие документы)
From: TuxR <http://www.rostovlinux.ru>
Date: Mon, 20 May 2006 18:21:07 +0000 (UTC)
Subject: Настройка Mysql кластера
Оригинал: http://www.rostovlinux.ru/content/view/966/56/
Это руководство было написано более года назад и это отличный признак,
что оно не обновлялось с тех пор! Если у вас есть вопросы, пишите
или купите мою книгу (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
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, чтобы видеть что происходит. Пример вывода
выглядит так:
[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 на управляющем узле, чтобы посмотреть, что
сервер отключился. Для рестарта просто введите
ndbd
ЗАМЕТЬТЕ, не
--inital!
Дополнительные замечания об установке
Я настоятельно рекомендую вам прочесть все (и добавить эту страницу в
закладки). Это сэкономит вам много времени поиска.
Управляющий сервер
Я настоятельно рекоммендую, чтобы вы не останавливали управляющий
сервер после запуска по следующим причинам:
* Сервер почти не расходует любые серверные ресурсы.
* Если сервер упадет, вы захотите иметь возможность просто зайти на
него по ssh и написать ndbd для его запуска. Вы не захотите
возиться с другим сервером.
* Если вы захотите сделать резервную копию, то вам будет нужно,
чтобы управляющий сервер был запущен.
* Лог кластера пересылается на управляющий сервер, так что, поэтому
чтобы проверить, что происходит на кластере или или произошло в
последнее время, это хороший инструмент.
* Все команды с клиента ndb_mgm посылаются на управляющий сервер и
таким образом нет команд управления, если нет управляющего
сервера.
* Управляющий сервер необходим в случае реконфигурации кластера
(поломка сети или обрыв сети). В случае, когда он не запущен,
произойдет сценарий "split-brain" (). Арбитражная роль
управляющего сервера требуется для этого типа установки, чтобы
предоставить лучшую сбоеустойчивость (устойчивость к поломкам).
Однако, вы все равно можете остановить сервер, если предпочитаете.
Автоматический запуск и остановка ndbd при загрузке
Чтобы сделать это, выполните следующие команды на обоих узлах mysql1 и
mysql2:
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 через вторую сетевую карту на второй
изолированной сети.
Другие ресурсы
Я нахожу следующие ресурсы очень полезными:
* Документация 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 . Если вы
также действительно затрудняетесь я могу помочь вам.
Пожалуйста, не копируйте этот документ; просто сделайте ссылку на
него. Это просто для предотвращения появления еще большего количества
устаревшей информации в Интернет. Я буду обновлять его. Если вы хотите
что-то изменить, пожалуйста, напишите мне.
Неплохая статья!
У меня есть вопрос такой.
То что резервирование происходит - это понятно.
То что на каждой машине можно выполнить запрос из общей БД - это понятно.
НЕ ПОНЯТНО: при выполнении запроса на одной ноде, будет задействовано вычисление только на этой ноде или на обоих?
т.е. вычислительные мощности нод объединяются при выполнении mysql запроса на одной из нод?
Интересует этот вопрос, т.к. мне требуется выполнять объемные и многочисленные запросы на mysql.