Я использую keepalived для балансировки нагрузки между несколькими TCP-серверами. Я не думаю, что это имеет значение, но в данном случае это rabbitmq. Я использую балансировку типа NAT с взвешенным циклическим перебором.
Клиент подключается к серверу таким образом:
[client]-----------[lvs]------------[real server]
a b
Если клиент подключается к LVS и остается бездействующим, ничего не отправляя в сокет, это в конечном итоге истекает в соответствии с таймаутом, установленным с помощью ipvsadm --set
. В этот момент соединение, помеченное буквой «a» выше, правильно исчезает с вывода netstat -anp
на клиенте, а из вывода ipvsadm -L -n -c
на коробке лвс. Однако соединение «b» остается УСТАНОВЛЕННЫМ согласно netstat -anp
на реальном сервере.
Почему это? Могу ли я заставить lvs правильно сбросить соединение с реальным сервером?
Вы можете использовать команду --set, чтобы уменьшить время ожидания.
/sbin/ipvsadm --set 3600 120 300
Или дать haproxy попытка.
У вас включено постоянное соединение? Тайм-аут постоянного соединения можно установить с помощью -p [timeout]
Это сохраняет соединение b активным для маршрутизации дальнейших запросов с клиентского IP на тот же реальный сервер.