Оркестратор Для Mysql: Почему Без Него Нельзя Построить Отказоустойчивый Проект

Любой крупный проект начинался с пары серверов.

Сначала был один сервер БД, потом к нему добавили слейвы для масштабирования чтения.

И тогда – стоп! Хозяин один, а рабов много; если уйдет один из слейвов, то все будет хорошо, а если уйдет мастер, то будет плохо: даунтайм, админы пытаются поднять сервер.

Что делать? Забронируйте мастера.

Мой коллега Павел уже писал об этом статья , я не буду повторять.

Вместо этого я расскажу вам, почему вам обязательно нужен Orchestrator for MySQL! Начнем с главного вопроса: «Как мы переведем код на новую машину при уходе мастераЭ»

  • Мне больше всего нравится схема с VIP (Виртуальным IP), о ней мы поговорим ниже.

    Он самый простой и очевидный, хотя и имеет очевидное ограничение: мастер, который мы зарезервируем, должен находиться в сегменте L2 с новой машиной, то есть о втором DC можно забыть.

    А, по-хорошему, если следовать правилу, что большой L2 — это зло, потому что L2 только на стойку, а L3 — между стойками, а такая схема имеет еще больше ограничений.

  • Вы можете написать DNS-имя в коде и разрешить его через /etc/hosts. На самом деле никакого решения не будет. Преимущество схемы: нет ограничений, свойственных первому способу, то есть можно организовать перекрестный ДЦ.

    Но тогда возникает очевидный вопрос: как быстро мы сможем доставить изменения в /etc/hosts через Puppet-Ansible?

  • Второй способ можно немного изменить: установить на всех веб-серверах кеширующий DNS, через который код будет поступать в главную базу данных.

    Вы можете установить TTL 60 для этой записи в DNS. Кажется, если правильно реализовать, метод хорош.

  • Схема с обнаружением сервисов, подразумевающая использование Consul иetcd.
  • Интересный вариант с ПроксиSQL .

    Вам необходимо направить весь трафик в MySQL через ProxySQL; ProxySQL сам может определить, кто является мастером.

    Кстати, об одном из вариантов использования этого продукта вы можете прочитать у меня.

    статья .

Автор Orchestrator, работающий в Github, сначала реализовал первую схему с VIP, а затем сконвертировал ее в схему с консулом.

Типичная схема инфраструктуры:

Оркестратор для MySQL: почему без него нельзя построить отказоустойчивый проект

Сразу опишу очевидные ситуации, которые необходимо учитывать:

  • VIP-адрес не должен быть прописан в конфиге ни на одном из серверов.

    Представим ситуацию: мастер перезагрузился, и пока он загружался, Оркестратор перешёл в отказоустойчивый режим и сделал одного из слейвов мастером; потом старый хозяин поднялся, и теперь ВИП на двух машинах.

    Это плохо.

  • Для оркестратора вам нужно будет написать скрипт для вызова старого мастера и нового мастера.

    На старом мастере нужно запустить ifdown, а на новом мастере — ifup vip. Было бы неплохо еще включить в этот скрипт, что в случае аварийного переключения порт на старом мастер-свитче просто отключается, чтобы избежать какого-либо расщепления мозга.

  • После того, как Оркестратор вызвал ваш сценарий, чтобы сначала удалить VIP и/или погасить порт на коммутаторе, а затем вызвал сценарий повышения VIP на новом ведущем устройстве, не забудьте использовать команду arping, чтобы сообщить всем, что новый VIP теперь здесь.

  • Все подчиненные устройства должны иметь read_only=1, и как только вы повысите статус подчиненного устройства до главного, оно должно иметь read_only=0.
  • Не забываем, что любой слейв, которого мы для этого выбрали, может стать мастером (в Оркестраторе есть целый механизм предпочтения, какой слейв рассматривать кандидатом на новый мастер в первую очередь, какой на втором месте, и какой слейв должен не быть выбранным вообще ни при каких обстоятельствах мастер).

    Если слейв станет мастером, то на нем останется нагрузка слейва и прибавится нагрузка мастера, это надо учитывать.

Зачем вам нужен Оркестратор, если у вас его нет?
  • Orchestrator имеет очень удобный графический интерфейс, отображающий всю топологию (см.

    скриншот ниже).

  • Оркестратор может отслеживать, какие слейвы отстают, а где вообще сломалась репликация (у нас к Оркестратору прикреплены скрипты для отправки СМС).

  • Оркестратор сообщает вам, у каких подчиненных устройств ошибочный GTID.
