Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I'm running an HAProxy load balancing server to balance load to multiple Apache servers. I need to reload HAProxy at any given time in order to change the load balancing algorithm.

This all works fine, except for the fact that I have to reload the server without losing a single packet (at the moment a reload is giving me 99.76% success on average, with 1000 requests per second for 5 seconds). I have done many hours of research about this, and have found the following command for "gracefully reloading" the HAProxy server:

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

However, this has little or no effect versus the plain old service haproxy reload, it's still dropping 0.24% on average.

Is there any way of reloading the HAProxy config file without a single dropped packet from any user?

share|improve this question
1  
If you need that much reliability a better solution would be to run more than one instance of HAproxy where you can take one out of service to reload, put it back in and repeat for the other(s). –  yoonix Mar 7 at 21:19

1 Answer 1

up vote 7 down vote accepted

According to https://github.com/aws/opsworks-cookbooks/pull/40 and consequently http://www.mail-archive.com/haproxy@formilux.org/msg06885.html you can:

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

This has the effect of dropping the SYN before a restart, so that clients will resend this SYN until it reaches the new process.

share|improve this answer
    
    
both of these commands gave me this: iptables v1.4.14: invalid port/service --syn' specified` –  Dmitri DB Oct 28 at 21:26
2  
@DmitriDB you're supposed to replace $PORT with the actual port haproxy is listening on. If haproxy is listening on multiple ports, write replace --dport $PORT with --dports $PORTS_SEPARATED_BY_COMMAS, e.g., --dports 80,443. –  pepoluan Dec 18 at 11:17

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.