- PVSM.RU - https://www.pvsm.ru -
Любой крупный проект начинался с пары серверов. Cначала был один DB-сервер, потом к нему добавились слейвы, чтобы масштабировать чтение. И тут — стоп! Мастер один, а слейвов много; если уйдет один из слейвов, то всё будет хорошо, а если уйдет мастер — будет плохо: даунтайм, админы в мыле поднимают сервер. Что делать? Резервировать мастер. Мой коллега Павел уже писал об этом статью [1], я не буду ее повторять. Вместо этого расскажу, почему вам обязательно нужен Orchestrator для MySQL!
Начнем с главного вопроса: «Как мы будем переключать код на новую машину при уходе мастера?».
Автор Orchestrator, работая в Github, сначала реализовал первую схему с VIP, а потом переделал на схему c consul.
Типичная схема инфраструктуры:

Сразу опишу очевидные ситуации, которые нужно учесть:
Почему же вам непременно нужен Orchestrator, если у вас его нет?
Интерфейс Orchestrator:

Что же такое GTID errant?
Есть два основных требования для работы Orchestrator:
Помните, что самое главное в production-слейве — его консистентность с мастером! Если у вас и на мастере, и на слейв включен Global Transaction ID (GTID), то через функцию gtid_subset можно узнать, действительно ли на этих машинах выполнены одни и те же запросы на изменения данных. Подробнее об этом почитать можно тут [4].
Таким образом, Orchestrator показывает вам через ошибку GTID errant, что на слейве есть транзакции, которых нет на мастере. Почему так происходит?
Резюмирую все вышесказанное. Если вы пока не хотите использовать Orchestrator в режиме failover, то поставьте его в режиме наблюдения. Тогда у вас всегда будет перед глазами карта взаимодействия MySQL-машин и наглядная информация о том, какой тип репликации на каждой машине, отстают ли слейвы, и самое главное — насколько они консистентносты с мастером!
Очевидный вопрос: «А как же должен работать Orchestrator?». Он должен выбрать новый мастер из текущих слейвов, а потом переподключить к нему все слейвы (именно для этого нужен GTID; если использовать старый механизм с binlog_name и binlog_pos, то переключение слейва с текущего мастера на новый просто невозможно!). До того, как у нас появился Orchestrator, мне однажды пришлось делать всё это вручную. Старый мастер зависал из-за глючного контроллера Adaptec, у него было около 10 слейвов. Мне нужно было перекинуть VIP с мастера на один из слейвов и переподключить на него все остальные слейвы. Сколько же консолей мне пришлось открыть, сколько одновременных команд ввести… Пришлось подождать до 3 часов ночи, снять нагрузку со всех слейвов, кроме двух, сделать мастером первую машину из двух, сразу к ней подцепить вторую машину, потому к новому мастеру подцепить все остальные слейвы и вернуть нагрузку. В общем, ужас…
Как работает Orchestrator, когда переходит в режим failover? Это легче всего показать на примере ситуации, когда мы хотим сделать мастером более мощную, более современную машину, чем сейчас.

На рисунке представлена середина процесса. Что уже было сделано до этого момента? Мы сказали, что хотим сделать какой-то слейв новым мастером, Orchestrator начал просто переподключать к нему все остальные слейвы, при этом новый мастер выполняет роль транзитной машины. При такой схеме ошибок не возникает, все слейвы работают, Orchestrator снимает VIP со старого мастера, переносит на новый, делает read_only=0 и забывает о старом мастере. Всё! Даунтайм нашего сервиса – это время переноса VIP, это 2-3 секунды.
На сегодня всё, всем спасибо. Скоро будет вторая статья про Orchestrator. В известном советском фильме «Гараж» один герой сказал «Я с ним бы в разведку не пошёл!» Так вот, Orchestrator, я с тобой в разведку пошел бы!
Автор: Александр Яковлев
Источник [6]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/mysql/353147
Ссылки в тексте:
[1] статью: https://habr.com/ru/company/citymobil/blog/491044/
[2] ProxySQL: https://proxysql.com/
[3] статье: https://habr.com/ru/company/citymobil/blog/501730/
[4] тут: https://www.percona.com/blog/2014/05/19/errant-transactions-major-hurdle-for-gtid-based-failover-in-mysql-5-6/
[5] баг: https://bugs.mysql.com/bug.php?id=88720
[6] Источник: https://habr.com/ru/post/501994/?utm_source=habrahabr&utm_medium=rss&utm_campaign=501994
Нажмите здесь для печати.