Is there any way to dynamically change haproxy weights according to backend server utilizations?
Is there any utility which helps modify backend server weights based on backend server utilization ? ( e.g feedbackd used to do this for LVS loadbalancer)
You could try to use a different load-balancing algorithm. leastconn
seems to be what you are looking for :
balance leastconn
According to the official HaProxy v1.4 documentation
leastconn The server with the lowest number of connections receives the
connection. Round-robin is performed within groups of servers
of the same load to ensure that all servers will be used. Use
of this algorithm is recommended where very long sessions are
expected, such as LDAP, SQL, TSE, etc... but is not very well
suited for protocols using short sessions such as HTTP. This
algorithm is dynamic, which means that server weights may be
adjusted on the fly for slow starts for instance.
To be compared against the traditional roundrobin
:
roundrobin Each server is used in turns, according to their weights.
This is the smoothest and fairest algorithm when the server's
processing time remains equally distributed. This algorithm
is dynamic, which means that server weights may be adjusted
on the fly for slow starts for instance. It is limited by
design to 4128 active servers per backend. Note that in some
large farms, when a server becomes up after having been down
for a very short time, it may sometimes take a few hundreds
requests for it to be re-integrated into the farm and start
receiving traffic. This is normal, though very rare. It is
indicated here in case you would have the chance to observe
it, so that you don't worry.
I wrote a utility to do just this, you can download it at GitHub: haproxy-dynamic-weight. It provides a way to dynamically and automatically allocate haproxy
traffic across servers in proportion to their load.
If this python
& memcached
solution isn't for you, you'll see the script's documentation refers and links to two alternatives.