Re: Persistence based on a server id url param

2009-06-02 Thread Willy Tarreau
Hi Ryan,

On Mon, Jun 01, 2009 at 12:22:57PM -0700, Ryan Schlesinger wrote:
 I've got haproxy set up (with 2 frontends) to load balance a php app 
 which works great.  However, we're using a java uploader applet that 
 doesn't appear to handle cookies.  It would be simple for me to have the 
 uploader use a URL with the server id in it (just like we're already 
 doing with the session id) but I don't see any way to get haproxy to 
 treat that parameter as the actual server id.  Using hashing is not an 
 option as changing the number of running application servers is a normal 
 occurrence for us.  I also can't use the appsession directive as the 
 haproxy session id cache isn't shared between the two frontends (both 
 running an instance of haproxy).  Can this be done with ACLs and I'm 
 missing it?

You could very well use ACLs to match your URL parameter in the
frontend and switch to either backend 1 or backend 2 depending
on the value.

Alternatively, you could hash the URL parameter (balance url_param)
but it would not necessarily be easy for your application to generate
an URL param which will hash back to the same server. So I think that
the ACL method is the most appropriate for your case.

Basically you'd do that :

frontend
acl srv1 url_sub SERVERID=1
acl srv2 url_sub SERVERID=2
acl srv1_up nbsrv(bck1) gt 0
acl srv2_up nbsrv(bck2) gt 0
use_backend bck1 if srv1_up srv1
use_backend bck2 if srv2_up srv2
default_backend bck_lb

backend bck_lb
# Perform load-balancing. Servers state is tracked
# from other backends.
balance roundrobin
server srv1 1.1.1.1 track bck1/srv1
server srv2 1.1.1.2 track bck2/srv2
...

backend bck1
balance roundrobin
server srv1 1.1.1.1 check

backend bck2
balance roundrobin
server srv2 1.1.1.2 check

That's just a guideline, but I think you should manage to get
it working based on that.

Regards,
Willy




Re: Persistence based on a server id url param

2009-06-02 Thread Jeffrey 'jf' Lim
On Tue, Jun 2, 2009 at 3:32 PM, Willy Tarreau w...@1wt.eu wrote:

 Hi Ryan,

 On Mon, Jun 01, 2009 at 12:22:57PM -0700, Ryan Schlesinger wrote:
  I've got haproxy set up (with 2 frontends) to load balance a php app
  which works great.  However, we're using a java uploader applet that
  doesn't appear to handle cookies.  It would be simple for me to have the
  uploader use a URL with the server id in it (just like we're already
  doing with the session id) but I don't see any way to get haproxy to
  treat that parameter as the actual server id.  Using hashing is not an
  option as changing the number of running application servers is a normal
  occurrence for us.  I also can't use the appsession directive as the
  haproxy session id cache isn't shared between the two frontends (both
  running an instance of haproxy).  Can this be done with ACLs and I'm
  missing it?



I actually made a patch for a client the last time that does this exact
thing. I'll see if this client is ok with sharing the code - or opensourcing
it. Willy's approach is also an interesting way of doing it - you control
the decision of what to do if the backend is down using the acl
'srv(1|2)_up'

-jf



 You could very well use ACLs to match your URL parameter in the
 frontend and switch to either backend 1 or backend 2 depending
 on the value.

 Alternatively, you could hash the URL parameter (balance url_param)
 but it would not necessarily be easy for your application to generate
 an URL param which will hash back to the same server. So I think that
 the ACL method is the most appropriate for your case.

 Basically you'd do that :

 frontend
acl srv1 url_sub SERVERID=1
acl srv2 url_sub SERVERID=2
acl srv1_up nbsrv(bck1) gt 0
acl srv2_up nbsrv(bck2) gt 0
use_backend bck1 if srv1_up srv1
use_backend bck2 if srv2_up srv2
default_backend bck_lb

 backend bck_lb
# Perform load-balancing. Servers state is tracked
# from other backends.
balance roundrobin
server srv1 1.1.1.1 track bck1/srv1
server srv2 1.1.1.2 track bck2/srv2
...

 backend bck1
balance roundrobin
server srv1 1.1.1.1 check

 backend bck2
balance roundrobin
server srv2 1.1.1.2 check

 That's just a guideline, but I think you should manage to get
 it working based on that.

 Regards,
 Willy