Реализация отказоустойчивости (Failover)

Okerr позволяет организовать failover схему из нескольких серверов с использованием динамического DNS. В случае выхода из строя одного из серверов, другие будут обслуживать запросы, что позволит спокойной разобраться и устранить проблему без большого даунтайма для пользователей.

Пример на кошках

Есть демонстрационный проект cat.okerr.com.

У нас есть три сервера, которые обслуживают этот сайт и моделируют ресурс, который не должен падать даже при выходе из строя серверов. Каждый сервер демонстрирует картинку котенка и техническую информацию. Среди информации есть строчка статуса (status=OK или status=ERR).

Главный сервер (main) в состоянии OK в интервале 0-20 минут каждого часа. (В остальное время он пишет status=ERR)

Резервный сервер (backup) в состоянии OK в интервале 0-40 минут каждого часа. Он моделирует сервер, который вступает в бой если вышел из строя основной.

Sorry сервер в состоянии OK всегда. Он моделирует сервер, который не имеет функционал основного сайт, и служит только в качестве информационной странички.

Страничка обновляется каждую минуту, и если вы ее откроете, будете видеть примерно каждые 20 минут как вы переходите на следующий живой сервер. Почти все время вы будете видеть строчку status=OK (то есть, каждую минуту вы попадаете на живой сервер, хотя сервера постоянно "отключаются"). Возможно иногда вы попадете на сервер status=ERR, если это случится пока okerr не обнаружил проблему или DNS сервера не обновились.

Как это работает

IMG

За каждым сервером в okerr наблюдает индикатор, который в состоянии OK только если сервер работает и успешно проходит самодиагностика сервера (status=OK). Если сервер пишет status=ERR или недоступен (выключен, очень медленно отвечает) - индикатор будет в состоянии ERR.

Все вместе они включены в dyndns failover пул. Каждому индикатору присвоен приоритет и адрес сервера. Каждый раз, когда меняется статус любого индикатора из пула выбирается адрес сервера с максимальным приоритетом, который работает (индикатор в состоянии OK и не в статусе настройки), и трафик на cat.okerr.com направляется на этот адрес.

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

Как сделать Failover схему для вашего сервера

Настройка DNS

Вам нужен аккаунт на одном из поддерживаемых сервисов Dynamic DNS. Okerr поддерживает Яндекс.ПДД DNS, Cloudflare и Hurricane Electric. Кроме того, вы можете использовать тестовый аккаунт okerr на Яндекс.ПДД, для простоты. Нам более симпатичен Hurricane Electric, он кажется быстрее, проще и безопаснее (позволяет использовать отдельные ключи на каждое доменное имя).

Если ваш домен хостится на DNS серверах которые не поддерживают функцию dynamic dns, или okerr не поддерживает это протокол обновления, вы можете сделать дополнительное доменное на одном из перечисленных выше сервисов и использовать его. Например, для демо-проекта с кошками мы используем имя cat.okerr.com которое указывает (CNAME) на cat.he.okerr.com (домен he.okerr.com хостится на Hurricane Electric). При смене сервера, меняется именно значение IP записи cat.he.okerr.com.

Запомните ключ доступа для изменения записей и убедитесь, что вы можете их менять.

Если вы используете тестовый аккаунт "pdd.yandex.ru (okerr account for testing)", тогда вам нужно просто указать имя хоста. Полное имя (fqdn) будет hostname.textid.dyn1.okerr.com. Настройте только CNAME с вашего хоста на этот хост, например www.example.com CNAME www.mytextid.dyn1.okerr.com.

Создание dyndns failover пула

На странице проекта в разделе Отказоустойчивость добавьте отказоустойчивый хост. Выберите сервис динамического DNS и укажите его параметры. Изначально рекомендуем использовать тестовый сервис pdd.yandex.ru (okerr account for testing).

Добавьте индикаторы. У всех индикаторов должны быть разные приоритеты. Значение, указываемое в индикаторе - IP адрес хоста, на который будет направляться трафик.

В списке добавленных индикаторов можно удалить каждый индикатор из списка и (для теста) принудительно установить его в состояние OK или ERR. Если нужно реализовать какую-то сложную схему, используйте логические индикаторы.

Справа отображается текущая информация по имени и статус обновления. При изменении статуса индикатора, вы должны видеть как меняется "Текущий IP (локально)".

Кнопкой "Установить в DNS" можно принудительно установить текущее значение в сервисе динамического DNS.

Этапы смены failover сервера

  • Изменение состояния индикаторов. Okerr выполнит смену адреса только тогда, когда обнаружит проблему (или восстановление). По завершении этого этапа изменится локальный текущий IP и будет статус IP адреса "wait"
  • Установка нового значения в Dynamic DNS. Это занимает несколько секунд. После этого статус IP сменится на "synced", и ниже будет указан статус установки. На этапе настройки обратите на него внимание, там могут содержаться сообщения о возможных ошибках. После этого заканчивается часть, за которую отвечает okerr.
  • Обновление данных в DNS серверах по миру. Это может занять какое-то время, и для ускорения рекомендуется использовать малые значения TTL записей. Справа на страничке вы будете видеть данные с официальных (authoritative) DNS серверов для вашего домена, а так же с нескольких популярных публичных DNS серверов. Значение на официальных серверах обновятся достаточно быстро. Начиная с этого момента часть обращений уже пойдет на новый сервер. Значения с публичных серверов какое-то время будут еще "плясать", пока предыдущая запись еще хранится в кэшах серверов (должно занять не более чем время TTL, обычно несколько минут). Когда все DNS сервера покажут новое значение, все запросы пойдут на новый сервер.

После того, как новый адрес установлен, проверьте его. Для Linux из командной строки это можно сделать командой:

$ host www.qweqwe.dyn1.okerr.com
www.qweqwe.dyn1.okerr.com has address 1.2.3.5

$ host www.qweqwe.dyn1.okerr.com 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

www.qweqwe.dyn1.okerr.com has address 1.2.3.5

Первая команда проверяет адрес через локальный сервер, вторая через сервер 8.8.8.8 (Google public DNS). Пока запись не установлена, может потребоваться несколько раз повторить команду.