Разве Ubuntu-stock ldirectord не обрабатывает зависшие соединения с реальными серверами или я неправильно его настраиваю?
Я использую его для балансировки и удаления сбойных экземпляров из кластера http/https, но заметил, что когда соединения с реальным сервером зависают, ldirectord никогда не помечает их как неподвижные, хотя это происходит мгновенно, если соединение отклонено или не может быть установлено, например, завершение работы экземпляра или остановка nginx.
Это небольшая проблема в этом случае, потому что серверы являются облачными экземплярами, которые иногда полностью зависают и используют стек серверов приложений, который иногда запускает бесконечный цикл до перезапуска; оба случая приводят к зависанию соединений.
Вот пример файла /etc/ha.d conf:
negotiatetimeout = 1
checkinterval = 1
quiescent = yes
fallback = 127.0.0.1
emailalert = "foo@example.com"
virtual = <vip 1>:80
protocol = tcp
scheduler = wlc
real = <real ip 1>:80 ipip 5
real = <real ip 2>:80 ipip 5
[more reals]
checktype = negotiate
request = "/node-status"
receive = "OK"
virtual = <vip 2>:443
protocol = tcp
scheduler = wlc
real = <real ip 1>:443 ipip 5
real = <real ip 2>:443 ipip 5
[more reals]
checktype = negotiate
request = "/node-status"
receive = "OK"
Один балансировщик Ubuntu 10.10, другой 10.04.2, ldirectord - 1.186 га на обоих.
Обратите внимание, что этот поток 2002 года подразумевает, что ldirectord не перехватывал зависшие соединения: http://archive.linuxvirtualserver.org/html/lvs-users/2002-05/msg00163.html
ОБНОВИТЬ
Обратите внимание, что вышеуказанные времена агрессивны, пока я пытаюсь прибить проблему, обычно они выше и включают количество отказов, но я видел проблему с настройками выше и ниже:
negotiatetimeout = 2
checkinterval = 2
failurecount = 5
Кроме того, в файлах журнала ldirectord нет записей, ведущих к или во время, когда одно из этих "отключений" происходит на реальном сервере. Но если служба http или сам экземпляр отключены, а он "зависает", отображение из ipvsadm и файлов журнала сразу показывает, что IP становится неподвижным.
И, когда я говорю "сервер завис", я имею в виду, что весь (облачный) экземпляр не отвечает, все попытки подключения в конечном итоге прерываются (время ожидания (ping, ssh, http и т. Д.)) И консоль также.
К сожалению, я не нашел причину ни одной из проблем (зависание сервера и бесконечный цикл стека), которые приводят сервер в такое состояние, поэтому я не могу (пока) воспроизвести ситуацию по требованию.
1 ответ
Я не уверен на 100%, но вам не нужна директива service=http при использовании request & receive? Вы пробовали без запроса / получения и вместо этого используете checktype=connect? Или что именно вы имеете в виду под "зависанием сервера"? Время соединения истекло? Не могли бы вы добавить лог-файл? например, logfile ="/var/log/ldirectord_vhost.log"
И вообще установите checktimeout=10 (не уверен, что здесь по умолчанию)