Вкратце ситуация: есть небольшой сайт-стартап А, на сервере А. Сервер периодически падает. Вроде бы с кем не бывает, но эти падения очень критичны — уходят клиенты (потому что стартап, завязанный на клиентских сайтах и у них наши штуки в это время перестают работать).
Вопрос — что делать?
Если на другом хостинге (сервер Б) постоянно дублировать код и базу с сервера А, то КАК при падении А мгновенно переключать трафик на Б? Или каким другим способом нивелировать падение сервера?
— С вопросом необходимости 100% работы сталкиваюсь впервые, раньше проекты были не столь критичны, буду очень благодарен за ссылки или маны, статьи и личный опыт. Спасибо!
Взрослый мир решает эти проблемы при помощи BGP и анонсировании одного IP из двух точек сразу. Соответственно, при падении одной из точек — анонсы оттуда перестают прилетать.
ucarp, keepalived и т.д. вам помогут. Виртуальный ip'шник будет бегать между двумя серверами, а базу данных можете реплицировать стандартными средствами.
Разумеется, этот вариант подходит только если у Вас адреса из одной подсети, т.е. одно из двух:
— либо оба сервера стоят у одного провайдера (снижает надежность)
— либо у Вас своя сеть и все вытекающие плюсы и минусы BPG (из минусов только относительная сложность настройки и администрирования)
Как вариант кстати, но тогда ощутимая задержка появится связанная с ожиданием ответа и переключением на другой сервер. Хотя конечно это лучше чем вообще без ответа =)
Я правильно понимаю что всегда в таких ситуациях должен быть третий самый-самый отказоустойчивый сервер, который решает на А или на Б перенаправить пользователя? Как быть если самый-самый упадет?
Да нет, тут больше не в нагрузке дело, а в том что постоянно случаются форс-мажоры: то в ДЦ электричество выключат, то админ ногой шнур выдернул, то пожар =) Вот от них ни один самый мощный сервер не застрахован.
В вашем случае самым простым способом было бы действительно взять еще один сервер, продублировать все, а затем на третьем сервере сделать балансировщик нагрузки. Так же существует возможность балансировщик задать на уровне DNS серверов. Встречал DSN хостинги где такая возможность существует. Тогда по одному домену запросы будут рассылаться на разные IP адреса серверов. Этот вариант очень удобен и быстр в реализации. Например Амазон предоставляет подобные сервисы.
DNS-балансировщик работает нормально только в том случае, когда и сервера работают! Сам по себе он не определяет, что работает, а что нет. Если какой-то из серверов отрубится, на него все равно пойдут запросы и в результате часть запросов не будет обработана.
Ещё как вариант можно рассмотреть кеширование сайта через Akamai или CloudFrount. Пока не истёк TTL кеша, сайт будет доступен, даже когда сервер лежит. Бонусом получите ощутимое снижение нагрузки.
Кеш дело хорошее, но в определенных местах. У меня много динамики и обновления постоянные, так что к сожалению не подойдет. Надо чтобы именно работало, а не выглядело как будто работает =))
а еще есть вариант — сменить хостера :) Понятно, что это дополнительно ко всему остальному, но описанное вами поведение " постоянно случаются форс-мажоры: то в ДЦ электричество выключат, то админ ногой шнур выдернул, то пожар" — это какой-то детский сад, нельзя с такими делать бизнес.
Да ну как, я филосовски к подобному отношусь, но методы противодействия надо выработать, даже если переезжать к более надежному хостеру — все ведь падают, даже тот же амазон =)
Надеюсь что проблему покроет Route 53 от амазона, если там можно выставлять поочередные приоритеты (сервер 1 не ответил — перекидываем на сервер 2) а не только балансировать запросы между адресами. Просто пока еще не смотрел.
А если нет то единственный нормальный способ как пока понял — это третий сервер который будет следить за первыми двумя =) Только кто ж будет следить за ним =)
vebmaster, мне было бы любопытно услышать ваш вариант, для общего развития. Плюс возможно кто-то придет в эту тему в поисках решения и ваш комментарий ему поможет.