IPvsadm не одинаково балансирует на планировщике wlc
По некоторым причинам, ipvsadm, похоже, не одинаково балансирует соединения между моими реальными серверами при использовании планировщиков wlc или lc. Один реальный сервер абсолютно забит запросами, в то время как другие получают относительно мало соединений.
Мой файл ldirectord.cf выглядит так:
quiescent = yes
autoreload = yes
checktimeout = 10
checkinterval = 10
# *.example.com http
virtual = 192.0.2.111:http
real = 10.10.10.1:http ipip 10
real = 10.10.10.2:http ipip 10
real = 10.10.10.3:http ipip 10
real = 10.10.10.4:http ipip 10
real = 10.10.10.5:http ipip 10
scheduler = lc
protocol = tcp
service = http
checktype = negotiate
request = "/lb"
receive = "Up and running"
virtualhost = "site.com"
fallback = 127.0.0.1:http
Странная вещь, которая, я думаю, может быть причиной проблемы (но я действительно не уверен) в том, что ipvsadm, похоже, не отслеживает активные соединения должным образом, все они отображаются как неактивные соединения
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.0.2.111:http lc
-> 10.10.10.1:http Tunnel 10 0 10
-> 10.10.10.2:http Tunnel 10 0 18
-> 10.10.10.3:http Tunnel 10 0 3
-> 10.10.10.4:http Tunnel 10 0 10
-> 10.10.10.5:http Tunnel 10 0 5
Если я сделаю ipvsadm -Lnc
тогда я вижу много соединений, но только когда-либо в состоянии ESTABLISHED & FIN_WAIT.
Ранее я использовал ldirectord на балансировщике нагрузки на основе Gentoo, и activeconn был точным, так как переход на Ubuntu 10.4 LTS кажется чем-то другим.
# ipvsadm -v
ipvsadm v1.25 2008/5/15 (compiled with popt and IPVS v1.2.1)
Итак, ipvsadm не отслеживает активные соединения должным образом и, таким образом, неправильно работает балансировка нагрузки, и если да, то как мне снова заставить его работать должным образом?
Редактировать: становится страннее, если я cat /proc/net/ip_vs
тогда похоже, что правильные активные соединения есть:
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP C000026F:0050 rr
-> 0AB42453:0050 Tunnel 10 1 24
-> 0AB4321D:0050 Tunnel 10 0 23
-> 0AB426B2:0050 Tunnel 10 2 25
-> 0AB4244C:0050 Tunnel 10 2 22
-> 0AB42024:0050 Tunnel 10 2 23
4 ответа
С помощью lc (наименьшее соединение), если все серверы имеют одинаковое количество соединений, он всегда будет устанавливать новое соединение с первым сервером в списке. Это может означать, что если у вас очень низкое использование и время от времени только соединение, это соединение всегда будет идти к первому хосту в списке.
Мой любимый это Wrr (взвешенный круговой Робин). Прав ли я, предполагая, что вы используете DR-подход (прямая маршрутизация)?
В этом случае ipvsadm не видит соединение как таковое, поскольку ответ от RS (реального сервера) будет направлен непосредственно клиенту, а не обратно через LB.
Судя по количеству подключений, это, вероятно, не проблема для вас, но вы можете получить неравномерное распределение с наименьшим количеством подключений, если один из реальных серверов реагирует медленнее, чем другие, тогда он получит меньше новых подключений за раз, чем другие, поскольку он быстрее складывает соединения.
Выходные данные команды Дэвида указывают, что он использует туннельный режим (IPIP), который обычно настраивается как вариант DR. Нам нужно было бы увидеть некоторые таблицы или диаграммы маршрутизации, чтобы лучше понять его настройку.
Но я согласен с тем, что, вероятно, отслеживание соединения в LVS сбито с толку, поскольку оно не видит пакеты TCP FIN.
В ipvsadm есть некоторые настройки для более быстрого ожидания истекших соединений. Например, следующая команда отключит неактивные соединения через 1 час:
/sbin/ipvsadm --set 3600 120 300
Источник клиентов должен быть дважды проверен. Поведение по умолчанию для LVS - устанавливать постоянные соединения по IP-адресу клиента. Таким образом, если стресс-тестирование с использованием wget или ab с одного и того же тестового IP-адреса клиента, все соединения будут отправлены на один и тот же реальный сервер.
Haproxy - это более интеллектуальный балансировщик нагрузки, но он должен находиться на пути возврата пакетов, чтобы работать полностью прозрачно.