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

Кластеризация приложения, не предназначенного для кластеризации

Сразу оговорюсь - приложения, которые выводят что-то на консоль при запуске кластеризовать можно, но этой самой консоли мы не получим, так как при старте приложения, оно запускается от учетной записи SYSTEM, к консоли которого мы подключиться не можем, по причине ее отсутствия. Читать далее Кластеризация приложения, не предназначенного для кластеризации

Поднимаем программный iSCSI-Target для виртуализации в среде Hyper-V

Отдел разработки попросил организовать им тестовый SQL кластер.
Физические машины для кластеризации SQL у меня закончились, по этому решил реализовать всё на виртуалках Hyper-V.
К тому же тестовая зона разработки не требует больших нагрузок, по этому решение на виртуалках самое подходящее.
В качестве общего хранилища решил использовать еще одну виртуалку с установленным на ней прогаммным iSCSI-Target.
В качестве софта использовал продукт от Starwind Software - Starwind iSCSI Server, тем более что они предоставляют после регистрации на сайте беспланый вариант, с функционалом бесконечного количества поключений и объем дисков 2Тб.
Для тестов этого вполне достаточно.

Итак, имеем 3 виртуалки. На двух Failower clustering, 3 сетевые карты: физическая, кластерная и для iscsi.
На третей две сетевые карты: физическая и для организации iSCSI.

Устанавливаем Starwind iSCSI Server, запускаем.
По умолчанию для сервера логин и пароль root:starwind
Меняем настройки:
В меню Options выбираем language и ставим russian
В меню Хост выбираем регистрацию и указываем файл ключа, который пришел к нам на почту при регистрации на сайте разработчиков Starwind.
Идем в Starwind серверы выбираем добавить сервер и указываем адрес 127.0.0.1 (так как сервер у нас работает на этой машине)
Клик на сервере, Интерфейс управления, Параметры аутентификации - Изменить. Использовать базовую аутентификацию сменяем пароль.
Выбираем Таргеты кликаем добавить таргет
Вводим псевдоним таргета - sqltarget (ясное дело может быть любой на свой вкус)
Галочку Имя таргета - запоминаем имя таргета iqn.2008-08.com.starwindsoftware:tiscsi.starp.ru-sqltarget (просто на всякий случай. в 2008 нормально работает autodiscovery)
Выбираем жесткий диск (физический диск нельзя на тестовой лицензии, только виртуальный контейнер)
Выбираем виртуальный или базовый или расширенный функционал. Для моей задачи подходит базовый
Выбираем Image file
Выбираем Создать новый виртуальный жесткий диск, указываем путь где хранить диск и его размер
Пусть My Computer\C\Distribs\Discs\sql.img и размер 5 гигабайт (место под хранение тестовых баз). Можно установить сжатие диска и шифрование
Далее указываем параметры Image File устройства. Указываем только что созданный файл диска, ставим галочки Асинхронный режим и Разрешить множественные конкурентные iSCSI подключения (кластеринг)
Указываем режим кеша (оставил Normal без кеширования)
Соглашаемся с созданием, еще раз проверяем имя таргета

Так же создаем таргеты для quorum 500мб и DTC - 500мб
iqn.2008-08.com.starwindsoftware:tiscsi.starp.ru-quorum
iqn.2008-08.com.starwindsoftware:tiscsi.starp.ru-dtc

Так же рекомендую в настройках ссервера в опциях Сеть отлючить прослушивание на внешней сетевой карте, а так же открыть на файрволе порт, на котором запущена служба, по умолчанию это 3260

На нодах запускаем iSCSI initiator, при первом запуске настроится служба и разрешения
Закладка Discovery - Add Portal, указываем ip и порт сервера с iscsi-target
Закладка Targets - видим 3 таргета - это три наших диска. Нажимаем Logon, ставим галочку Automaticaly restore this connection when computer starts
Закладка Volumes and Devices - кнопка Autoconfigure

Получаем неинициализированные отключенные жестуие диски. Стартуем их, инициализируем, форматируем.
Диски готовы к использованию в кластере.

Нюанс при развертывании MSSQL кластера под Windows Server 2008

Столкнулся с некоторой тонкостью в настройке кластеризованного приложения, в частности MSSQL2008. В один прекрасный день при переключении SQL с ноды на ноду, приложение не захотело стартовать.
На резервной ноде запустились ресурсы Name, Cluster Disk, Analysis Services. А вот сам SQL Server и соответственно SQL Server Agent запуститься отказались. При попытке вернуть их на первую ноду они так-же отказались стартовать.
Журнал ошибок приложений по этому поводу выдал следующее:

Log Name: Application
Source: MSSQLSERVER
EventID: 19019
[sqsrvres] ODBC sqldriverconnect failed

Log Name: Application
Source: MSSQLSERVER
EventID: 19019
[sqsrvres] checkODBCConnectError: sqlstate = 28000; native error = 4818;
message = [Microsoft][SQL Server Native Client 10.0][SQL Server]Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

Log Name: Application
Source: MSSQLSERVER
EventID: 18456
Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.
Reason: Token-based server access validation failed with an infrastructure error.
Check for previous errors. [CLIENT: 78.109.91.140]

И так на каждой ноде, где приложение пытается стартовать.
Решил покопаться в системном журнале событий кластерных нод с пристрастием, и обнаружил следующие интерсные события:

