Hi Greg,
On Sat, Jan 22, 2011 at 09:49:03AM -0800, Gregory Scallan wrote:
> Hey all,
>
> I wanted to have an http balance algorithm whose logic is similiar
> to the following:
>
> 1) use the left most part of the uri before the ? up to depth N. If the
> value at the depth of N (meaning the characters between the slashes at
> that depth) is anything other than the number zero, use a hash of the
> value at that depth only to compute which server receives the request.
>
> 2) If the above is not met (meaning there was no value at that depth OR
> the value there was the number zero), then look for the url parameter Y
> and use it's value as the hash on where to send the request. If this
> url paramter does not exist, use a round robin algorithm.
>
> From my reading of the docs, one cannot do this today, correct?
You can't *easily* do this. You can do this using two backends, one for
each hashing method. In your frontend, you check for case #1. If it
matches, you send to backend #1 which applies balance algorithm #1.
Otherwise you send to backend #2 which applies algo #2. Note that when
doing a hash on a non-existing parameter, the algorithm automatically
switches to static-round-robin, so a single backend could perform the
two algos of #2.
> If true, I think the simplest way to implement this would be to support
> multiple balance statements where the second one is used if the first is
> not met (rather than RR after the first).
It's not that easy. Depending on the algorithm, some arrays or trees are
built and updated each time a connection is allocated or released. You
can't mix several of them. However, I think that we could possibly find
a way to make the hash parameter dynamically configurable. We could for
instance have something like this :
balance hash
hash-on src if XXX
hash-on dst if XXX
hash-on hdr(host) if XXX
hash-on url_param(user) if XXX
etc...
And just like now, when no hash parameter is found, the hash table falls back
to round robin (it's just a pointer in the table that's updated so it's easy
to maintain the round robin feature with a hash table).
In my opinion, it would probably fit your needs. I don't see a reason for
having the balance algorithm parametrable between different types of algos
(eg: leastconn vs roundrobin). You can use multiple backends for that. But
having it parametrable on the hash makes sense.
> I also think I'd need a
> change to use only the character at depth N for the first part (rather
> than everything before and including that depth).
I wish I had the time to implement the request parameter extraction I
want to implement since 1.4 :-/ The goal was exactly that : define
how to extract some data from the request, then use that data with
anything (header addition, hashing, sticking, ...).
Regards,
Willy