Как избежать таймаутов при перезагрузке сервера

У меня проблемы с сайтом, который использует циклический перебор DNS для восстановления после отказа.

Есть два веб-сервера. Когда я отключаю apache на одной коробке, все нормально. Когда браузеры пытаются зайти на веб-сервер с отключенным apache, он получает отказ в соединении и автоматически пробует другой.

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

Есть ли способ настроить сеть (или CentOS) таким образом, чтобы во время перезагрузки этот IP-адрес продолжал отклоняться, а не занимал много времени?

3 ответа

Решение

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

  1. остановить апач
  2. Сделайте так, чтобы следующий прыжок отвечал явными "недостижимыми" сообщениями
  3. перезагрузите сервер
  4. Отменить внесенные изменения, шаг 2

В частности, шаг 2 может состоять из одного из следующих

  • добавление ip веб-сервера в качестве вторичного ip-адреса к одному из его интерфейсов (при условии, что на нем не запущен веб-сервер)
  • или создайте статическую запись arp (т. е. перевод с ip на mac), которая ссылается на хост runnnng, который не запускает веб-сервер
  • или сделать этот один IP не маршрутизируемым
  • или добавьте правило брандмауэра для отклонения (не отбрасывания!) трафика порта 80 на рассматриваемый ip
  • или измените существующую запись SNAT для вашего веб-сервера, чтобы он ссылался на хост, который работает, но не на веб-сервер
  • или подключите фиктивный хост с тем же MAC-адресом к той же локальной сети

Возможно, существуют и другие варианты. Есть, конечно, один важный момент: не стреляйте себе в ногу! Например,

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

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

Используйте программное обеспечение Loadbalancer с проверкой работоспособности, например Zen-Loadbalancer или HA-Proxy.

Там вы можете настроить проверку работоспособности, которая пингует или открывает файл на вашем веб-сервере и удаляет их из балансировки нагрузки, если файл, например, недоступен.

DNS Round-robin не предназначен для таких вещей, потому что ваш DNS не знает, если сервер недоступен. DNS отдает запросы поочередно каждому ip.

Просто для пояснения: DNS Round Robin не предназначен для той цели, для которой вы его используете. Он просто указывает DNS раздавать доступные IP-адреса поочередно; нет обратной связи между отказавшим сервером и DNS (и, если бы они были, проблемы с синхронизацией не позволили бы ему оказать большую помощь из-за способа, которым DNS спроектирован). Таким образом, вы можете использовать DNS-Round-Robin для балансировки нагрузки (ограниченным образом), но не для аварийного переключения.

Смотрите эту цитату: "Если служба по одному из адресов в списке не работает, DNS продолжит раздавать этот адрес, и клиенты все равно будут пытаться связаться с неработающей службой". с http://en.wikipedia.org/wiki/Round-robin_DNS

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

Кроме того, я бы поддержал уже полученный ответ: решение loadbalancer сделает то, что вы хотите.

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