Как избежать таймаутов при перезагрузке сервера
У меня проблемы с сайтом, который использует циклический перебор DNS для восстановления после отказа.
Есть два веб-сервера. Когда я отключаю apache на одной коробке, все нормально. Когда браузеры пытаются зайти на веб-сервер с отключенным apache, он получает отказ в соединении и автоматически пробует другой.
Однако при перезагрузке у меня возникают проблемы. Когда я перезагружаю сервер, вместо соединения отказано, браузеры теперь ждут тайм-аут, ведущий к очень медленному сайту, пока сервер не восстановится.
Есть ли способ настроить сеть (или CentOS) таким образом, чтобы во время перезагрузки этот IP-адрес продолжал отклоняться, а не занимал много времени?
3 ответа
В качестве специального обходного пути (только при печальном отсутствии балансировщика нагрузки) вы можете сопровождать перезагрузку сервера подходящими конфигурациями на одном из следующих прыжков (коммутатор, маршрутизатор, межсетевой экран), например,
- остановить апач
- Сделайте так, чтобы следующий прыжок отвечал явными "недостижимыми" сообщениями
- перезагрузите сервер
- Отменить внесенные изменения, шаг 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 сделает то, что вы хотите.