Интерфейс оркестратора:

Оркестратор для MySQL: почему без него нельзя построить отказоустойчивый проект

Что такое ошибка GTID? Для работы Orchestrator существует два основных требования:
  • Необходимо, чтобы псевдо-GTID был включен на всех машинах кластера MySQL; у нас включен GTID.
  • Необходимо, чтобы везде был один тип бинлогов, можно использовать оператор.

    У нас была конфигурация, в которой у мастера и большинства слейвов был Row, а двое исторически оставались в смешанном режиме.

    В результате Оркестратор просто не захотел подключать этих слейвов к новому мастеру.

Помните, что самое главное в производственном рабе – это его соответствие хозяину! Если у вас включен идентификатор глобальной транзакции (GTID) как на главном, так и на подчиненном компьютере, вы можете использовать функцию gtid_subset, чтобы узнать, действительно ли на этих машинах выполнялись одни и те же запросы на изменение данных.

Вы можете прочитать об этом больше здесь .

Таким образом, Orchestrator показывает вам через ошибочный GTID, что на ведомом устройстве есть транзакции, которых нет на ведущем.

Почему это происходит?

  • Read_only=1 не включен на ведомом устройстве, кто-то подключился и выполнил запрос на изменение данных.

  • Super_read_only=1 на слейве не включен, то админ, перепутав сервер, зашёл и выполнил там запрос.

  • Если вы учли оба предыдущих пункта, то есть еще одна хитрость: в MySQL запрос на очистку бинлогов тоже идет в бинлог, поэтому при первой очистке на мастере и всех слейвах появится GTID errant. Как этого избежать? В Perona-5.7.25-28 введен параметр binlog_skip_flush_commands=1, который запрещает запись флеша в бинлоги.

    На сайте mysql.com есть установленный ошибка .

Подведу итог всему вышесказанному.

Если вы пока не хотите использовать Orchestrator в режиме отработки отказа, переведите его в режим наблюдения.

Тогда у вас всегда будет перед глазами карта взаимодействия MySQL-машин и наглядная информация о том, какой тип репликации стоит на каждой машине, отстают ли слейвы, а главное, насколько они согласованы с мастером! Очевидный вопрос: «Как должен работать ОркестраторЭ» Он должен выбрать новый мастер из текущих слейвов, а затем переподключить к нему всех слейвов (для этого и нужен GTID; если использовать старый механизм с binlog_name и binlog_pos, то переключение слейва с текущего мастера на новый это просто невозможно!).

До того, как у нас появился Orchestrator, мне однажды приходилось делать все это вручную.

Старый мастер зависал из-за глючного контроллера Adaptec; у него было около 10 рабов.

Мне нужно было перенести VIP с мастера на один из слейвов и переподключить к нему все остальные слейвы.

Сколько консолей мне пришлось открыть, сколько одновременных команд я ввел.

Пришлось ждать до 3 часов ночи, снять нагрузку со всех слейвов, кроме двух, сделать из двух мастер-машину первую, сразу присоединить вторую машину к нему, поэтому подключите к новому мастеру все остальные подчиненные устройства и верните нагрузку.

В общем, ужас.

Как работает Orchestrator при переходе в режим аварийного переключения? Легче всего это проиллюстрировать на примере ситуации, когда мы хотим сделать мастер более мощной, более современной машиной, чем он есть сейчас.



Оркестратор для MySQL: почему без него нельзя построить отказоустойчивый проект

На рисунке показана середина процесса.

Что уже сделано к этому моменту? Мы сказали, что хотим сделать каким-то слейвом новый мастер, Оркестратор стал просто переподключать к нему все остальные слейвы, причем новый мастер выступает в роли транзитной машины.

При такой схеме ошибок не возникает, все слейвы работают, Оркестратор удаляет ВИП со старого мастера, переносит на новый, делает read_only=0 и забывает про старый мастер.

Все! Даунтайм нашего сервиса – это время VIP-перевода, которое составляет 2-3 секунды.

На сегодня все, спасибо всем.

Скоро будет вторая статья об Orchestrator. В знаменитом советском фильме «Гараж» один персонаж сказал: «Я бы с ним в разведку не пошёл!» Так что, Оркестратор, я бы пошел с тобой на разведку! Теги: #*nix #Системное администрирование #MySQL #Orchestrator

Вместе с данным постом часто просматривают: