Я знаю, что уже было задано много вариантов этого вопроса, но я все еще не могу найти хороший ответ на свои нужды.
Что я хочу сделать, так это настроить несколько (минимум 2) VPS для размещения моих веб-приложений. Я хотел бы предоставить балансировки нагрузки (что довольно легко сделать, скажем, с помощью Varnish), и относительно высокая доступность - это моя проблема.
Использование балансировщика нагрузки (который мне нужно разместить на одном из VPS) вводит единая точка отказа, что почти так же плохо, как наличие всего одной машины для обслуживания контента.
http://i.stack.imgur.com/lFafj.png
И AFAIK Циклический перебор DNS метод не только плохая идея для балансировки нагрузки, но и не обеспечивает механизм аварийного переключения. Если один из серверов выходит из строя, некоторые люди (с кешированным IP-адресом DNS) все равно будут пытаться подключиться к недоступному серверу. И забудь короткий TTL - это не правильное решение.
http://i.stack.imgur.com/mTLRf.png
Следует учитывать одну очень важную вещь: я хочу, чтобы VPS разделены на несколько центров обработки данных, поэтому, если в одном центре обработки данных отключится электричество или интернет-провайдер, веб-сайт не отключится.
Единственные 2 решения, о которых я могу придумать, - это либо полагаться на циклический перебор DNS (и в случае отказа сервера, по крайней мере, обслуживать контент для некоторого процента пользователей до восстановления), либо купить выделенный сервер в центре обработки данных, хорошо подготовленном к отключению электроэнергии и оборудованном с несколькими подключениями к Интернету (что безумно дорого по сравнению с арендой даже 10 VPS).
Итак, вопрос: Каков правильный способ избежать единой точки отказа при наличии нескольких VPS с балансировкой нагрузки?
Прошу прощения за изображения. Это просто самые простые примеры того, что я имел в виду.
Ноты:
Сколько вы готовы потратить, я еще не видел, чтобы кто-то полагался на VPS и действительно хотел потратить деньги на случай отказа центра обработки данных.
Что касается ваших рисунков:
Ошибка в первом случае верна, если (и только если) балансировщик нагрузки является одной машиной, если это одна система (как в системе, построенной из нескольких хостов), это больше не верно.
СПА (кратчайший ответ):
Действительно короткий ответ: вам нужно получить служебный IP-адрес, доступный во всех ваших регионах. И настроить маршрутизацию BGP.
Немного дольше: обычно это делается с помощью BGP и объявления IP в 2 разных местах. Вы можете настроить его таким образом, чтобы IP-адреса объявлялись все время, но один имеет более низкие предпочтения, чем другой. Таким образом, при нормальных обстоятельствах ваш трафик будет идти только на один сайт, если это не удается, маршрут BGP отбрасывается и трафик переключается на доступный IP-адрес.
У нас есть несколько настроек, похожих на это, типичный макет:
(по местоположению):
2 балансировщика
Это место, где также запускается BGP и объявляет свои IP-адреса. Обычно Quagga и некоторая настройка IPVS (мы используем keepalived)
n
серверы для обработки нагрузки (FE)
Случаи отказа:
Любой 1 балансировщик нагрузки (на одном сайте) не работает
любой n-k
из FE выходят из строя (k
количество FE, которые могут выйти из строя без каких-либо проблем)
n-(k+1)
КЭ выходят из строя (на одной площадке)
любой серьезный сбой на одном сайте
Извините, я сейчас не в настроении углубляться в детали того, как это делать вручную. Я предполагаю, что вам будет лучше (и дешевле) арендовать услугу балансировки нагрузки, которая сотворит чудеса за вас. Я читал, что Amazon предоставляет их, но я не знаю, возможно ли их использование без использования остальной инфраструктуры.
Я пытаюсь добиться того же самого, если вы найдете хорошее решение, напишите нам! :)
На данный момент я получил Amazon EC2 «Эластичный IP-адрес» (а также «Эластичная балансировка нагрузки»), который может быть направлен на инстансы в разных центрах обработки данных в одном регионе. (По иронии судьбы у них однажды был сбой, в результате которого были отключены все центры обработки данных в одном регионе).
Также я погуглил это: 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 на то, что доступный (он дошел до него, да?) host.
Если иметь 4 хоста слишком дорого, я думаю, что лучше использовать только аварийное переключение IP у какого-нибудь надежного провайдера, а не полагаться только на DNS.
С уважением, Алекс