Soft Affinity

From: Holger Just <haproxy#meine-er.de>
Date: Tue, 05 Aug 2008 16:44:22 +0200


Hi all!

I'm currently in the process of setting up HAProxy 1.3.15.2 for a larger webserver cluster. Each of the webservers is able to handle every request on its own as the service is stateless. Balance roundrobin is thus preferred.

However, due to heavy caching performed on each server, I want to define some kind of "soft affinity" based on a get-parameter to optimize the cache utilization on each server. Based on that parameter, I can seperate servers into 3 groups of different sizes (later more) which each should handle one parameter value. I think, "balance url_param <param>" does it here.

To prevent overloading, I want to restrict the number of concurrent connections each server should receive. I found "maxconn", "minconn" and "timeout queue" on server level (or server group level) to be promising. Unfortunately, it does not seem to fully cover my requirements, as I want a request to be transparently redispached to another server in the same group if an individual servers queue fills up or to a server in another group if the groups queue fills up.

In short: I want to dispatch a request to an arbitrary server of its group (based on the get parameter) if this server is able to fullfill the request now (or in the very near future). As a fallback solution, I want a roundrobin approach to dispatch additional requests to an arbitrary server. Only as the very last ressort I want requests to fail (preferable only, if _all_ servers are saturated).

Part of that seems to be achievable by using "option redispatch". But I'm not sure if it completely covers the requirements. My first approach is added below. But I think the redispatch in case of a filled backend queue will not work correctly. Maybe you could nudge me in the right direction.

defaults

   mode http
   option redispatch
   timeout queue 200

frontend proxy 192.186.1.10:80

   balance url_param my_param

   use_backend group1 if url_sub my_param=g1
   use_backend group2 if url_sub my_param=g2
   use_backend group3 if url_sub my_param=g3
   default_backend all_servers

backend group1

   balance roundrobin
   maxconn 200
   server app1 192.168.1.11:80 maxconn 50 minconn 20    server app2 192.168.1.12:80 maxconn 50 minconn 20

backend group2

   balance roundrobin
   maxconn 300

   server app3 192.168.1.13:80 maxconn 50 minconn 20
   server app4 192.168.1.14:80 maxconn 50 minconn 20
   server app5 192.168.1.15:80 maxconn 50 minconn 20

backend group3

   balance roundrobin
   maxconn 100
   server app6 192.168.1.16:80 maxconn 50 minconn 20

backend all_servers

   balance roundrobin
   maxconn 3000

   server app1 192.168.1.11:80 maxconn 50 minconn 20
   server app2 192.168.1.12:80 maxconn 50 minconn 20
   server app3 192.168.1.13:80 maxconn 50 minconn 20
   server app4 192.168.1.14:80 maxconn 50 minconn 20
   server app5 192.168.1.15:80 maxconn 50 minconn 20
   server app6 192.168.1.16:80 maxconn 50 minconn 20


Thanks for your advice!
Regards, Holger Received on 2008/08/05 16:44

This archive was generated by hypermail 2.2.0 : 2008/08/05 17:00 CEST