Балансировка нагрузки / отказоустойчивость для нескольких наборов VPS в разных центрах обработки данных

Я знаю, что многие варианты этого вопроса уже задавались, но я все еще не могу найти хороший ответ на свои нужды.

Я хочу настроить несколько (как минимум 2) VPS для размещения моих веб-приложений. Я хотел бы обеспечить некоторую балансировку нагрузки (которая довольно легко достижима, скажем, с помощью Varnish) и относительно высокую доступность - в этом моя проблема.

Использование балансировщика нагрузки (которое мне нужно было бы разместить на одном из VPS) вводит одну точку отказа, которая почти так же плоха, как наличие только одной машины для обслуживания контента.

А метод AFAIK DNS round-robin не только является плохой идеей для балансировки нагрузки, но и не обеспечивает механизм отработки отказа. Если один из серверов выходит из строя, некоторые люди (с кэшированным IP-адресом DNS) все равно будут пытаться подключиться к недоступному серверу. И забудьте короткий TTL - это не правильное решение.

Очень важная вещь: я хочу, чтобы мои VPS были распределены по многим центрам обработки данных, поэтому, если электричество или интернет-провайдер выйдут из строя в одном центре данных, веб-сайт не отключится.

Единственные 2 решения, о которых я могу подумать, это либо использовать dns round robin (и в случае сбоя сервера, по крайней мере, обслуживать контент для некоторого процента пользователей до восстановления), либо купить выделенный сервер в центре обработки данных, хорошо подготовленном для отключения электроэнергии и оборудованном с несколькими подключениями к интернету (что безумно дорого по сравнению с арендой даже 10 VPS).

Таким образом, вопрос заключается в следующем:как правильно избежать единой точки отказа при наличии нескольких VPS с балансировкой нагрузки?

Пожалуйста, извините за изображения. Это просто основные примеры того, что я имел в виду.

2 ответа

Решение

Заметки:

Сколько вы готовы потратить, я еще не видел, чтобы кто-то полагался на VPS и действительно хотел потратить деньги на случай сбоя центра обработки данных.

Что касается ваших рисунков:

Ошибка в первом случае истинна, если (и только если) балансировщик нагрузки представляет собой одну машину, если это одна система (как в системе, построенной из нескольких хостов), это больше не так.

SPA (кратчайший ответ):

Очень краткий ответ: вам нужно получить сервисный IP, который доступен во всех ваших точках. И настроить маршрутизацию BGP.

Немного дольше: обычно это делается с помощью BGP и объявления IP в 2 разных местах. Вы можете настроить его таким образом, чтобы IP-адреса объявлялись постоянно, но один из них имеет более низкий приоритет, чем другой. Таким образом, при нормальных обстоятельствах ваш трафик будет идти только на один сайт, в случае сбоя маршрут BGP сбрасывается и трафик переключается на IP-адрес, который все еще доступен.

У нас есть несколько настроек, похожих на это, типичная схема:

(за местоположение):

  • 2 балансира

    Это место, где BGP также запускает и объявляет свои IP-адреса. Обычно Quagga и некоторые настройки IPVS (мы используем keepalived)

  • n серверы для обработки нагрузки (FE)

Случаи отказа:

  • Любой 1 Loadbalancer (на одном сайте) дает сбой

    • Обработанный keepalived, другой LB просто продолжит свою работу
  • любой n-k СЭ провалились (k количество FE, которые могут потерпеть неудачу без проблем)

    • Обработанный LBs, чек удалит их, и они больше не будут получать трафик
  • n-(k+1) Сбой FE (на одном сайте)

    • Обработано BGP. Мы уничтожим BGP-сессию на LB на сайте, где слишком много FE не удалось. Другое место вступает во владение
  • любое серьезное отключение на одном сайте

    • Обработанный BGP, сеанс BGP будет сброшен, а другое место перейдет в

Извините, у меня сейчас нет настроения углубляться в детали выполнения этого вручную. Я предполагаю, что вы будете лучше (и дешевле), арендовав услугу loadbalancer, которая сделает для вас чудо. Я читал, что Amazon предоставляет их, но я не знаю, возможно ли их использование без использования остальной инфраструктуры.

Я пытаюсь добиться того же самого, если вы найдете хорошее решение, пожалуйста, напишите!:)

То, что я получил до сих пор, это Amazon EC2 "Elastic IP" (а также "Elastic Load Balaning"), который можно направлять на экземпляры в разных центрах обработки данных в одном регионе. (По иронии судьбы у них когда-то был сбой, который уничтожил все центры обработки данных в одном регионе).

Кроме того, я погуглил этот: http://www.fibercloud.com/MatrixTechnology - похоже, они также предоставляют то, что вы ищете. (Я сам не смел спрашивать о ценах:)

Пока я вижу, что окончательный ответ - это управление собственным BGP, но по крайней мере для меня это не подлежит сомнению.

Для варианта DNS я бы согласился, что он не идеален из-за некоторого неизбежного кэширования, в основном внутри браузеров конечных пользователей. Я также согласен с тем, что низкий TTL не идеален, так как я думаю, что низкий TTL для небольших сайтов вызовет незначительное замедление, поскольку для большинства пользователей рекурсивные преобразователи DNS не будут иметь его в кэше. (Хотя стоит отметить, что у google.com TTL составляет 300 секунд). Кстати, браузеры AFAIK переключатся на второй IP-адрес, объявленный в DNS, после того, как у них закончится тайм-аут соединения с первым, так что он не выйдет из строя полностью, но я бы назвал его ухудшенным.

Я думаю о том, чтобы объединить оба - используя 2 VPS-провайдера, на каждом из которых размещено по 2 хоста - между хостами в одном центре обработки данных используется восстановление после отказа IP, а между центрами обработки данных используется DNS (как правило, объявляются оба IP-адреса с низким TTL, и как только один из них дает сбой не удалось удалить IP).

Вам следует помнить о том, что оба сайта пытаются удалить IP друг друга, поскольку считают друг друга недоступным. Я думаю, что нашел хорошее решение для этого - запустить свой DNS-сервер на каждом хосте, поэтому при раздельном мозге каждый сайт удаляет другой только со своего собственного DNS-сервера, поэтому пользователь, который может подключиться к одному хосту, также получит разрешение DNS на тот самый доступный (он дошел до него, верно?) хозяин.

Если иметь 4 хоста слишком дорого, я думаю, что лучше использовать отказоустойчивый IP-протокол у какого-нибудь надежного провайдера, а не полагаться только на DNS.

С уважением, Алекс

Другие вопросы по тегам