Great to hear :) I do not work anymore in the same environment, so I can not test the last improvement on this config. it was a generated config file like you with a a few thousand of backend sharing a dozen of frontend. The startup time was about 10 to 15 minutes too.
I could rebase my generation code with some factice config just to test it. I was not using DNS. Thx willy for these improvements ! On Tue, Apr 1, 2014 at 1:57 AM, Rajat Chopra <[email protected]> wrote: > > > Hi Steven, > > With the patch from Bertrand, you should not need many ACLs I believe. > > For the thousands of backends, yes, I did have the issue with huge startup > times, but it has been solved with recent commits from Willy. > 'Huge' is relative obviously - it came down from 15minutes or so to 8s, and > for me it is reasonable enough now. > > I changed a few things in my config file too and I have posted the > optimizations in the stackoverflow post - e.g. use fullconn 1000 in defaults > and use IP addresses for destinations instead of DNS. > > > Did you try the latest code from git? Send an example of your config file > otherwise and I am sure the experts on the list will be able to help. > > Best, > Rajat > > > > ----- Original Message ----- >> From: "Steven Le Roux" <[email protected]> >> To: "Rajat Chopra" <[email protected]> >> Cc: "haproxy" <[email protected]> >> Sent: Monday, March 31, 2014 4:04:55 PM >> Subject: Re: [PATCH] proxy: support use_backend with dynamic names >> >> Hi ! >> >> Since I experienced the same behaviour with a similar configuration, don't >> you have a huge startup time due to the ACL parsing ? >> >> -- >> Steven Le Roux >> Le 28 mars 2014 01:59, "Rajat Chopra" <[email protected]> a écrit : >> >> > Hi! >> > This solution very much solves the problem that I have been facing i.e. >> > large number of acl rules causing latency in requests. Been in discussions >> > separately about it and today I got a chance to test out this patch. I >> > report that it works great! I have been able to route 150k backends with >> > this and the latency added because of the dynamic lookup is in order of >> > microseconds (compared to 24ms earlier). >> > >> > >> > The usage 'use_backend bk_%[hdr(Host)] if TRUE' works for my use-case but >> > originally I was wondering if one could do a map based lookup for the >> > backend. >> > As posted here : >> > >> > http://stackoverflow.com/questions/22025412/how-to-use-thousands-of-backends-in-haproxy-is-the-new-map-feature-useful-for-t >> > >> > Most of the issues in the above question are now solved, but I tested this >> > with the patch -> >> > use_backend bk_%[hdr(Host), map(host_to_backend_map.file)] if TRUE >> > >> > And it does not work. I am not yet familiar with code to determine why >> > this does not work. Again, the current proposal works well for me but an >> > enhancement should probably consider using maps within dynamic lookup. >> > >> > +1 for the patch. >> > Thanks. >> > Rajat >> > >> > >> > >> > >> > >> > > Hi Bertrand, >> > > >> > > On Sun, Mar 23, 2014 at 04:18:44PM +0100, Bertrand Jacquin wrote: >> > > > Hi, >> > > > >> > > > I did this patch for dev19 some time ago but I am still not sure >> > whether >> > > > it is the best way to do it or not, and did not have the time to >> > discuss >> > > > it since. As the latest changes broke it and forced me to rebase it, >> > and >> > > > it's very useful for us, I'd like to propose it for inclusion before >> > the >> > > > final release if you think it's OK, or to discuss how it should be >> > done. >> > > >> > > Great! >> > > >> > > > Main purpose wanted to achieve is it be able to use many backends >> > > > without the need to declare each routing process from frontend to >> > > > backend and instead use generic and dynamic switching when a sane >> > > > parameter can be used from user request using the logformat logic. For >> > > > example when we have a backend farm dedicated to each 'Host: ' >> > http-header, >> > > > it's pain in the ass to have to declare the backend and the relevant >> > > > use_backend. >> > > >> > > Yes I know there's this request coming from time to time. In fact it >> > > was even planned to work like this before we finally went with ACLs >> > > and use_backend, but we felt it would be a too limited design (eg: no >> > > choice of other routing key). >> > > >> > > > With the proposed solution, you first need to declare a dynamic >> > > > use_backend as the following : >> > > > >> > > > use_backend bk_cust_%[hdr(Host)] if { hdr(Host) -m found } >> > > > >> > > > And then to declare the needed backend. For every new vhost hosted >> > will only >> > > > need to add the backend section to the configuration. >> > > >> > > I'm not opposed to the feature at all, in fact I've even been involved >> > > in a discussion about something more or less in this vein recently. But >> > > I'm having some fears about the use of the %[] form in a use_backend >> > > directive. Indeed, this string format was initially done only for >> > > logformat. Then it was adopted for unique-id. Then for all http-request >> > > directives. And we start to see from time to time people trying to use >> > > it in places which have no relation with it (eg: in ACL declaration). >> > > >> > > I'm seeing several solutions in fact : >> > > - yours above >> > > >> > > - append some argument to use_backend to indicate that it's a logformat >> > > string or a dynamic backend (eg: use_backend -d foo%[bar]), but "-d" >> > > might be a valid backend name, so ... >> > > >> > > - have a different directive name (eg: use_backend_dyn or >> > use_backend_lf), >> > > but that might increase the confusion for some users who will not >> > > necessarily know that they're part of the same ruleset. >> > > >> > > - put use_backend in http-request rules and clearly state that only >> > > http-request can use logformat, but then it means that we can't do >> > > it on TCP, and it can further confuse users who will try to chain >> > > multiple backends using http-request rules in backends. >> > > >> > > So in the end, I tend to think that your solution might still be the best >> > > one, or the least confusing one. But I'd like to read other people's >> > comments >> > > about this, maybe someone has a better idea. >> > > >> > > > More detailed usage and implementation in patch itself. >> > > > >> > > > It was rebased on commit 0e9b1b4d1f0efc5e46a10371d9be21e97581faab. >> > > >> > > OK thanks! >> > > >> > > > A current limitation of that patch can be that if a dynamic use_backend >> > > > is evaluated and the named backend is not found, the default_backend is >> > > > then used. This is not a need we have, but some may complain about it. >> > > >> > > Well, *all* use_backend rules are final today. So if the condition after >> > > use_backend is true, then the rule is executed and the evaluation is >> > > stopped. So I think this is the proper behaviour. Doing it differently >> > > could instead increase confusion, because if we changed the way it works, >> > > some people might then complain for example that when use_backend directs >> > > to a backend whose all servers are dead, we ought to go back to evaluate >> > > all the rules instead. >> > > >> > > Also I could easily see some security issues by not having this >> > behaviour, >> > > because is multiple dynamic rules are chained and it is not at all >> > expected >> > > that someone can reach someone else's backend in a multi-hosted >> > environment, >> > > we could end up still mixing the sets. >> > > >> > > It could be argued that defaulting to default_backend is not logical >> > however >> > > and that instead we should return a 503. But the current design allows >> > both >> > > behaviours if I understand it right, if you don't want to have a >> > > default_backend, by not setting one you'll get the 503. >> > > >> > > One step further would be to make the condition optional on use_backend, >> > > as it is on redirect for example. >> > > >> > > > Future enhancement could be to use the same logic for use-server and >> > > > many other part such as reqadd.. >> > > >> > > OK for use-server, but NAK for req*. These ones have been used for many >> > > years in legacy configs and we would definitely break them by doing so. >> > > The problem is the % character which is used a lot in HTTP and has a lot >> > > of chances of being already present in some configs. That's exactly the >> > > same reason why we support logformat in "http-request redirect" and not >> > > in "redirect". One is compatible with deployed configs and the other one >> > > is new and supports extensions. >> > > >> > > The patch looks fine. I'm tempted to merge it as-is, but I'd like to >> > gather >> > > some opinions first in case we'd have to change some behaviour or syntax. >> > > In the absence of comments, I'll merge it soon. >> > > >> > > Thanks! >> > > Willy >> > > >> > >> > >> > >> > >> -- Steven Le Roux Jabber-ID : [email protected] 0x39494CCB <[email protected]> 2FF7 226B 552E 4709 03F0 6281 72D7 A010 3949 4CCB

