Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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 сеанса или чего-то подобного. Вы должны попробовать свой эксперимент с выключением веб-сервера несколько раз, используя совершенно новые сеансы - тогда у вас должны возникнуть те же проблемы, что и при перезагрузке.

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

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

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

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

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

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

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

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