Initial add of defaria.com
[clearscm.git] / defaria.com / blogs / Status / 2006 / 09 / load-balancing.html
1 <!DOCTYPE html>
2 <html lang="en-us" itemscope itemtype="http://schema.org/Article">
3   <head>
4     <meta charset="utf-8">
5     <meta name="description" content=" Implemented a load balancing redirection scheme for cqweb...">
6     <meta name="generator" content="Movable Type 5.2.3">
7     <title>Load Balancing Redirection - Status</title>
8     <link rel="alternate" type="application/atom+xml" title="Recent Entries" href="http://defaria.com/blogs/Status/atom.xml">
9     <link rel="canonical" href="http://defaria.com/blogs/Status/2006/09/load-balancing.html">
10     <meta name="viewport" content="width=device-width,initial-scale=1">
11     <link rel="stylesheet" href="http://defaria.com/blogs/Status/styles.css">
12     <!--[if lt IE 9]>
13     <link rel="stylesheet" href="http://defaria.com/blogs/Status/styles_ie.css">
14     <script src="/mt/mt-static/support/theme_static/rainier/js/html5shiv.js"></script>
15     <![endif]-->
16     
17     <link rel="start" href="http://defaria.com/blogs/Status/">
18
19     <link rel="prev" href="http://defaria.com/blogs/Status/2006/09/jvm-stackheap-s.html" title="JVM Stack/Heap Sizes">
20     <link rel="next" href="http://defaria.com/blogs/Status/2006/10/redirecting-on.html" title="Redirecting on ErrorDocument">
21     <!-- Open Graph Protocol -->
22     <meta property="og:type" content="article">
23     <meta property="og:locale" content="en-us">
24     <meta property="og:title" content="Load Balancing Redirection">
25     <meta property="og:url" content="http://defaria.com/blogs/Status/2006/09/load-balancing.html">
26     <meta property="og:description" content=" Implemented a load balancing redirection scheme for cqweb...">
27     <meta property="og:site_name" content="Status">
28     <meta property="og:image" content="/mt/mt-static/support/theme_static/rainier/img/siteicon-sample.png">
29     <!-- Metadata -->
30     <meta itemprop="description" content=" Implemented a load balancing redirection scheme for cqweb...">
31     <link itemprop="url" href="http://defaria.com/blogs/Status/2006/09/load-balancing.html">
32     <link itemprop="image" href="/mt/mt-static/support/theme_static/rainier/img/siteicon-sample.png">
33     
34   </head>
35   <body>
36     <div id="container">
37       <div id="container-inner">
38         <header id="header" role="banner">
39           <div id="header-inner">
40             <div id="header-content">
41               <h1>
42                 <a href="http://defaria.com/blogs/Status/">
43
44                   Status
45
46                 </a>
47               </h1>
48               
49             </div>
50
51             <nav role="navigation">
52           <ul>
53             <li><a href="http://defaria.com/blogs/Status/">Home</a></li>
54
55
56           </ul>
57         </nav>
58
59           </div>
60         </header>
61         <div id="content">
62           <div id="content-inner">
63             <ul class="breadcrumb breadcrumb-list">
64               <li class="breadcrumb-list-item"><a href="http://defaria.com/blogs/Status/">Home</a></li>
65               <li class="breadcrumb-list-item">Load Balancing Redirection</li>
66             </ul>
67             <div id="individual-main" class="main" role="main">
68               <article id="entry-1833" class="entry entry-asset asset hentry">
69                 <div class="asset-header">
70                   <h2 itemprop="name" class="asset-name entry-title">Load Balancing Redirection</h2>
71                   <footer class="asset-meta">
72                     <ul class="asset-meta-list">
73                       <li class="asset-meta-list-item">Posted on <time datetime="2006-09-29T14:35:09-08:00" itemprop="datePublished">September 29, 2006</time></li>
74                       <li class="asset-meta-list-item">by <span class="author entry-author vcard"></span></li>
75
76   
77                       <li class="asset-meta-list-item">in <a itemprop="articleSection" rel="tag" href="http://defaria.com/blogs/Status/texas-instruments/">Texas Instruments</a></li>
78   
79
80                    </ul>
81                 </footer>
82                 </div>
83                 <div class="entry-content asset-content" itemprop="articleBody">
84                   <ul>
85   <li>Implemented a load balancing redirection scheme for cqweb</li>
86 </ul>
87                   <h2>Load Balancing CQ Web Servers based on Number of CQ Web Users</h2>
88
89 <p>The task at hand was to write a redirector that load balances amongst a number of CQ Web servers based on the number of CQ Web Users currently on each server. Additionally, based on how the user came into the CQ Web server farm, redirect them to the proper schema.</p>
90
91 <h3>Determining Load</h3>
92
93 <p>The old IIS CQ Web Server used to allow you to query the number of active CQ Web Users. The new Apache/Tomcat server only allows admins to do this. Additionally the admin need to be logged in, thus have a valid token. IBM/Rational suggests using Apache's server-status URL to determine load. However that only displays number of Apache requests in progress not number of CQ Web Users.</p>
94
95 <p>If ExtendedStatus is turned on then Apache lists each connection and the URL they are working on. By filtering "GET /cqweb" we can get a rough estimate of the number of CQ Web Users. There is a problem in that the redirector script cannot query the same web server that it's running on. Additionally this information can only be obtained if ExtendedStatus is turned on.</p>
96
97 <h2>Algorithm for selecting a server</h2>
98
99 <p>The algorithm for selecting a non busy server is described as:</p>
100
101 <p>Pick a lightly loaded server out of the pool. Note that if a server is not running with ExtendedStatus on then $cq_users will be undef. This is different than the case where the server has ExtendedStatus on but there just aren't any CQ Web users (which would be denoted by $cq_users = 0). Thus we may have the condition where:
102
103 <table cellspacing=0 cellpadding=2 border=1>
104   <tbody>
105     <tr>
106       <th>Server</th>
107       <th>cq_users</th>
108       <th>ExtendedStatus</th>
109     </tr>
110     <tr>
111       <td>server1</td>
112       <td>undef</td>
113       <td>off</td>
114     </tr>
115     <tr>
116       <td>server2</td>
117       <td>20</td>
118       <td>on</td>
119     </tr>
120     <tr>
121       <td>server3</td>
122       <td>0</td>
123       <td>on</td>
124     </tr>
125     <tr>
126       <td>server4</td>
127       <td>10</td>
128       <td>on</td>
129     </tr>
130   </tbody>
131 <table>
132
133 <p>In such a case we wish to pick server3 since it has no current CQ web users.
134
135 <p>The algorithm used here will be to remove all servers from the pool who are not running with ExtendedStatus on since we cannot reliably tell how loaded the server is from the standpoint of CQ Web users. If, however, no servers have ExtendedStatus on (thus all $cq_users return as undef) then we will consider the $nbr_apache_requests. IOW $nbr_apache_requests is not equivalent with $cq_users and thus they cannot be compared together. But if no server is running with ExtendedStatus on we need to pick something!</p>
136
137 <p><b>Note:</b> If $random then a server is simply randomly chosen.</p>
138
139 <p>Unfortunately, given this algorithm, if we had the following situation:</p>
140  
141 <table cellspacing=0 cellpadding=2 border=1>
142   <tbody>
143     <tr>
144       <th>Server</th>
145       <th>cq_users</th>
146       <th>ExtendedStatus</th>
147     </tr>
148     <tr>
149       <td>server1</td>
150       <td>undef</td>
151       <td>on</td>
152     </tr>
153     <tr>
154       <td>server2</td>
155       <td>undef</td>
156       <td>off</td>
157     </tr>
158     <tr>
159       <td>server3</td>
160       <td>undef</td>
161       <td>off</td>
162     </tr>
163     <tr>
164       <td>server4</td>
165       <td>10</td>
166       <td>on</td>
167     </tr>
168   </tbody>
169 <table>
170
171 <p>Then this algorithm will always return server4.</p>
172
173 <p><b><font color=red>Important Note:</font></b> The web server doing the redirection cannot be queried. Attempting to do so hangs! Therefore it cannot participate in the server pool. It is recommended that another web server be set up as the redirector and the DNS name cqweb assigned to it. This web server can, however, participate by being a Clearquest Request Manager.</p>
174
175 <h3>Random Redirection</h3>
176
177 <p>The script can also redirect randomly instead of relying on load of CQ Web Users. Currently there are 3 servers in the pool. Only one of them has ExtendedStatus turned on. As such redirecting by load will always resolve to the one server using, the one running with ExtendedStatus on. This is not good. So currently it just picks a server randomly from the pool. This behavior is controlled by the <tt>lb</tt> parameter (currently defaulted to off meaning pick server randomly).
178
179 <h3>Defining the Server Pool</h3>
180
181 <p>The server pool is defined by a small file, servers.cfg, which simply list the servers participating in the pool. Servers can be added or removed dynamically.</p>
182
183 <h3>Mapping Redirection</h3>
184
185 <p>In the past users went to http://cqweb/&lt;area&gt;. These <areas> were HTML files in the DocumentRoot which redirected to a series of redirection scripts. It was hoped that HTTP_REFERER could be used to determine where to redirect the visitor. Unfortunately HTTP_REFERER is not guaranteed and indeed it's undefined on the web servers!</p>
186
187 <p>Instead one must specify the <tt>group</tt> parameter to the redirector script. The script then maintains a map between &lt;areas&gt; -> Schema/ContextIDs. If the group is not specified or not in the map then the user is redirected to the main login page. This is not viewed as a hardship because we need redirecting &lt;area&gt; files anyway. The new form of redirecting &lt;area&gt; file is:
188
189 <div class=code><pre>
190 &lt;html&gt;
191 &lt;head&gt;
192 &ltmdeta http-equiv="refresh" content="0; url=http://cqweb.itg.ti.com/cgi-bin/redirect.pl?group=&lt<i>area</i>&gt;&gt;
193 &lt;/head&gt;
194 </pre></div>
195
196 <h3>Redirect Map</h3>
197
198 <p>The redirect map, stored in redirect.map, is a file of key/value pairs. For example:</p>
199
200 <div class=code><pre>
201 CMDT:           &schema=CMDT.2003.06.00&contextid=CMDT
202 CSSD:           &schema=omap.2002.05.00&contextid=OMAPS
203 DLP-Play:       &schema=DLP.2003.06.00&contextid=Play
204 DLP:            &schema=DLP.2003.06.00&contextid=DLP
205 DMD-p:          &schema=DLP.2003.06.00&contextid=DMD-p
206 DMD:            &schema=DLP.2003.06.00&contextid=DMD
207 GCM:            &schema=CMDT.2003.06.00&contextid=GCM
208 HPALP:          &schema=HPA_MKT_LP&contextid=HPALP
209 LDM:            &schema=CMDT.2003.06.00&contextid=LDM
210 NV:             &schema=CMDT.2003.06.00&contextid=NV
211 SDO:            &schema=SDS.2003.06.00&contextid=SDSCM
212 SDO_TEST:       &schema=SDS_TST_DEV&contextid=SDSCM
213 WiMax:          &schema=WiMax.SR5&contextid=WiMax
214 mDTV:           &schema=mDTV.2003.06.00&contextid=MDTV
215 mDTV_play:      &schema=mDTV.2003.06.00&contextid=PLAY
216 </pre></div>
217
218 <h3>Parameters for redirect.pl</h3>
219
220 <p>The following parameters, specified in the URL, are supported by redirect.pl:</p>
221
222 <dl>
223   <dt>group</dt>
224     <dd>Specifies the key into the redirect.map for the schema/contextid. If not specified then defaults to main login page of the selected server</dd>
225
226   <dt>lb</dt>
227     <dd>If set then load balancing is attempted based on ExtendedStatus and CQ Web Users as described above. Default: undefined (off)</dd>
228
229   <dt>debug</dt>
230     <dd>If specified the user is not redirected rather debugging information is output.</dd>
231 </dl>
232                 </div>
233                 <nav class="page-navigation entry-navigation pagination content-nav">
234                   <ul class="page-navigation-list">
235
236                     <li class="page-navigation-list-item page-navigation-prev"><a rel="prev" href="http://defaria.com/blogs/Status/2006/09/jvm-stackheap-s.html" title="JVM Stack/Heap Sizes">Previous entry</a></li>
237
238
239                     <li class="page-navigation-list-item page-navigation-next"><a rel="next" href="http://defaria.com/blogs/Status/2006/10/redirecting-on.html" title="Redirecting on ErrorDocument">Next entry</a></li>
240
241                   </ul>
242                 </nav>
243                 <!--
244 <aside id="zenback" class="zenback feedback">
245   Please paste Zenback script code here.
246 </aside>
247 -->
248                 
249                 
250               </article>
251             </div>
252             <aside class="widgets related" role="complementary">
253               <nav class="widget-search widget">
254   <div class="widget-content">
255     <form method="get" id="search" action="http://defaria.com/mt/mt-search.cgi">
256       <div>
257         <input type="text" name="search" value="" placeholder="Search...">
258
259         <input type="hidden" name="IncludeBlogs" value="8">
260
261         <input type="hidden" name="limit" value="20">
262         <button type="submit" name="button">
263           <img alt="Search" src="/mt/mt-static/support/theme_static/rainier/img/search-icon.png">
264         </button>
265       </div>
266     </form>
267   </div>
268 </nav>
269 <nav class="widget-archive-category widget">
270   <h3 class="widget-header">Categories</h3>
271   <div class="widget-content">
272     
273       
274     <ul class="widget-list">
275       
276       
277       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/ameriquest/">Ameriquest (99)</a>
278       
279       
280       </li>
281       
282     
283       
284       
285       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/audience/">Audience (3)</a>
286       
287       
288       </li>
289       
290     
291       
292       
293       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/broadcom/">Broadcom (76)</a>
294       
295       
296       </li>
297       
298     
299       
300       
301       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/gpdb/">GPDB (35)</a>
302       
303       
304       </li>
305       
306     
307       
308       
309       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/general-dynamics/">General Dynamics (61)</a>
310       
311       
312       </li>
313       
314     
315       
316       
317       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/general-electric/">General Electric (13)</a>
318       
319       
320       </li>
321       
322     
323       
324       
325       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/hewlett-packard/">Hewlett Packard (13)</a>
326       
327       
328       </li>
329       
330     
331       
332       
333       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/lynuxworks/">LynuxWorks (162)</a>
334       
335       
336       </li>
337       
338     
339       
340       
341       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/pqa/">PQA (35)</a>
342       
343       
344       </li>
345       
346     
347       
348       
349       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/salira/">Salira (79)</a>
350       
351       
352       </li>
353       
354     
355       
356       
357       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/tellabs/">Tellabs (2)</a>
358       
359       
360       </li>
361       
362     
363       
364       
365       <li class="widget-list-item"><a href="http://defaria.com/blogs/Status/texas-instruments/">Texas Instruments (31)</a>
366       
367       
368       </li>
369       
370     </ul>
371       
372     
373   </div>
374 </nav>
375   
376
377 <nav class="widget-archive-dropdown widget">
378   <h3 class="widget-header">Archives</h3>
379   <div class="widget-content">
380     <select>
381       <option>Select a Month...</option>
382     
383       <option value="http://defaria.com/blogs/Status/2016/02/">February 2016</option>
384     
385   
386     
387       <option value="http://defaria.com/blogs/Status/2014/09/">September 2014</option>
388     
389   
390     
391       <option value="http://defaria.com/blogs/Status/2014/04/">April 2014</option>
392     
393   
394     
395       <option value="http://defaria.com/blogs/Status/2014/03/">March 2014</option>
396     
397   
398     
399       <option value="http://defaria.com/blogs/Status/2013/02/">February 2013</option>
400     
401   
402     
403       <option value="http://defaria.com/blogs/Status/2012/09/">September 2012</option>
404     
405   
406     
407       <option value="http://defaria.com/blogs/Status/2012/08/">August 2012</option>
408     
409   
410     
411       <option value="http://defaria.com/blogs/Status/2012/05/">May 2012</option>
412     
413   
414     
415       <option value="http://defaria.com/blogs/Status/2012/04/">April 2012</option>
416     
417   
418     
419       <option value="http://defaria.com/blogs/Status/2012/02/">February 2012</option>
420     
421   
422     
423       <option value="http://defaria.com/blogs/Status/2012/01/">January 2012</option>
424     
425   
426     
427       <option value="http://defaria.com/blogs/Status/2011/10/">October 2011</option>
428     
429   
430     
431       <option value="http://defaria.com/blogs/Status/2011/07/">July 2011</option>
432     
433   
434     
435       <option value="http://defaria.com/blogs/Status/2010/09/">September 2010</option>
436     
437   
438     
439       <option value="http://defaria.com/blogs/Status/2010/08/">August 2010</option>
440     
441   
442     
443       <option value="http://defaria.com/blogs/Status/2010/04/">April 2010</option>
444     
445   
446     
447       <option value="http://defaria.com/blogs/Status/2010/03/">March 2010</option>
448     
449   
450     
451       <option value="http://defaria.com/blogs/Status/2010/02/">February 2010</option>
452     
453   
454     
455       <option value="http://defaria.com/blogs/Status/2009/05/">May 2009</option>
456     
457   
458     
459       <option value="http://defaria.com/blogs/Status/2009/04/">April 2009</option>
460     
461   
462     
463       <option value="http://defaria.com/blogs/Status/2008/07/">July 2008</option>
464     
465   
466     
467       <option value="http://defaria.com/blogs/Status/2008/05/">May 2008</option>
468     
469   
470     
471       <option value="http://defaria.com/blogs/Status/2008/04/">April 2008</option>
472     
473   
474     
475       <option value="http://defaria.com/blogs/Status/2008/03/">March 2008</option>
476     
477   
478     
479       <option value="http://defaria.com/blogs/Status/2008/02/">February 2008</option>
480     
481   
482     
483       <option value="http://defaria.com/blogs/Status/2008/01/">January 2008</option>
484     
485   
486     
487       <option value="http://defaria.com/blogs/Status/2007/12/">December 2007</option>
488     
489   
490     
491       <option value="http://defaria.com/blogs/Status/2007/11/">November 2007</option>
492     
493   
494     
495       <option value="http://defaria.com/blogs/Status/2007/10/">October 2007</option>
496     
497   
498     
499       <option value="http://defaria.com/blogs/Status/2007/09/">September 2007</option>
500     
501   
502     
503       <option value="http://defaria.com/blogs/Status/2007/08/">August 2007</option>
504     
505   
506     
507       <option value="http://defaria.com/blogs/Status/2007/07/">July 2007</option>
508     
509   
510     
511       <option value="http://defaria.com/blogs/Status/2007/06/">June 2007</option>
512     
513   
514     
515       <option value="http://defaria.com/blogs/Status/2007/05/">May 2007</option>
516     
517   
518     
519       <option value="http://defaria.com/blogs/Status/2007/04/">April 2007</option>
520     
521   
522     
523       <option value="http://defaria.com/blogs/Status/2007/03/">March 2007</option>
524     
525   
526     
527       <option value="http://defaria.com/blogs/Status/2007/01/">January 2007</option>
528     
529   
530     
531       <option value="http://defaria.com/blogs/Status/2006/12/">December 2006</option>
532     
533   
534     
535       <option value="http://defaria.com/blogs/Status/2006/11/">November 2006</option>
536     
537   
538     
539       <option value="http://defaria.com/blogs/Status/2006/10/">October 2006</option>
540     
541   
542     
543       <option value="http://defaria.com/blogs/Status/2006/09/">September 2006</option>
544     
545   
546     
547       <option value="http://defaria.com/blogs/Status/2006/07/">July 2006</option>
548     
549   
550     
551       <option value="http://defaria.com/blogs/Status/2006/06/">June 2006</option>
552     
553   
554     
555       <option value="http://defaria.com/blogs/Status/2006/05/">May 2006</option>
556     
557   
558     
559       <option value="http://defaria.com/blogs/Status/2006/04/">April 2006</option>
560     
561   
562     
563       <option value="http://defaria.com/blogs/Status/2006/03/">March 2006</option>
564     
565   
566     
567       <option value="http://defaria.com/blogs/Status/2006/02/">February 2006</option>
568     
569   
570     
571       <option value="http://defaria.com/blogs/Status/2006/01/">January 2006</option>
572     
573   
574     
575       <option value="http://defaria.com/blogs/Status/2005/12/">December 2005</option>
576     
577   
578     
579       <option value="http://defaria.com/blogs/Status/2005/11/">November 2005</option>
580     
581   
582     
583       <option value="http://defaria.com/blogs/Status/2005/10/">October 2005</option>
584     
585   
586     
587       <option value="http://defaria.com/blogs/Status/2005/09/">September 2005</option>
588     
589   
590     
591       <option value="http://defaria.com/blogs/Status/2005/08/">August 2005</option>
592     
593   
594     
595       <option value="http://defaria.com/blogs/Status/2005/07/">July 2005</option>
596     
597   
598     
599       <option value="http://defaria.com/blogs/Status/2005/06/">June 2005</option>
600     
601   
602     
603       <option value="http://defaria.com/blogs/Status/2005/05/">May 2005</option>
604     
605   
606     
607       <option value="http://defaria.com/blogs/Status/2005/04/">April 2005</option>
608     
609   
610     
611       <option value="http://defaria.com/blogs/Status/2005/03/">March 2005</option>
612     
613   
614     
615       <option value="http://defaria.com/blogs/Status/2005/02/">February 2005</option>
616     
617   
618     
619       <option value="http://defaria.com/blogs/Status/2005/01/">January 2005</option>
620     
621   
622     
623       <option value="http://defaria.com/blogs/Status/2004/12/">December 2004</option>
624     
625   
626     
627       <option value="http://defaria.com/blogs/Status/2004/09/">September 2004</option>
628     
629   
630     
631       <option value="http://defaria.com/blogs/Status/2004/08/">August 2004</option>
632     
633   
634     
635       <option value="http://defaria.com/blogs/Status/2004/07/">July 2004</option>
636     
637   
638     
639       <option value="http://defaria.com/blogs/Status/2004/06/">June 2004</option>
640     
641   
642     
643       <option value="http://defaria.com/blogs/Status/2004/05/">May 2004</option>
644     
645   
646     
647       <option value="http://defaria.com/blogs/Status/2004/04/">April 2004</option>
648     
649   
650     
651       <option value="http://defaria.com/blogs/Status/2004/03/">March 2004</option>
652     
653   
654     
655       <option value="http://defaria.com/blogs/Status/2004/02/">February 2004</option>
656     
657   
658     
659       <option value="http://defaria.com/blogs/Status/2004/01/">January 2004</option>
660     
661   
662     
663       <option value="http://defaria.com/blogs/Status/2003/12/">December 2003</option>
664     
665   
666     
667       <option value="http://defaria.com/blogs/Status/2003/11/">November 2003</option>
668     
669     </select>
670   </div>
671 </nav>
672     
673   
674
675 <div class="widget-syndication widget section">
676   <div class="widget-content">
677     <p><img src="http://defaria.com/mt/mt-static/images/status_icons/feed.gif" alt="Subscribe to feed" width="9" height="9" /> <a href="http://defaria.com/blogs/Status/atom.xml">Subscribe to this blog's feed</a></p>
678
679   </div>
680 </div>
681
682             </aside>
683           </div>
684         </div>
685         <footer id="footer" role="contentinfo">
686           <div id="footer-inner">
687             <div id="footer-content">
688   <nav role="navigation">
689           <ul>
690             <li><a href="http://defaria.com/blogs/Status/">Home</a></li>
691
692
693           </ul>
694         </nav>
695
696   <p class="license">&copy; Copyright 2016.</p>
697   <p class="poweredby">Powered by <a href="http://www.movabletype.org/">Movable Type</a></p>
698 </div>
699           </div>
700         </footer>
701       </div>
702     </div>
703     <script src="http://defaria.com/mt/mt-static/jquery/jquery.min.js"></script>
704     <script src="http://defaria.com/blogs/Status/mt-theme-scale2.js"></script>
705   </body>
706 </html>