В этой статье я хочу показать, как легко и бесплатно можно сделать failover схему для веб-сайта (или любого другого интернет-сервиса) на комбинации мониторинга okerr и динамического DNS сервиса. То есть, в случае любых проблем с основным сайтом (начиная от проблемы с «PHP Error» на странице, и до нехватки места или просто подозрительно малом числе заказов в случае интернет-магазина), новые посетители будут направлены на второй (третий, и так далее) заведомо работающий сервер, или же на «Sorry» страничку, где им вежливо объяснят, что «есть проблема, мы уже в курсе и уже чиним, скоро починим» (а вы в этом случае на самом деле будете уже в курсе и сможете чинить).
Жить с failover или без?
Пока не случится какая-то проблема — разницы особой нет. А вот когда случится, то без failover'а часто происходит следующее: вы пытаетесь быстро разобраться, в чем проблема, не получается (бэкапы не разворачиваются, софт почему-то не работает как ему следует из документации, итд), а времени нет, сервера-сайты лежат, клиенты звонят, все на нервах, пытаетесь как-то починить грубо и грязно «на скотче», потом как-то вроде запускается с костылями и живет. Вы думаете, что на досуге надо будет подробнее разобраться и переделать все красиво, но нет ничего более постоянного, чем временное.
Теперь, как это происходит в красивом варианте с файловером:
- Ошибка случается
- Ошибка обнаруживается автоматически
- Рассылается оповещение
- Переводится переключение на один из резервных серверов
- Спокойно и без паники разбирается проблема, исправляется и сервер снова вводится в строй.
В этой схеме, конечно тоже могут возникнуть свои запердыки, но все таки, схема линейная, каждый этап тут простой и главное — его можно отладить отдельно, поэтому шанс сбоя этой схемы гораздо ниже, а все действия могут быть автоматизированы и исполняться быстро (в отличие от задачи найти и исправить неведомую епическую хрень). Ваш самолет приземлился в далекой стране, вы включаете телефон и видите в телеграмме уведомление, что сервер упал, но все хорошо, активировался резервный сервер, вы можете продолжать свою поездку, вам не нужно ни лететь назад, ни чинить по SSH из ближайшего кафе с WiFi. Разберетесь тогда, когда будет удобнее.
Будущее уже здесь!
Раньше, основная проблема, которая делала failover часто неприемлемым решением заключалась в сумме затрат на него. Либо нужно было покупать дорогие железяки (и приглашать еще более дорогих специалистов). Либо колхозить что-то сложное по гайдам (мне попадался даже вариант, когда два сервера связываются дополнительно нуль-модемным кабелем, и гоняют по нему heartbeat, чтобы в нужный момент запасной сервер узнал, и перехватил управление). Сейчас есть способы проще и бесплатные. Если у вас есть сайт с котиками — нет вам оправдания, если вы еще не реализовали для него failover!
Ну и кроме того, для failover схемы нужен еще сервер (а может быть и не один) и раньше это было большими затратами, сейчас можно взять VDSку за копейки.
Самый надежный сайт с котиками
Для практической иллюстрации решения с okerr + dynamic dns мы запустили свой сайт с котиками cat.okerr.com. Котиков мы ненавидим, поэтому их там почти не будет. Всего есть три сайта, каждый выглядит примерно одинаково (все на одном шаблоне), но с разными котятами чтобы было легко отличить, и каждый пишет техническую информацию, чтобы увидеть, как работает failover. Страничка обновляется сама раз в 1 минуту, но всегда можно нажать reload в браузере.
В технической информации есть строчка “status=OK”. Иногда сервера симулируют проблемы и пишут status=ERR. Главный сервер “как бы падает” в 20 минут каждого часа (0:20, 1:20, 2:20, ...). Запасной (backup) сервер в 40 минут. Последний сервер (“sorry”-сервер) работает всегда. В 0 минут каждого часа, основной и запасной сервер “восстанавливаются”.
Если вы откроете сайт, и оставите его во вкладке — увидите, что он никогда не падает (хотя каждый отдельный сервер периодически симулирует проблему), а в случае проблемы с сервером, просто “бегает” между живыми серверами. Будет меняться картинка, имя и адрес сервера и его роль. Иногда можно поймать момент когда status=ERR (проблема уже есть, но вся схема failover еще не отработала), но уже следующее обновление покажет вам страничку с рабочего сайта.
Failover на okerr + dynamic DNS
Посмотрим, как это устроено под капотом. Задача файловера в том, чтобы адрес cat.okerr.com всегда указывал на IP адрес рабочего сервера.
За каждым из серверов, которые держат наш котосайт в okerr есть индикатор, который раз в минуту проверяет его состояние.
На этом скрине мы видим, как проверяется сайт cat.okerr.com с сервера alpha.okerr.com. Страничка должна содержать status=OK, и как мы видим наверху, статус индикатора у нас сейчас OK. Когда сервер “поломается”, будет ERR. (Это только один пример индикатора, окерр — это мониторинг, поэтому можно прилепить любой тип индикатора, например, проверять свободное место на диске, количество новых заказов в базе, и даже логические индикаторы, например, ночью будут одни критерии ошибки, а днем другие).
В настройках проекта мы создали failover схему с этими индикаторами:
В схеме три индикатора (три сервера), разные по приоритетам. Главный сервер для сайта — charlie, если он не работает (не будет “status=OK” или просто недоступен), то bravo и в последнем случае — alpha. В правой части страницы показывается состояние DNS записи на разных серверах.
Для тех, кто заметил, что используется имя cat.he.okerr.com: Мы используем схему чуть сложнее. Вместо того, чтобы просто изменять DNS запись cat.okerr.com, мы изменяем cat.he.okerr.com (на Dynamic DNS провайдере Hurricane Electric), а cat.okerr.com — это CNAME (алиас), который не меняется, всегда указывает на cat.he.okerr.com. Hurricane нам просто нравится больше в качестве динамического DNS, и у него есть ключи для управления отдельной записью (а не всей зоной), нам это кажется безопаснее. Вы можете тоже не указывать в okerr пароли-ключи для управления всем доменом, а только для поддомена или записи.
От падения к поднятию
По шагам, как работает эта схема:
- Случается (симулируется) проблема на сервере
- Сенсор okerr раз в минуту проверяет состояние каждого сервера и сообщает на главный сервер проекта в okerr
- Индикатор соответствующего сервера меняет состояние с OK на ERR
- При смене статуса индикатора, пересчитывается failover, вычисляется, какой адрес нужно установить (если нужно. Например, если работает основной сервер, а в это время умер запасной — никаких изменений не будет)
- Этот адрес сообщается в службу dynamic dns. По завершении этого этапа справа вы увидите статус “synced”
- Очень скоро (секунды) запись дойдет до DNS серверов вашего домена (у котосайта это ns1-ns5.he.net).
- Начиная с этого момента некоторые пользователи уже будут попадать на новый живой сервер. Но еще не все DNS сервера в мире обновили записи, и где-то еще может быть закеширована прежняя запись. Можно увидеть, как данные на публичных DNS серверах “пляшут”, показывая то новое, то старое значение. Если обновить страничку настройки failover, окерр сам запросит новые данные с DNS серверов.
- После того как данные стабилизировались, старая кешированная запись везде протухла — все 100% запросов идут на новый сервер.
Чтобы 7 этап (часто — самый долгий) ускорить, TTL динамической DNS записи нужно установить как можно ниже. Обычно сервисы позволяют интервалы 90-120 секунд. Это вполне разумный компромисс.
Дополнительно
Все это можно настроить за вечер (если у вас уже есть дублирующий сервер). И okerr и сервисы динамического DNS бесплатны. Чтобы получить в okerr больше проверок и короче период проверки нужно пройти тренинг (со страницы профиля). По прохождению сразу же повышается уровень (20 индикаторов по часу + 1 быстрый, 10 минутный). А если их будет мало — напишите на support@okerr.com, скорее всего можно будет повысить (пока что всегда была возможность, ни разу не отказывал, наоборот, сам предлагал). Просто изначально я не хочу обещать всем всё, не уверен, что хватит мощностей, чтобы сдержать слово. Но пока пользователей мало, так что с повышением лимитов проблем нет.
Что может okerr вообще — посмотрите на сайте презентацию. Вообще, это мониторинг (zabbix из облака), а файловер — это приятная доп.функция. Также с сайта можно без регистрации зайти в демо.
При изменении состояния индикатора — отсылается уведомление на почту или Telegram. (Мы тут посмотрели что происходит, и поняли, что, похоже, telegram — самый надежный мессенджер. Спасибо РКН за стресс-тест!) При правильной настройке okerr, любое уведомление — это либо сигнал “бросайте все, надо чинить!”, либо “отбой!”. Лишних алертов от окерра быть не должно (если они есть — надо настраивать как-то иначе). Например, для нашего котосайта сервер alpha последний и никогда не имитирует ошибку. Если он ляжет — мы должны знать. А вот остальные сервера постоянно симулируют ошибки, поэтому, чтоб не получать алерты несколько раз в час, у тех индикаторов стоит статус “тихий”.
Имеет смысл также сделать sorry-сервер (на любом самом дешевом
Автор: xenon