Отказоустойчивость веб-сайта/веб-сервера — лучшие практики

Например, у меня есть два сервера в одной сети с одинаковым кодом/программным обеспечением. Если основной сервер выйдет из строя, я хочу, чтобы второй стал основным.

Я слышал о следующих подходах:

Каковы плюсы и минусы вышеперечисленных подходов? И каковы наилучшие методы для достижения этого?


person Oleg    schedule 04.01.2017    source источник


Ответы (2)


Я не очень хорошо знаком с CARP, но могу попытаться помочь с оставшимися двумя вариантами:

Циклический DNS обеспечивает балансировку нагрузки, но в случае сбоя сервера он все равно будет получать запросы (которые также не будут выполняться)
т. е.: DNS www.example.com указывает как на x.x.x.1, так и на x.x.x. 2
если x.x.x.2 умирает, DNS по-прежнему будет разрешаться в x.x.x.2, и клиенты все равно будут пытаться запрашивать от него запросы, так что это увеличивает процент отказов до половины ваших запросов во время простоя (нехорошо)
Даже если вы изменить DNS, чтобы он указывал только на x.x.x.1 во время простоя; Распространение DNS займет много времени, и вы все равно будете терять запросы.

По моему честному мнению, размещение балансировщика нагрузки (прокси-сервера) перед вашим стеком — единственный выход
Мне очень нравится HAProxy, но это ни в коем случае не единственное решение (найдите то, что вам подходит)

Прокси-серверы дают вам гораздо больший контроль над вашим стеком приложений в форме высокой доступности (HA).
вы можете запланировать время простоя в любое время дня, чтобы выполнить техническое обслуживание или развертывание, не влияя на работу ваших клиентов.
Встроенные функции проверки работоспособности опрашивают внутренние серверы, разгружают их по мере необходимости и возвращают обратно, когда они выздоровели.
Недостатком балансировки нагрузки высокой доступности обычно является количество правил, которые необходимо настроить, чтобы поддерживать правильность сеансов или маршрутизацию в особых случаях. да, это может быть сложно, но есть МНОГО поддержки в сообществе, и этому легко научиться. Еще одним минусом HA Load Balancing является то, что сам прокси-сервер становится единственной точкой отказа, но это можно легко преодолеть с помощью heartbeatd и второго прокси-сервера.

Надеюсь, это ответит на некоторые ваши вопросы

person Louis Kriek    schedule 05.01.2017
comment
Спасибо большое за такой подробный ответ! У меня есть еще два вопроса, если не возражаете :) Под вторым прокси-сервером вы подразумеваете второй физический сервер или просто программное обеспечение на одном сервере. Если есть физический сервер, в случае сбоя нужно менять DNS, пока проблема не будет устранена, верно? И еще вопрос о ваших предпочтениях: вы запускаете HAProxy в режиме http или tcp? - person Oleg; 05.01.2017
comment
чтобы быть действительно высокодоступным, вам нужно снизить риск, поэтому да, другой физический сервер или виртуальная машина (предпочтительно) на случай, если ваш основной прокси-сервер выйдет из строя. HAProxy обычно представляет собой всего один файл конфигурации, который вы можете синхронизировать в сценарии перезапуска, чтобы вы знали, что на вторичном сервере установлена ​​​​последняя конфигурация. Что касается переключения DNS; это не нужно в стеке HA, ваш DNS указывает на общий IP-адрес между двумя серверами (см. with-haproxy-heartbeat-on-debian-lenny" rel="nofollow noreferrer">howtoforge.com/) - person Louis Kriek; 06.01.2017
comment
Я запускаю HAProxy в режиме http для веб-приложений и в режиме tcp для исходящей почты моего почтового сервера (SMTP) (я отправляю около 2 миллионов писем в день для кампаний). tcp имеет смысл для любого не http-трафика, поэтому все сводится к варианту использования. речь идет об использовании правильного инструмента для работы и создании стека, который работает на вас. поэтому, если вы просто хотите сбалансировать нагрузку http-запросов, тогда да, режим http - это то, что вам нужно. - person Louis Kriek; 06.01.2017

Хороший способ сделать ваши приложения отказоустойчивыми — использовать nginx в качестве балансировщика нагрузки. Можно сделать конфиг типа

upstream some_name {
  server server_ip; 
  server server_ip2; 
};
server { 
    listen 80; 
    location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For 
            $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_pass http://some_name 
     }
}

плюс этот восходящий объект nginx принимает дополнительные флаги, такие как max_fails=10 fail_timeout=20s, и достаточно умен, чтобы знать, если один сервер выходит из строя, он переключается на следующий сервер, который находится в сети, и многое другое. Пожалуйста, посетите этот официальный веб-сайт nginx для получения дополнительной информации об этом.

person JasdeepSingh    schedule 10.03.2018