Повышенная доступность MySQL Cluster и алгоритм арбитража
Статья описывает принципы построения отказоустойчивых конфигураций кластера MySQL и алгоритмы, срабатывающие при отказе нод кластера.
Введение
MySQL Cluster - решение для построения отказоустойчивых систем. Во введении кратко опишем базовые понятия, более подробная информация в документации. Описанное ниже справедливо для версии MySQL Cluster 5.1, находящейся в момент выпуска статьи в стадии релиз-кандидата.
Нодой будем называть логический сервер, составляющий кластер. Но одном физическом сервере может быть размещено несколько нод. В кластере три основных типа нод:
1. Дата-нода (ndb-нода) - исполняемый процесс ndbd, отвечающий за хранение фрагмента данных в кластере. Важный параметр кластера NoOfReplicas (число реплик) - число дата-нод на которых хранится каждый конкретный фрагмент. Общее число дата-нод должно быть кратно числу реплик. Группа нод - несколько нод (число нод в группе равно числу реплик), хранящих идентичную информацию. Например NoOfReplicas = 2, число нод - 6. Каждая таблица разбита на 6 фрагментов (по хэшу первичного ключа), пронумеруем их F1,F2,F3,F4,F5,F6. 6 нод (D1,D2,D3,D4,D5,D6) составляют 3 группы - каждая нода первой группы (D1,D2) хранит фрагменты F1,F2; ноды второй группы D3,D4 хранят фрагменты F3,F4; ноды третьей группы D5,D6 хранят фрагменты F5,F6. Выход из строя всех нод одной группы приводит к отказу кластера.
2. SQL-нода (или API-нода) - исполняемый процесс mysqld. SQL-нода принимает подключение клиентов и обращается к дата-нодам за данными. Кроме того, каждая SQL-нода вправе хранить собственные не-NDB таблицы (MyISAM, Innodb, ...), как если бы она не входила в кластер.
3. Управляющая нода (management-нода) - исполняемый процесс ndbmgmd. Отвечает за конфигурацию кластера, каждая нода обращается к управляющей ноде при подключению к кластеру. Не управляет транзакциями и другими текущими делами, а концентрируется исключительно на конфигурации. Потребляет немного системных ресурсов, поэтому часто размещается на одном же физическом сервере с другой нодой. В случае выхода из строя управляющей ноды, кластер продолжит нормальную работу, но будет невозможен перезапуск нод. Конфигурация может содержать одну или несколько управляющих нод.
Арбитр и алгортимы арбитража
Арбитр
Одна из нод кластера всегда является арбитром. Арбитр назначается при запуске кластера и может изменяться в рамках процедуры смены арбитра. О назначении и смене арбитра можно узнать в логах кластера. В конфигурации по-умолчанию, арбитром является управляющая нода, однако это не обязательно так. Арбитром может стать любая управляющая или SQL-нода. У этих нод в конфигурации может быть указан параметр ArbitrationRank (ранг арбитра); значения параметра следующие: 0 - нода никогда не станет арбитром, 1 - нода станет арбитром с высоким приоритетом; 2 - нода станет арбитром только если нет претендентов с высоким приритетом. В каждый момент в кластере только один арбитр.
Отключение группы нод, split-brain
Арбитр требуется в ситуации, когда от кластера отключились несколько нод. Пусть кластер физически разделился на 2 кусочка (например, в силу отказа сетевого маршрутиризатора). Возможна ситуация, когда каждый кусочек будет хранить все данные кластера (то есть по крайней мере по одной ноде из каждой группы). Каждый кусочек будет вести себя как полный кластер, что приведет к нарушению целостности данных (например, часть клиентов будет работать с одним кусочком, а часть - с другим). Такая ситуация потенциально опасна и называется split-brain.
Алгоритм арбитража
Алгоритм арбитража достаточно простой. Он начинает работу сразу после обнаружения фрагментации на каждой работающей дата-ноде осколка кластера.
1. Вижу ли я по крайней мере одну дата-ноду из каждой группы (иначе говоря - обладает ли видимая часть кластера всеми данными)? Если нет - выключиться. Если да, продолжить алгоритм
2. Есть ли среди отключившихся дата-нод по одной из ноде из каждой группы (иначе говоря - обладает ли вторая часть всеми данными)? Если нет - значит вторая часть выключится по правилу 1, я могу продолжить работу. Если да, продолжить алгоритм.
3. Спросить арбитра. Если арбитр недоступен - выключиться. Если арбитр доступен, узнать присутствую ли я в текущей конфигурации, если нет - выключиться, если да - продолжить работу
Смена арбитра
Если в результате фрагментации исчез арбитр, то после выполнения алгоритма арбитража, ноды выбирают нового арбитра. Алгоритм выбора в настоящее время простой - выбирается нода с наименьшим номером (nodeid), среди имеющих старший ArbitrationRank.
Примеры
Почему конфигурация из двух физических не является оказоустойчивой?
Рассмотрим следующую конфигурацию, постоенную на двух физических машинах:
* Первый сервер - дата-нода 1, SQL-нода 1, управляющая нода 1
* Второй сервер - дата-нода 2, SQL-нода 2, (возможно также управляющая нода 2)
Значение NoOfReplicas=2 обеспечивает дублирование данных; обе ноды входят в одну группу. На первый взгляд кажется, что конфигурация откзоустойчива, но на практике это не так. При старте кластера арбитром станет первая управляющая нода. Рассмотрим ситуацию, в которой вышел из строя первый сервер (например выключился, сгорела сетевая карта или вышел из строя порт в маршрутиризаторе). На второй дата-ноде сработает алгоритм арбитража:
1. Вижу ли по одной ноде из каждой группы? Да, всего одна группа, эта нода - я.
2. Содержит ли отключивашаяся часть полный набор данных? Да, дата-нода 1 содержит копию данных.
3. Спросить арбитра. Арбитр недоступен. Выключиться.
Мы видим, что отказ одного сервера приводит к отключению всего кластера. То же самое произойдет в конфигурации с тремя серверами и NoOfReplicas=3 при отключении сервера, содержащего арбитра.
Простой пример отказоустойчивой конфигурации
Предоставим читателю убедиться в том, что следующая конфигурация является устойчивой по отношению к отказу любого из трех физических серверов:
* Первый сервер - дата-нода 1, SQL-нода 1 (ArbitrationRank=0), (NoOfReplicas=2)
* Второй сервер - дата-нода 2, SQL-нода 2 (ArbitrationRank=0), (NoOfReplicas=2)
* Третий сервер - управляющая нода (ArbitrationRank=2)
Выводы
Избыточность данных еще не гарантирует отказоустойчивость. Обязательно тестируйте конфигурации с использованием описанного выше аглоритма или путем физического отключения серверов.
Дайджест новых статей по интернет-маркетингу на ваш email
Новые статьи и публикации
- 2024-11-26 » Капитан грузового судна, или Как начать использовать Docker в своих проектах
- 2024-11-26 » Обеспечение безопасности ваших веб-приложений с помощью PHP OOP и PDO
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-22 » Ошибки в Яндекс Вебмастере: как найти и исправить
- 2024-11-15 » Перенос сайта на WordPress с одного домена на другой
- 2024-11-08 » OSPanel 6: быстрый старт
- 2024-11-08 » Как установить PhpMyAdmin в Open Server Panel
- 2024-09-30 » Как быстро запустить Laravel на Windows
- 2024-09-25 » Next.js
- 2024-09-05 » OpenAI рассказал, как запретить ChatGPT использовать содержимое сайта для обучения
- 2024-08-28 » Чек-лист: как увеличить конверсию интернет-магазина на примере спортпита
- 2024-08-01 » WebSocket
- 2024-07-26 » Интеграция с Яндекс Еда
- 2024-07-26 » Интеграция с Эквайринг
- 2024-07-26 » Интеграция с СДЕК
- 2024-07-26 » Интеграция с Битрикс-24
- 2024-07-26 » Интеграция с Travelline
- 2024-07-26 » Интеграция с Iiko
- 2024-07-26 » Интеграция с Delivery Club
- 2024-07-26 » Интеграция с CRM
- 2024-07-26 » Интеграция с 1C-Бухгалтерия
- 2024-07-24 » Что такое сторителлинг: техники и примеры
- 2024-07-17 » Ошибка 404: что это такое и как ее использовать для бизнеса
- 2024-07-03 » Размещайте прайс-листы на FarPost.ru и продавайте товары быстро и выгодно
- 2024-07-01 » Профилирование кода в PHP
- 2024-06-28 » Изучаем ABC/XYZ-анализ: что это такое и какие решения с помощью него принимают
- 2024-06-17 » Зачем вам знать потребности клиента
- 2024-06-11 » Что нового в работе Яндекс Метрики: полный обзор обновления
- 2024-06-11 » Поведенческие факторы ранжирования в Яндексе
- 2024-06-11 » Скорость загрузки сайта: почему это важно и как влияет на ранжирование
Всегда храни верность своему начальнику - следующий, может быть еще хуже... |
Мы создаем сайты, которые работают! Профессионально обслуживаем и продвигаем их , а также по всей России и ближнему зарубежью с 2006 года!
Как мы работаем
Заявка
Позвоните или оставьте заявку на сайте.
Консультация
Обсуждаем что именно Вам нужно и помогаем определить как это лучше сделать!
Договор
Заключаем договор на оказание услуг, в котором прописаны условия и обязанности обеих сторон.
Выполнение работ
Непосредственно оказание требующихся услуг и работ по вашему заданию.
Поддержка
Сдача выполненых работ, последующие корректировки и поддержка при необходимости.