LINUX.ORG.RU
ФорумAdmin

Отказоустойчивость

 


0

3

Вот я понимаю как делать отказоустойчивость с одной стороны. Несколько инстансов бекэнда, несколько реплик БД. Бекэнд можно написать stateless, БД существуют распределённые. Одна нода упадёт, другие ноды возьмут нагрузку.

Но в конечном счёте что бы мы не навернули в инфраструктуре, в DNS записи придётся указать один конкретный IP адрес. И сервер, чей это IP станет единой точкой отказа, хоть он проксирует трафик на 10 бекэндов, настроен проверять в фоне что они живы и исключать из round robin упавшие ноды.

Насчёт «один IP адрес» я, конечно, слукавил, но не сильно - несколько A/AAAA записей с одинаковым именем можно использовать только для балансировки нагрузки, но не для отказоустойчивости (клиенты выбирают случайный IP из списка, но не ретраят другой, если не фортанёт).

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

И как же тогда обеспечивают настоящую отказоустойчивость, чтобы реверс прокси тоже можно было ронять/перезапускать?

Пока на ум приходит только CDN типа CloudFlare, которые позволяют переключать IP адрес записи гораздо быстрее, чем позволяет DNS (так как DNS не обновляется, обновляются лишь настройки их сообственного реверс прокси и там уже время реакции секунды).

★★★★★
Ответ на: комментарий от maxcom

Anycast можно мгновенно переключить? Сервер упадёт а маршрут то от этого сам собой не исчезнет.

А у vrrp всё равно точка отказа будет.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Выглядит как будто ты опрометчиво перекладываешь отказоустойчивость всего сервиса на бэкенд. Клиент тоже должен поучаствовать в ее обеспечении. curl(cli-команда), например, умеет реконнектиться к другому ip, если один недоступен.

cobold ★★★★★
()

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

Ладно отвлекся.

Обычно под «отказоустойчивостью» (fault tolerance) приводят пример c внедорожником, который катается вдали от цивилизации. К примеру, пробил колесо, машина остановилась, вышли и заменили колесо и поехали дальше.

Простой есть, но сервис не упал в целом.

А под «высокой доступностью» (high availability) приводят пример с самолетом, где все важные системы многократно задублированы. Так как в полете самолет не может остановится и исправить проблему. Переключаются на резервную систему и летят в аэропорт, там после посадки механики разберутся в чем была проблема. Ну это очень и очень упрощенно.

В DNS есть прекрасный механизм SRV записей. Я рекомендую использовать этот механизм.

Этот же механизм по умолчанию применяется в Consul (Service Discovery).

Consul благодаря протоколу Gossip может за микросекунды обновлять таблицу и удалять умершие узлы, добавлять новые узлы. Даже есть примеры рабочие, например, nginx template, который обновляется и перегружается каждый раз при изменение состояния узлов кластера.

Это в случае, если сеть простая без BGP.

А в случае с BGP можно отказаться от NGINX как балансировщика и перевести все хозяйство на ECMP (Equal cost multi path).

Nurmukh ★★★★
()
Ответ на: комментарий от Nurmukh

Это всё хорошо внутри датацентра (или между несколькими датацентрами). А меня интересует вопрос «последней мили». Юзер написал адрес сайта в браузере и сайт должен ему открыться даже если любое меньшинство серверов упало (единственная нода лоад-балансера тоже «меньшинство»). Так что либо failover должен быть не на уровне протокола приложения, либо должен поддерживаться популярными браузерами.

Как я понимаю, у браузеров такого нет (можно натянуть Service Worker'ы, но если юзер пришёл на сайт первый раз, то он не поможет). А вот anycast и VRRP актуальны.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Про vrrp все правильно посоветовали

Только ip ведет не на backend, а на reverse proxy. nginx/angie или haproxy. а тот уже сам проверят доступность backend’ов и балансирует нагрузку по живым

router ★★★★★
()