Por alguma razão, o ipvsadm não parece equilibrar igualmente as conexões entre meus servidores reais ao usar os agendadores wlc ou lc. Um servidor real fica absolutamente sobrecarregado com solicitações, enquanto os outros recebem relativamente poucas conexões.
Meu arquivo ldirectord.cf se parece com isto:
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
A coisa estranha que acho que pode estar causando o problema (mas não tenho certeza) é que o ipvsadm não parece estar rastreando as conexões ativas corretamente, todas elas aparecem como conexões inativas
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
Se eu fizer ipvsadm -Lnc
isso, verei muitas conexões, mas apenas nos estados ESTABLISHED & FIN_WAIT.
Eu estava usando o ldirectord anteriormente em um balanceador de carga baseado no Gentoo e o activeconn costumava ser preciso, já que na mudança para o Ubuntu 10.4 LTS algo parece estar diferente.
# ipvsadm -v
ipvsadm v1.25 2008/5/15 (compiled with popt and IPVS v1.2.1)
Então, o ipvsadm não está rastreando as conexões ativas corretamente e, portanto, fazendo com que o balanceamento de carga funcione incorretamente? Em caso afirmativo, como faço para que ele funcione corretamente novamente?
Editar:Fica mais estranho, se eu cat /proc/net/ip_vs
parecer que os activeconns corretos estão lá:
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
Responder1
Com lc (menos conexão), se todos os servidores tiverem o mesmo número de conexões, sempre fornecerá uma nova conexão para o primeiro servidor da lista. Isso pode significar que se você tiver uma utilização muito baixa e apenas uma conexão de vez em quando, essa conexão sempre irá para o primeiro host da lista.
Responder2
Meu favorito é wrr (round robin ponderado). Estou certo ao presumir que você está usando a abordagem DR (roteamento direto)?
Nesse caso o ipvsadm não vê a conexão como tal, pois a resposta do RS (servidor real) irá diretamente para o cliente - e não de volta pelo LB.
Responder3
A julgar pelo seu número de conexões, provavelmente não é um problema para você, mas você pode obter uma distribuição desigual com menos conexões se um dos servidores reais responder mais lentamente do que os outros, ele receberá menos conexões novas por vez do que os outros como ele acumula conexões mais rapidamente.
Responder4
As saídas de comando de David indicam que ele está usando o modo túnel (IPIP), que geralmente é configurado como uma variante do DR. Precisaríamos ver algumas tabelas ou diagramas de roteamento para entender melhor sua configuração.
Mas concordo que provavelmente o rastreamento de conexão no LVS está confuso, pois não vê os pacotes TCP FIN.
ipvsadm tem algumas configurações para atingir o tempo limite das conexões expiradas mais rapidamente. Por exemplo, o comando a seguir atingirá o tempo limite das conexões inativas após 1 hora:
/sbin/ipvsadm --set 3600 120 300
A origem dos clientes deve ser verificada novamente. O comportamento padrão do LVS é fazer conexões persistentes por IP do cliente. Portanto, se o teste de estresse com wget ou ab for do mesmo IP do cliente de teste, todas as conexões serão enviadas para o mesmo servidor real.
Haproxyé um balanceador de carga mais inteligente, mas precisa ficar no caminho de retorno dos pacotes para funcionar de forma totalmente transparente.