IPvsadm неравномерно балансирует на планировщике wlc

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тогда, похоже, что там правильные activeconns:

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

решение1

С lc (наименьшее количество подключений), если все серверы имеют одинаковое количество подключений, то он всегда будет давать новое подключение к первому серверу в списке. Это может означать, что если у вас очень низкая загрузка и подключение происходит только время от времени, это подключение всегда будет идти к первому хосту в списке.

решение2

Мой любимый — wrr (weighed round robin). Правильно ли я понимаю, что вы используете DR-подход (прямая маршрутизация)?

В этом случае ipvsadm не видит соединение как таковое, поскольку ответ от RS (реального сервера) пойдет напрямую клиенту, а не обратно через LB.

решение3

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

решение4

Выводы команд Дэвида указывают, что он использует туннельный режим (IPIP), который обычно настраивается как вариант DR. Нам нужно увидеть некоторые таблицы маршрутизации или диаграммы, чтобы лучше понять его настройку.

Но я согласен, что, вероятно, отслеживание соединения в LVS сбивается, поскольку он не видит пакеты TCP FIN.

ipvsadm имеет некоторые настройки для более быстрого тайм-аута устаревших соединений. Например, следующая команда будет тайм-аута неактивных соединений через 1 час:

/sbin/ipvsadm --set 3600 120 300

Источник клиентов должен быть дважды проверен. Поведение LVS по умолчанию — делать постоянные соединения по клиентскому IP. Поэтому при стресс-тестировании с помощью wget или ab с одного и того же тестового клиентского IP все соединения будут отправлены на один и тот же реальный сервер.

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

Связанный контент