Re: [squid-users] squid accel peer load balancing weighted round robin?

From: Sylvain Viart <sylvain.viart@dont-contact.us>
Date: Tue, 30 Oct 2007 11:09:04 +0100

Hi Chris,
Chris Robertson a écrit :
>> I've a squid Version 2.6.STABLE16
>> with the following config accel mode design:
>>
>> proxy ----> php-01..php-08
>>
>> php are apache server no slibing proxy.
>
> If things haven't changed, weight only works with ICP. Basically an
> ICP query is sent out, and the weight is added to an internal
> calculation based on response latency (and possibly other factors) to
> determine which affirmative responding ICP peer to request the actual
> object from.
Ok, that what I suppose too. weight seems to be for ICP slibing proxy.
What I want effectively is, weighted round robin on origin server.

And it seems, that perform, round bobin as expected. But it may also be
disturbed by some other peer in my definition. Here is the complement:

I define 8 peer, for php content, and 1 for static content, as you can
see on the max-conn peer doesn't allow the same load. I first try to
modify the weight introducing the strange behavior I described.
The config I show is my new test, with url_rewriter weighted round
robin. Which seems to work as expected.

# 8 php peers
cache_peer php-01 parent 80 0 no-query originserver login=PASS max-conn=50
cache_peer php-03 parent 80 0 no-query originserver login=PASS max-conn=100
cache_peer php-04 parent 80 0 no-query originserver login=PASS max-conn=50
cache_peer php-05 parent 80 0 no-query originserver login=PASS max-conn=70
cache_peer php-06 parent 80 0 no-query originserver login=PASS max-conn=70
cache_peer php-07 parent 80 0 no-query originserver login=PASS max-conn=120
cache_peer php-08 parent 80 0 no-query originserver login=PASS max-conn=100
cache_peer php-09 parent 80 0 no-query originserver login=PASS max-conn=180

# 1 peer for admin content,
cache_peer php-02 parent 80 0 no-query originserver login=some:thing
max-conn=10

# 1 peer for static content
cache_peer filer-vip parent 80 0 no-query originserver

# acces content filtering based on acl bellow
cache_peer_access filer-vip allow static_doc
cache_peer_access filer-vip deny all

# acces content filtering based on acl bellow
cache_peer_access php-01 allow php_01
cache_peer_access php-01 deny all
cache_peer_access php-03 allow php_03
cache_peer_access php-03 deny all
cache_peer_access php-04 allow php_04
cache_peer_access php-04 deny all
cache_peer_access php-05 allow php_05
cache_peer_access php-05 deny all
cache_peer_access php-06 allow php_06
cache_peer_access php-06 deny all
cache_peer_access php-07 allow php_07
cache_peer_access php-07 deny all
cache_peer_access php-08 allow php_08
cache_peer_access php-08 deny all
cache_peer_access php-09 allow php_09
cache_peer_access php-09 deny all

# third acces content filtering based on other acl, not shown
cache_peer_access php-02 allow authorized_client admin_doc
cache_peer_access php-02 deny all

# here is the acl needed to work
acl php_01 urlgroup php01
acl php_03 urlgroup php03
acl php_04 urlgroup php04
acl php_05 urlgroup php05
acl php_06 urlgroup php06
acl php_07 urlgroup php07
acl php_08 urlgroup php08
acl php_09 urlgroup php09

acl static_doc dstdomain filer-vip

and basically what the the redirector do is:
based on regexp split the URL in 2 groups, filer URL and PHP url.

filer URL are rewrited with the pseudo domain 'filer-vip' which is
matched against static_doc acl.
php URL are rewrited and canonized, based on dstdomain and url path
regexp. Next the url are prefixed by a urlgroup tag. Here based on peer
round robbin.

Which gives the perl loop:

not extensively tested right now but works better than squid weight.

while (<>)
{
        # match filer URL
        if(m[http://($filer_host)/] ||
m[http://([^/]+)/(js/static_file|media|thumb)])
        {
                s#http://[^/]+(:[0-9]+)?#http://$filer#;

                # add urlgroup
                s#http://#!filer!$&#;
        }
        else
        {
                # if is a php multi domain, and not a dynamic content
                # rewrite it in cannonical form

                # the first regexp extract the domaine name in $1
                if(m[http://([^/]+)])
                {
                        # extract domain name from the input
                        $domain = $1;
                }

                # if the domain is not norewrite_domain and the content
is not a script
                if($domain !~ /^($norewrite_domain)$/ && $_ !~
/\.($script_ext)/)
                {
                        s#http://[^/]+(:[0-9]+)?#http://$php#;
                }

                # pickup a round robbin server
                $originserver = $php[($n_php++%$nb_php)];
                # add urlgroup
                s#http://#!php$originserver!$&#;
        }

        # print the rewrited line
        print;
}

> Squid 3's conf file seems to confirm this
> (http://www.squid-cache.org/Versions/v3/3.0/cfgman/cache_peer.html):
>
> use 'weight=n' to affect the selection of a peer during any weighted
> peer-selection mechanisms. The weight must be an integer; default is
> 1, larger weights are favored more. This option does not affect
> parent selection if a peering protocol is not in use.
Seems also for ICP proxy, even weighted-round-robin, an squid3 option,
seems to be related to ICP proxy.

>> cache_peer php-03 parent 80 0 no-query originserver round-robin weight=1
>> cache_peer php-04 parent 80 0 no-query originserver round-robin weight=1
>> cache_peer php-05 parent 80 0 no-query originserver round-robin weight=1
>> cache_peer php-06 parent 80 0 no-query originserver round-robin weight=1
>> cache_peer php-07 parent 80 0 no-query originserver round-robin weight=3
>> cache_peer php-08 parent 80 0 no-query originserver round-robin weight=1
>>
>> Strangely the weight seems not impact the load balancing as I might
>> expect.
>>
>> If increase weight on a the peer php-03 result
>> * less load on peer 01
>> * more load on peer 03
>> * less load on peer 04
>> * more load on peer 05
>> * same load on peer 06
>> * same load on peer 07
>> * more load on peer 08
>>
>> All my test seem to show always very more load on the last peer in
>> the list. That why I protect with max-conn=100.
>
> How are you measuring load? Round-robin is exactly what it sounds
> like. Each request is sent to the next peer in line. Processing load
> is not taken in to consideration.
I measure load by looking on some MRTG like graph of all the server
pool. And clearly it see, than the load is badly divided on each peer.
But if it's supposed to work with slibing proxy, I can live with that
somewhat bug. :-)
> CARP is purpose build load balancing algorithm, and as far as I know,
> it should work with originserver.
> http://docs.huihoo.com/gnu_linux/squid/html/x2398.html
Yep, I saw it too. Seems to be also for slibing proxy, no?

Thanks for you comment.

Regards,
Sylvain.
Received on Tue Oct 30 2007 - 04:09:08 MDT

This archive was generated by hypermail pre-2.1.9 : Thu Nov 01 2007 - 13:00:02 MDT