Log Name: System
Source: FailoverClustering
EventID: 1196
Cluster network name resource 'SQL Network Name (sql)' failed registration of one or more associated DNS name(s) for the following reason:
DNS operation refused.
.
Ensure that the network adapters associated with dependent IP address resources are configured with at least one accessible DNS server.

Log Name: System
Source: FailoverClustering
EventID: 1196
Cluster network name resource 'procDtc' failed registration of one or more associated DNS name(s) for the following reason:
DNS operation refused.
.
Ensure that the network adapters associated with dependent IP address resources are configured with at least one accessible DNS server.

Покопавшись в TechNet по данным событиям, нашел что связано это может быть либо с некорректными записями в реестре, либо с некорректно работающим или отсутствующем DNS.
Записи в реестре оказались на месте. Поэтапная проверка DNS ничего не выявила (DNS сервера работают, на запросы отвечают, ресурсные записи кластерных приложений на месте, имена кластерных приложений резолвятся в прямом и обратном направлениях).
Казалось бы все нормально, но меня смутила запись "DNS operation refused". Стало очевидным, что кластерный сервис просто не может обновить регистрацию кластерных имер ресурсов в DNS.

Решение этой проблемы следующее:
Удалить существующие записи в DNS на все A-записи, касающиеся кластерных ресурсов (в моем случае это были sql и procDtc) и создать их заново, поставив разрешение обновлять DNS записи авторизованным пользователям с общим именем владельца (Allow any authenticated user to update DNS records with the same owner name).
Того что при операции удаления-создания записей что то в кластере упадет, бояться не надо - ничего не упадет.

Соответствующее изменение внесу в свою статью о развертывании SQL кластера.

Развертывание кластера SQL2008

Я производил развертывание на оборудовании HP Blades с общим сторэйджем на баще HP MSA2000sa.

Требования:
1. Развернутый Node and Disk Majority кластер из двух нод
2. Кластеризованный диск для хранения данных SQL (у меня это волюм на 500 гигабайт)
3. Кластеризованный диск размером в 100 мегабайт (размер задавал сам, сколько нужно реально - зависит от нагрузок по транзакциям) для хранения метаданных координатора распределенных транзакций
4. Зарезервированный IP адрес для организации опосредованного кластерного сервера с сервисом MSSQL2008
5. Зарезервированный IP адрес для организации опосредованной кластерной машины для координатора распределнных транзакций
6. Зарезервированные имена для этих серверов
7. Дистрибутив MSSQL2008 Enterprice Edition, доступный на обоих нодах кластера
8. Наличие технологической учетной записи в домене, которой даны права локального администратора на каждой ноде. Пусть это будет SQLSERVICE
9. Установленный на обоих нодах .Net Framework 3.5 SP1

Установка:
1. Кластеризуем координатор распределенных транзакций. В оснастке Failover Cluster Management в services and applications по правой кнопке устанавливаем Distributed Transaction Coordinator. Выбираем наш диск в 500 мегабайт. После завершения смотрим чтобы он был пристыкован к первой ноде. Исправляем по мере необходимости
2. Заходим на первую ноду и запускаем инсталляцию MSSQL2008. Здесь надо обратить внимание, чтобы кластерные диски были пристыкованы к этой ноде. Обращаем внимание так же на наличие prerequistities. То чего не будет хватать - MSSQL2008 сам скажет и доустановит
3. В меню Installation интерактивной формы визарда выбираем New SQL Server failover cluster installation. Ждем окончания прогона первичных тестов
4. Ставим клиентские компоненты, ждем окончания подробных тестов, исправляем ошибки или варнинги. Крайне желательно чтобы все эти тесты были зелеными
5. Выбираем необходимые компоненты MSSQL для установки кластера
6. Задаем сетевое имя сервера SQL - то что мы зарезервировали вначале. Инстанс и пути можем оставить по умолчанию
7. Выбираем кластерный диск где будут храниться данные (зеленым подсветит те, которые можно выбрать)
8. Указываем IP адрес, который мы заранее зарезервировали для кластерного ресурса MSSQL
9. На странице политик безопасности оставляем Service SIDs
10. На странице запуска сервисов указываем на всех незатененных сервисах наш SQLSERVICE как аккаунт от которого службы будут стартовать
11. Режим авторизации можно выбрать любым. я предпочитаю смешанный. В закладке Data Directories проверим что данные будут положены на кластерный диск
12. В настройках служб анализа добавляем администратором служб свою учетную запись, либо учетную запись администратора домена
13. Reporting Services оставляем по умолчанию
14. Error Reporting настраиваем по желанию
15. Ждем завершения инсталляции
16. Заходим на вторую ноду и запускаем инсталляцию MSSQL2008. Важно чтобы нода была пассивной (все диски и сервисы должны принадлежать в этот момент первой ноде)
17. В меню Installation интерактивной формы визарда выбираем Add node to SQL Server failover cluster. Ждем окончания прогона первичных тестов
18. Ставим клиентские компоненты, ждем окончания подробных тестов, исправляем ошибки или варнинги. Крайне желательно чтобы все эти тесты были зелеными
19. В Cluster Node Configuration убеждаемся что выбран правильный кластер
20. В Service Accounts для незатененных полей паролей вводим пароль нашего аккаунта SQLSERVICE
21. Error Reporting настраиваем по желанию
22. Дожидаемся окончания установки второй ноды в кластере

Установка SQL 2008 Failover Cluster завершена.

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

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