Por alguna razón, ipvsadm no parece equilibrar igualmente las conexiones entre mis servidores reales cuando uso los programadores wlc o lc. Un servidor real se ve absolutamente abrumado por las solicitudes, mientras que los demás reciben relativamente pocas conexiones.
Mi archivo ldirectord.cf se ve así:
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
Lo extraño que creo que puede estar causando el problema (pero realmente no estoy seguro) es que ipvsadm no parece estar rastreando las conexiones activas correctamente, todas aparecen como conexiones inactivas.
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
Si lo hago ipvsadm -Lnc
, veo muchas conexiones, pero solo en los estados ESTABLISHED y FIN_WAIT.
Estaba usando ldirectord anteriormente en un balanceador de carga basado en Gentoo y activeconn solía ser preciso, desde que pasé a Ubuntu 10.4 LTS algo parece ser diferente.
# ipvsadm -v
ipvsadm v1.25 2008/5/15 (compiled with popt and IPVS v1.2.1)
Entonces, ¿ipvsadm no rastrea correctamente las conexiones activas y, por lo tanto, hace que el equilibrio de carga funcione incorrectamente? Si es así, ¿cómo puedo hacer para que vuelva a funcionar correctamente?
Editar:Se vuelve más extraño si cat /proc/net/ip_vs
parece que las conexiones activas correctas están ahí:
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
Respuesta1
Con lc (conexión mínima), si todos los servidores tienen la misma cantidad de conexiones, siempre proporcionará una nueva conexión al primer servidor de la lista. Esto puede significar que si tiene una utilización muy baja y solo tiene una conexión de vez en cuando, esa conexión siempre irá al primer host de la lista.
Respuesta2
Mi favorito es wrr (round robin ponderado). ¿Estoy en lo cierto al suponer que está utilizando el enfoque DR (enrutamiento directo)?
En ese caso, ipvsadm no ve la conexión como tal, ya que la respuesta del RS (servidor real) irá directamente al cliente, no de regreso a través del LB.
Respuesta3
A juzgar por su número de conexiones, probablemente no sea un problema para usted, pero puede obtener una distribución desigual con la menor cantidad de conexiones si uno de los servidores reales responde más lentamente que los demás, entonces recibirá menos conexiones nuevas por vez que los demás. se acumula en conexiones más rápidamente.
Respuesta4
Las salidas del comando de David indican que está usando el modo Túnel (IPIP), que generalmente se configura como una variante de DR. Necesitaríamos ver algunas tablas o diagramas de enrutamiento para comprender mejor su configuración.
Pero estoy de acuerdo en que probablemente el seguimiento de la conexión en LVS sea confuso ya que no ve los paquetes TCP FIN.
ipvsadm tiene algunas configuraciones para que las conexiones caducadas expiren más rápido. Por ejemplo, el siguiente comando expirará el tiempo de espera de las conexiones inactivas después de 1 hora:
/sbin/ipvsadm --set 3600 120 300
Se debe verificar nuevamente la fuente de los clientes. El comportamiento predeterminado de LVS es realizar conexiones persistentes por IP del cliente. Entonces, si realiza una prueba de esfuerzo con wget o ab desde la misma IP del cliente de prueba, todas las conexiones se enviarán al mismo servidor real.
HaproxyEs un equilibrador de carga más inteligente, pero necesita ubicarse en la ruta de retorno de los paquetes para poder funcionar de forma totalmente transparente.