<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>lighty's life: Tag balancing</title>
    <link>http://blog.lighttpd.net/articles/tag/balancing</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>Hash Balancing with mod_proxy_core</title>
      <description>&lt;p&gt;mod_proxy and mod_proxy_core support 3 balancers to spread the load over multiple backends. One of them is Hash balancing which is very good for balancing the load of caching proxies like Squid.&lt;/p&gt;


	&lt;p&gt;If you compare the performance of Hash-Balancing to the classic round-robin balancing you should see a increase of the performance as the backends can use their caches a lot better. With RR each backend has to handle the full &lt;span class="caps"&gt;URL&lt;/span&gt; namespace, with Hash-Balancing only a part. This increases the cache-locality and the overall performance.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve taken &lt;a href="http://wikipedia.org/"&gt;wikipedia&lt;/a&gt; as testbed for the hash-balancing:&lt;/p&gt;


&lt;pre&gt;
$SERVER["socket"] == ":1445" {
  proxy-core.balancer = "hash" 
  proxy-core.protocol = "http" 
  proxy-core.backends = ( "wikipedia.org" )
  proxy-core.rewrite-response = (
    "Location" =&amp;gt; ( "^http://en.wikipedia.org/(.*)" =&amp;gt; "http://127.0.0.1:1445/$1" ),
  )
  proxy-core.rewrite-request = (
    "Host" =&amp;gt; ( ".*" =&amp;gt; "en.wikipedia.org" ),
 )
}
&lt;/pre&gt;

	&lt;p&gt;The domain &lt;kbd&gt;wikipedia.org&lt;/kbd&gt; resolves to several IP-addresses:&lt;/p&gt;


&lt;pre&gt;
(trace) resolving wikipedia.org on port 80
(trace) adding 207.142.131.204:80 to the address-pool
(trace) adding 207.142.131.205:80 to the address-pool
(trace) adding 207.142.131.206:80 to the address-pool
(trace) adding 207.142.131.210:80 to the address-pool
(trace) adding 207.142.131.213:80 to the address-pool
(trace) adding 207.142.131.214:80 to the address-pool
(trace) adding 207.142.131.235:80 to the address-pool
(trace) adding 207.142.131.236:80 to the address-pool
(trace) adding 207.142.131.245:80 to the address-pool
(trace) adding 207.142.131.246:80 to the address-pool
(trace) adding 207.142.131.247:80 to the address-pool
(trace) adding 207.142.131.248:80 to the address-pool
(trace) adding 207.142.131.202:80 to the address-pool
(trace) adding 207.142.131.203:80 to the address-pool
&lt;/pre&gt;

	&lt;p&gt;When I request &lt;kbd&gt;http://127.0.0.1:1445/&lt;/kbd&gt; the load-balancer takes the &lt;span class="caps"&gt;URL&lt;/span&gt; hashes it and sends it the one of the backends.&lt;/p&gt;


&lt;pre&gt;
(trace) using hash-balancing: /wiki/Main_Page -&amp;gt; 207.142.131.204:80
(trace) using hash-balancing: /skins-1.5/monobook/main.css -&amp;gt; 207.142.131.204:80
(trace) using hash-balancing: /skins-1.5/common/commonPrint.css -&amp;gt; 207.142.131.213:80
(trace) using hash-balancing: /skins-1.5/common/wikibits.js -&amp;gt; 207.142.131.245:80
(trace) using hash-balancing: /w/index.php -&amp;gt; 207.142.131.206:80
(trace) using hash-balancing: /w/index.php -&amp;gt; 207.142.131.206:80
(trace) using hash-balancing: /w/index.php -&amp;gt; 207.142.131.206:80
(trace) using hash-balancing: /w/index.php -&amp;gt; 207.142.131.206:80
(trace) using hash-balancing: /skins-1.5/monobook/headbg.jpg -&amp;gt; 207.142.131.202:80
(trace) using hash-balancing: /skins-1.5/monobook/bullet.gif -&amp;gt; 207.142.131.245:80
(trace) using hash-balancing: /skins-1.5/common/images/poweredby_mediawiki_88x31.png -&amp;gt; 207.142.131.236:80
(trace) using hash-balancing: /images/wikimedia-button.png -&amp;gt; 207.142.131.203:80
(trace) using hash-balancing: /skins-1.5/monobook/bullet.gif -&amp;gt; 207.142.131.245:80
(trace) using hash-balancing: /skins-1.5/monobook/user.gif -&amp;gt; 207.142.131.202:80
(trace) using hash-balancing: /images/wiki-en.png -&amp;gt; 207.142.131.204:80
&lt;/pre&gt;

	&lt;p&gt;You see that the same &lt;span class="caps"&gt;URL&lt;/span&gt; results in the same address that is connected.&lt;/p&gt;


	&lt;p&gt;If one of the backends goes down, all requests that were meant for that backend are spread over the other backends. If you had 10 backends and 1 goes down, each backend has to server 1/9 URLs of the dead backend.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;you have &lt;kbd&gt;100 URLs, 10 backends&lt;/kbd&gt;&lt;/li&gt;
		&lt;li&gt;each backend handles &lt;kbd&gt;(100/10) = 10 URLs&lt;/kbd&gt;&lt;/li&gt;
		&lt;li&gt;one backend goes down and its &lt;kbd&gt;10 URLs&lt;/kbd&gt; are spread over the other 9 backends&lt;/li&gt;
		&lt;li&gt;each backend handles now its &lt;kbd&gt;10 URLs as before + (10/9) URLs&lt;/kbd&gt; of the dead backend&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;Hash balancing is following the ideas from &lt;a href="http://icp.ircache.net/carp.txt"&gt;http://icp.ircache.net/carp.txt&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 19 Jul 2006 13:38:52 +0000</pubDate>
      <guid isPermaLink="false">urn:uuid:c7479c7b-8743-44e7-8a31-219ec0c623dd</guid>
      <author>jan</author>
      <link>http://blog.lighttpd.net/articles/2006/07/19/hash-balancing-with-mod_proxy_core</link>
      <category>mod_proxy_core</category>
      <category>hash</category>
      <category>load</category>
      <category>balancing</category>
      <trackback:ping>http://blog.lighttpd.net/articles/trackback/1786</trackback:ping>
    </item>
  </channel>
</rss>
