Короткий ответ
Готового универсального рецепта нет: выбор между GeoDNS, health-check-based failover на уровне DNS, Anycast или комбинацией DNS и L4/L7-балансировки перед регионами зависит от требуемого времени восстановления (RTO), характера клиентов (браузеры с разным уважением к TTL, корпоративные резолверы с принудительным минимальным TTL) и готовности платить за дополнительную инфраструктуру мониторинга здоровья регионов.
Как это работает подробнее
Низкий TTL уменьшает время, за которое клиенты подхватят изменённую запись при failover, но увеличивает частоту обращений к авторитативным DNS-серверам (больше нагрузка и больше задержка на каждый новый резолвинг, так как кэш реже используется), а также не гарантирует мгновенного переключения, поскольку часть резолверов и некоторые клиентские библиотеки игнорируют заявленный TTL или применяют собственный минимум; health-check-based DNS failover должен сам обнаруживать отказ региона с приемлемой задержкой и не делать resolver'ы единственным мгновенным переключателем трафика, особенно для уже установленных долгоживущих соединений.
Пример кода
Вариант архитектуры:
1. Anycast IP перед несколькими регионами (быстрое BGP-переключение)
ИЛИ
2. Глобальный L7-балансировщик/CDN с собственными health checks
+ DNS с умеренным TTL (60-300 c) как резервный уровень переключенияЧто использовать на практике
- Практика. для действительно быстрого и надёжного failover DNS обычно комбинируют с дополнительным уровнем: например, Anycast-адресация одного и того же IP из нескольких регионов (переключение на уровне маршрутизации BGP быстрее, чем через DNS-кэши), либо глобальный L7-балансировщик/CDN перед регионами, который сам выполняет health checks и маршрутизацию, оставляя DNS относительно стабильным; TTL в таком случае можно держать умеренным (не экстремально низким), снижая нагрузку на DNS, потому что основное решение о маршрутизации принимается не на уровне клиентского DNS-кэша.
- Компромисс. Для проверки нужно смоделировать отказ одного региона (отключить health check endpoint) и замерить фактическое время, за которое новый трафик и, отдельно, уже открытые долгоживущие соединения переключаются на здоровый регион — именно это измеренное время, а не теоретический TTL, является реальным RTO.
Подводные камни
- Риск. полагаться исключительно на очень низкий TTL как единственный механизм failover и не тестировать реальное поведение разных резолверов/клиентов при его игнорировании; не учитывать, что уже установленные TCP-соединения и приложения с собственным DNS-кэшированием не переключатся даже при мгновенном обновлении DNS-записи; не иметь автоматизированного health-check для самого переключения, полагаясь на ручное обновление записи во время инцидента.