39 votos

HAProxy elegante recargar con cero pérdida de paquetes

Estoy corriendo un HAProxy de equilibrio de carga del servidor para el equilibrio de la carga a varios servidores Apache. Necesito recargar HAProxy en cualquier momento a fin de cambiar el algoritmo de equilibrio de carga.

Todo esto funciona muy bien, excepto por el hecho de que yo tenga que volver a cargar el servidor sin perder un solo paquete (en el momento de la recarga me está dando 99.76% de éxito en promedio, con 1000 peticiones por segundo durante 5 segundos). He hecho muchas horas de investigación acerca de esto, y han encontrado el siguiente comando para "correctamente recarga" el HAProxy servidor:

haproxy -D -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)

Sin embargo, esto tiene poco o ningún efecto frente a la llanura de edad service haproxy reload, todavía caída del 0,24% en promedio.

Hay alguna forma de volver a cargar el HAProxy archivo de configuración sin un solo paquete perdido de cualquier usuario?

30voto

Mxx Puntos 1135

De acuerdo a https://github.com/aws/opsworks-cookbooks/pull/40 y, en consecuencia, http://www.mail-archive.com/haproxy@formilux.org/msg06885.html usted puede:

iptables -I INPUT -p tcp --dport $PORT --syn -j DROP
sleep 1
service haproxy restart
iptables -D INPUT -p tcp --dport $PORT --syn -j DROP

Esto tiene el efecto de dejar caer el SYN antes de un reinicio, por lo que los clientes reenviar este SYN hasta que llegue el nuevo proceso.

4voto

Jason Stubbs Puntos 11

Si estás en un kernel que soporta SO_REUSEPORT, entonces, este problema no debería ocurrir.

El proceso que haproxy toma cuando se reinicia es:

1) Pruebe a establecer SO_REUSEPORT al abrir el puerto (https://github.com/haproxy/haproxy/blob/3cd0ae963e958d5d5fb838e120f1b0e9361a92f8/src/proto_tcp.c#L792-L798)

2) Intente abrir el puerto (tendrá éxito con SO_REUSEPORT)

3) Si no tuvo éxito, señal de que el proceso anterior para cerrar su puerto, espera 10ms y probar todo de nuevo. (https://github.com/haproxy/haproxy/blob/3cd0ae963e958d5d5fb838e120f1b0e9361a92f8/src/haproxy.c#L1554-L1577)

Primero fue soportado en el kernel de Linux 3.9 pero algunas distribuciones tienen un backport. Por ejemplo, EL6 de los granos de 2.6.32-417.el6 de apoyo.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: