Resources.DocsTutLoadbalancing HistoryHide minor edits - Show changes to markup April 24, 2013, at 07:59 PM
by
- Changed lines 1-927 from:
Resources -> Documentation -> Tutorials -> Load BalancingThis page has been visited 7552 times. (:toc-float Table of Content:) This tutorial applies for OpenSIPS versions 1.5, 1.6, 1.7 . Load Balancing in OpenSIPSThe "load-balancing" module comes to provide traffic routing based on load. Shortly, when OpenSIPS routes calls to a set of destinations, it is able to keep the load status (as number of ongoing calls) of each destination and to choose to route to the less loaded destination (at that moment). OpenSIPS is aware of the capacity of each destination - it is preconfigured with the maximum load accepted by the destinations. To be more precise, when routing, OpenSIPS will consider the less loaded destination not the destination with the smallest number of ongoing calls, but the destination with the largest available slot. Also, the "load-balancing" (LB) module is able to receive feedback from the destinations (if they are capable of). This mechanism is used for notifying OpenSIPS when the maximum capacity of a destination changed (like a GW with more or less E1 cards). The "load-balancing" functionality comes to enhance the "dispatcher" one. The difference comes in having or not load information about the destinations where you are routing to:
A Workshop on this topic was held at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009 Load Balancing - how it worksWhen looking at the LB implementation in OpenSIPS, we have 3 aspects: Destination setA destination is defined by its address (a SIP URI) and its description as capacity. Form the LB module perspective, the destinations are not homogeneous - they are not alike; and not only from capacity point of view, but also from what kind of services/resources they offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -some of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. So, for each destination, the LB module defines the offered resources, and for each resource, it defines the capacity / maximum load as number of concurrent calls the destination can handle for that resource. Example: 4 destinations/boxes in the LB set 1) offers 30 channels for transcoding and 32 for PSTN 2) offers 100 voicemail channels and 10 for transcoding 3) offers 50 voicemail channels and 300 for conference 4) offers 10 voicemail, 10 conference, 10 transcoding and 32 PSTN This translated into the following setup: +----+----------+------------------------+---------------------------------+ | id | group_id | dst_uri | resources | +----+----------+------------------------+---------------------------------+ | 1 | 1 | sip:yate1.mycluset.net | transc=30; pstn=32 | | 2 | 1 | sip:yate2.mycluset.net | vm=100; transc=10 | | 3 | 1 | sip:yate3.mycluset.net | vm=50; conf=300 | | 4 | 1 | sip:yate4.mycluset.net | vm=10;conf=10;transc=10;pstn=32 | +----+----------+------------------------+---------------------------------+ For runtime, the LB module provides MI commands for:
Invoking Load-balancingUsing the LB functionality is very simple - you just have to pass to the LB module what kind of resources the call requires. The resource detection is done in the OpenSIPS routing script, based on whatever information is appropriated. For example, looking at the RURI (dialed number) you can see if the call must go to PSTN or if it a voicemail or conference number; also, by looking at the codecs advertised in the SDP, you can figure out if transcoding is or not also required. if (!load_balance("1","transc;pstn")) { sl_send_reply("500","Service full"); exit; } The first parameter of the function identifies the LB set to be used (see the group_id column in the above DB snapshot). Second parameter is list of the required resource for the call. The load_balance() will automatically create the dialog state for the call (in order to monitor it) and will also allocate the requested resources for it (from the selected box). The resources will be automatically released when the call terminates. The LB module provides an MI function that allows the admin to inspect the current load over the destinations. The LB logicThe logic used by the LB module to select the destination is:
Example: 4 destinations/boxes in the LB set 1) offers 30 channels for transcoding and 32 for PSTN 2) offers 100 voicemail channels and 10 for transcoding 3) offers 50 voicemail channels and 300 for conference 4) offers 10 voicemail, 10 conference, 10 transcoding and 32 PSTN when calling load_balance("1","transc;pstn") -> 1) only boxes (1) and (4) will be selected at as they offer both transcoding and pstn 2) evaluating the load : (1) transcoding - 10 channels used; PSTN - 18 used (4) transcoding - 9 channels used; PSTN - 16 used evaluating available load (capacity-load) : (1) transcoding - 20 channels used; PSTN - 14 used (4) transcoding - 1 channels used; PSTN - 16 used 3) for each box, the minimum available load (through all resources) (1) 14 (PSTN) (2) 1 (transcoding) 4) final selected box in (1) as it has the the biggest (=14) available load for the most loaded resource. The selection algorithm tries to avoid the intensive usage of a resource per box. Study Case: routing the media gatewaysHere is the full configuration and script for performing LB between media peers. ConfigurationLet's consider the case previously described: 4 destinations/boxes in the LB set 1) offers 30 channels for transcoding and 32 for PSTN 2) offers 100 voicemail channels and 10 for transcoding 3) offers 50 voicemail channels and 300 for conference 4) offers 10 voicemail, 10 conference, 10 transcoding and 32 PSTN This translated into the following setup: +----+----------+------------------------+---------------------------------+ | id | group_id | dst_uri | resources | +----+----------+------------------------+---------------------------------+ | 1 | 1 | sip:yate1.mycluset.net | transc=30; pstn=32 | | 2 | 1 | sip:yate2.mycluset.net | vm=100; transc=10 | | 3 | 1 | sip:yate3.mycluset.net | vm=50; conf=300 | | 4 | 1 | sip:yate4.mycluset.net | vm=10;conf=10;transc=10;pstn=32 | +----+----------+------------------------+---------------------------------+ OpenSIPS Scriptingdebug=1 memlog=1 fork=yes children=2 log_stderror=no log_facility=LOG_LOCAL0 disable_tcp=yes disable_dns_blacklist = yes auto_aliases=no check_via=no dns=off rev_dns=off listen=udp:xxx.xxx.xxx.xxx:5060 loadmodule "modules/maxfwd/maxfwd.so" loadmodule "modules/sl/sl.so" loadmodule "modules/db_mysql/db_mysql.so" loadmodule "modules/tm/tm.so" loadmodule "modules/xlog/xlog.so" loadmodule "modules/uri/uri.so" loadmodule "modules/rr/rr.so" loadmodule "modules/dialog/dialog.so" loadmodule "modules/mi_fifo/mi_fifo.so" loadmodule "modules/mi_xmlrpc/mi_xmlrpc.so" loadmodule "modules/signaling/signaling.so" loadmodule "modules/textops/textops.so" loadmodule "modules/load_balancer/load_balancer.so" modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo") modparam("dialog", "dlg_flag", 13) modparam("dialog", "db_mode", 1) modparam("dialog", "db_url", "mysql://opensips:opensipsrw@localhost/opensips") modparam("rr","enable_double_rr",1) modparam("rr","append_fromtag",1) modparam("load_balancer", "db_url","mysql://opensips:opensipsrw@localhost/opensips") route{ if (!mf_process_maxfwd_header("3")) { sl_send_reply("483","looping"); exit; } if (!has_totag()) { # initial request record_route(); } else { # sequential request -> obey Route indication loose_route(); t_relay(); exit; } # handle cancel and re-transmissions if ( is_method("CANCEL") ) { if ( t_check_trans() ) t_relay(); exit; } # from now on we have only the initial requests if (!is_method("INVITE")) { send_reply("405","Method Not Allowed"); exit; } # detect resources and do balancing if ($rU=~"^1") { # looks like a Conference call load_balance("1","conf"); } else if ($rU=~"^2") { # looks like a VoiceMail call load_balance("1","vm"); } else { # PSTN call, but the GWs supports only G711 # for calls without G711, transcoding will be used on the GW if ( !search_body("G711") ) { load_balance("1","transc;pstn"); } else { load_balance("1","pstn"); } } # LB function returns negative if no suitable destination (for requested resources) is found, # or if all destinations are full if ($retcode<0) { sl_send_reply("500","Service full"); exit; } xlog("Selected destination is: $du\n"); # send it out if (!t_relay()) { sl_reply_error(); } } CommentsGavin? — 15 March 2009, 23:41— 20 March 2009, 02:41haidavila? — 04 April 2009, 04:21haidavila? — 11 April 2009, 03:21elred? — 14 April 2009, 19:01asterisktech? — 21 April 2009, 14:25geejee? — 10 May 2009, 10:35sriram? — 09 June 2009, 18:15Javier? — 31 July 2009, 02:25vaitek? — 01 August 2009, 10:17plimaye? — 02 August 2009, 20:33Javier? — 04 August 2009, 17:40Alp? — 06 August 2009, 16:49Alp? — 06 August 2009, 17:32Alp? — 06 August 2009, 18:04motto? — 08 August 2009, 00:52ravi? — 14 August 2009, 17:04Javier? — 18 August 2009, 15:24Ricardo? — 18 August 2009, 20:27ravi? — 26 August 2009, 17:47Raj? — 30 October 2009, 10:14JG? — 12 November 2009, 21:41(:nl:)>>messagehead<< LouisFox? — 11 March 2010, 09:10(:nl:)>>messagehead<< — 16 July 2010, 19:49(:nl:)>>messagehead<< Anh Ha? — 22 July 2010, 08:43(:nl:)>>messagehead<< h3xd? — 22 September 2010, 05:21(:nl:)>>messagehead<< opensipnewbie? — 29 September 2010, 11:45(:nl:)>>messagehead<< merik? — 19 October 2010, 16:38(:nl:)>>messagehead<< elwan? — 08 December 2010, 23:31dcola? — 06 January 2011, 23:23Mesha? — 19 January 2011, 13:07chaithu1987? — 17 March 2011, 22:11jarce? — 07 April 2011, 22:11jarce? — 07 April 2011, 22:15ThienVo? — 26 April 2011, 16:23sd? — 23 June 2011, 12:11Sanjeev? — 23 June 2011, 12:22Sanjeev? — 24 June 2011, 06:47Khainou? — 04 August 2011, 13:52Khainou? — 04 August 2011, 15:14Suman Singh Rana? — 02 December 2011, 12:31Allen Ford? — 06 December 2011, 22:17Rana? — 08 December 2011, 08:28Allen Ford? — 09 December 2011, 14:56Allen Ford? — 11 December 2011, 21:31Tim Burke? — 11 January 2012, 19:25Ionut Muntean? — 25 April 2012, 14:12Tim Burke? — 17 July 2012, 16:43Pepper? — 20 August 2012, 03:46Terje? — 20 August 2012, 04:19Jean? — 20 August 2012, 13:33Sandeep? — 22 August 2012, 05:14Mulker? — 22 August 2012, 06:00Mohammed? — 29 August 2012, 10:06Johan? — 04 September 2012, 15:20anand? — 11 February 2013, 10:26sonu? — 11 February 2013, 12:01BFSP? — 24 February 2013, 01:58BFSP? — 24 February 2013, 02:07BFSP? — 28 February 2013, 04:05(:commentboxchrono:) to:
(:redirect Documentation.Tutorials-LoadBalancing quiet=1 :) February 28, 2013, at 05:05 AM
by
- Comment addedAdded lines 919-924:
February 24, 2013, at 03:07 AM
by
- Comment addedAdded lines 906-918:
February 24, 2013, at 02:58 AM
by
- Comment addedAdded lines 894-905:
February 17, 2013, at 08:05 PM
by
- Added lines 5-6:
This tutorial applies for OpenSIPS versions 1.5, 1.6, 1.7 . February 11, 2013, at 01:01 PM
by
- Comment addedAdded lines 886-891:
February 11, 2013, at 11:26 AM
by
- Comment addedAdded lines 880-885:
November 26, 2012, at 11:24 PM
by
- Deleted lines 879-884:
November 26, 2012, at 04:22 PM
by
- Comment addedAdded lines 880-885:
September 04, 2012, at 04:20 PM
by
- Comment addedAdded lines 866-879:
August 29, 2012, at 11:06 AM
by
- Comment addedAdded lines 855-865:
August 22, 2012, at 07:00 AM
by
- Comment addedAdded lines 849-854:
August 22, 2012, at 06:14 AM
by
- Comment addedAdded lines 843-848:
August 20, 2012, at 02:33 PM
by
- Comment addedAdded lines 837-842:
August 20, 2012, at 05:19 AM
by
- Comment addedAdded lines 831-836:
August 20, 2012, at 04:46 AM
by
- Comment addedAdded lines 825-830:
July 17, 2012, at 05:43 PM
by
- Comment addedAdded lines 817-824:
April 25, 2012, at 03:12 PM
by
- Comment addedAdded lines 811-816:
(:nl:)>>messagehead<< Ionut Muntean? — 25 April 2012, 14:12January 12, 2012, at 06:06 PM
by
- Added lines 809-810:
[bogdan] - the possibility the exchange load information between multiple load-balancers will be available with 1.8 version (via distributed dialog profiles). January 11, 2012, at 08:25 PM
by
- Comment addedAdded lines 803-808:
December 12, 2011, at 11:29 AM
by
- Changed lines 802-813 from:
011-12-11 15:08:57 011c487e1336c70b43abd71e1be8d3fb@24.98.174.228 INVITE sip:2001@24.98.175.41:40868;rinstance=23db30f3c1031726 SIP/2.0 Record-Route: <sip:24.30.48.18;lr;ftag=as7cdc21f8;did=5c1.5ed2d731> Via: SIP/2.0/UDP 24.30.48.18;branch=z9hG4bK690a.2ab77367.0 Via: SIP/2.0/UDP 24.98.174.228:5060;received=24.98.174.228;branch=z9hG4bK049016ed;rport=5060 Max-Forwards: 68 From: "Cyford Technologies LLC" <sip:2000@24.98.174.228>;tag=as7cdc21f8 To: <sip:2001@24.98.175.41:40868;rinstance=23db30f3c1031726> Contact: <sip:2000@24.98.174.228> Call-ID: 011c487e1336c70b43abd71e1be8d3fb@24.98.174.228 CSeq: 102 INVITE User-Agent: FPBX-2.9.0(1.6.2.20) Date: Sun, 11 Dec 2011 20:08:57 GMT Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO Supported: replaces, timer Content-Type: application/sdp Content-Length: 260 v=0 o=root 289653242 289653242 IN IP4 24.98.174.228 s=Asterisk PBX 1.6.2.20 c=IN IP4 24.98.174.228 t=0 0 m=audio 16648 RTP/AVP 0 3 101 a=rtpmap:0 PCMU/8000 a=rtpmap:3 GSM/8000 a=rtpmap:101 telephone-event/800 ... INVITE udp:24.30.48.18:5060 udp:192.168.111.108:5060 as7cdc21f8 out 1038 2011-12-11 15:08:57 011c487e1336c70b43abd71e1be8d3fb@24.98.174.228 SIP/2.0 482 Loop Detected Via: SIP/2.0/UDP 24.30.48.18;branch=z9hG4bK690a.2ab77367.0;received=24.30.48.18 Via: SIP/2.0/UDP 24.98.174.228:5060;received=24.98.174.228;branch=z9hG4bK049016ed;rport=5060 From: "Cyford Technologies LLC" <sip:2000@24.98.174.228>;tag=as7cdc21f8 To: <sip:2001@24.98.175.41:40868;rinstance=23db30f3c1031726>;tag=as7cdc21f8 Call-ID: 011c487e1336c70b43abd71e1be8d3fb@24.98.174.228 CSeq: 102 INVITE Server: FPBX-2.9.0(1.6.2.20) Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO Supported: replaces, timer Content-Length: 0 INVITE 482 udp:24.98.174.228:5060 udp:24.30.48.18:5060 as7cdc21f8 in 1039 2011-12-11 15:08:57 011c487e1336c70b43abd71e1be8d3fb@24.98.174.228 SIP/2.0 482 Loop Detected Via: SIP/2.0/UDP 24.98.174.228:5060;received=24.98.174.228;branch=z9hG4bK049016ed;rport=5060 From: "Cyford Technologies LLC" <sip:2000@24.98.174.228>;tag=as7cdc21f8 To: <sip:2001@24.98.175.41:40868;rinstance=23db30f3c1031726>;tag=as7cdc21f8 Call-ID: 011c487e1336c70b43abd71e1be8d3fb@24.98.174.228 CSeq: 102 INVITE Server: FPBX-2.9.0(1.6.2.20) Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO Supported: replaces, timer Content-Length: 0 INVITE 482 udp:24.30.48.18:5060 udp:24.98.174.228:5060 as7cdc21f8 out to:
[bogdan] - please do not post net traces here (because of size) - better use the "users" mailing list. December 11, 2011, at 10:31 PM
by
- Comment addedAdded lines 794-813:
(:nl:)>>messagehead<< Allen Ford? — 11 December 2011, 21:31December 09, 2011, at 03:56 PM
by
- Comment addedAdded lines 788-793:
(:nl:)>>messagehead<< Allen Ford? — 09 December 2011, 14:56December 08, 2011, at 11:41 AM
by
- Deleted line 765:
Added lines 767-768:
[bogdan] - yes, you can Added lines 777-779:
[bogdan] - this error means you ask for a resource (in load_balance() function), that does not appear in the definition of the peers/destinations Added lines 786-787:
[bogdan] - yes, you can December 08, 2011, at 09:28 AM
by
- Comment addedAdded lines 776-781:
December 06, 2011, at 11:17 PM
by
- Comment addedAdded lines 768-775:
(:nl:)>>messagehead<< Allen Ford? — 06 December 2011, 22:17December 02, 2011, at 01:31 PM
by
- Comment addedAdded lines 759-767:
(:nl:)>>messagehead<< Suman Singh Rana? — 02 December 2011, 12:31August 04, 2011, at 04:14 PM
by
- Comment addedAdded lines 751-758:
August 04, 2011, at 02:52 PM
by
- Comment addedAdded lines 694-750:
June 24, 2011, at 07:47 AM
by
- Comment addedAdded lines 688-693:
June 23, 2011, at 01:22 PM
by
- Comment addedAdded lines 662-687:
June 23, 2011, at 01:11 PM
by
- Comment addedAdded lines 656-661:
May 12, 2011, at 12:29 PM
by
- Comments CleanupDeleted lines 655-666:
May 11, 2011, at 07:52 PM
by
- Comment addedAdded lines 662-667:
May 11, 2011, at 07:12 PM
by
- Comment addedAdded lines 656-661:
May 11, 2011, at 10:17 AM
by
- Comments CleanupDeleted lines 655-672:
May 10, 2011, at 11:53 AM
by
- Comment addedAdded lines 668-673:
May 10, 2011, at 09:03 AM
by
- Comment addedAdded lines 662-667:
May 10, 2011, at 06:35 AM
by
- Comment addedAdded lines 656-661:
April 26, 2011, at 05:23 PM
by
- Comment addedAdded lines 647-655:
April 07, 2011, at 11:15 PM
by
- Comment addedAdded lines 641-646:
April 07, 2011, at 11:11 PM
by
- Comment addedAdded lines 635-640:
March 17, 2011, at 11:11 PM
by
- Comment addedAdded lines 629-634:
(:nl:)>>messagehead<< chaithu1987? — 17 March 2011, 22:11January 19, 2011, at 02:07 PM
by
- Comment addedAdded lines 622-628:
January 07, 2011, at 12:23 AM
by
- Comment addedAdded lines 616-621:
December 09, 2010, at 12:31 AM
by
- Comment addedAdded lines 608-615:
November 10, 2010, at 09:57 AM
by
- Added lines 555-556:
[bogdan] - no, it is not possible Added lines 582-583:
[bogdan] - post your question on the user mailing list Added lines 590-591:
[bogdan] - no, as a nat traversal system must be directly linked to the nated entity, so adding a LB between NAT traversal system and nated entity will break the NAT visibility at network level Added lines 598-599:
[bogdan] - not with LB module (as the load is the number of calls, it must be dialog stateful) ; for stateless approaches, see the dispatcher module Added lines 606-607:
[bogdan] - if this tutorial (which will cover your case) does not help you, use the mailing lists October 19, 2010, at 05:38 PM
by
- Comment addedAdded lines 592-597:
September 29, 2010, at 12:45 PM
by
- Comment addedAdded lines 586-591:
(:nl:)>>messagehead<< opensipnewbie? — 29 September 2010, 11:45September 22, 2010, at 06:21 AM
by
- Comment addedAdded lines 580-585:
July 22, 2010, at 09:43 AM
by
- Comment addedAdded lines 555-579:
July 16, 2010, at 08:49 PM
by
- Comment addedAdded lines 549-554:
(:nl:)>>messagehead<< — 16 July 2010, 19:49March 11, 2010, at 10:10 AM
by
- Comment addedAdded lines 541-548:
February 18, 2010, at 01:50 PM
by
- removed, not related to LB topicChanged line 253 from:
if (!search_body("G711") )) { to:
if ( !search_body("G711") ) { Added lines 363-364:
[bogdan] - upgrade from svn to the latest version and if you still have issue, pleas post on the users mailing list Added lines 388-389:
[bogdan] - if the call is release properly (from signalling point of view, with a BYE) the LB will see the call as terminated and release the resources. Added line 448:
[bogdan] - fixed, thank you Added lines 457-459:
[bogdan] - the ACK (if properly formed by caller device) should contain the Route header and OpenSIPS will route it as sequential request (via loose_route() ) Added lines 467-468:
[bogdan] - update the IPs in DB and do via MI a "lb_reload" Added lines 484-485:
[bogdan] - check if the mi_xmlrpc.so file really exists in the directory you configured Added lines 497-498:
[bogdan] - that is a bit tricky as you have two engines for doing routing (but on different criteria) DR - prefix routing, LB - load routing; only if you chain them, like first DR to select a set of GWs(per prefix) and after that LB to choose one of the GWs from the DR set Changed lines 504-505 from:
Hi Bogdan, is possible to assign variable in load_balance("$var(a0","vm") or load_balance("$avp(i:55)","vm") function? to:
Hi Bogdan, is possible to assign variable in load_balance("$var(a0)","vm") or load_balance("$avp(i:55)","vm") function? Added lines 507-509:
[bogdan] - starting with 1.6 yes Changed lines 521-522 from:
to:
[bogdan] - see http://www.opensips.org/Resources/DocsTsStart ; it must be an error reported %% Added lines 539-540:
[bogdan] - post your question on the user mailing list February 18, 2010, at 01:33 PM
by
- removed, not related to LB topicDeleted lines 325-330:
February 18, 2010, at 01:32 PM
by
- comments compactedChanged lines 19-21 from:
A Workshop on this topic will be hold at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009 to:
A Workshop on this topic was held at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009 Added lines 286-287:
[bogdan] - there is no dependency (regarding the application you LB) - so you can have Yate, Asterisk, FreeSwitch, Cisco GW, Audiocodec GW, etc Changed lines 290-291 from:
bogdan — 18 March 2009, 10:35to:
(:nl:)>>messagehead<< — 20 March 2009, 02:41Changed lines 293-295 from:
there is no dependency (regarding the application you LB) - so you can have Yate, Asterisk, FreeSwitch, Cisco GW, Audiocodec GW, etc to:
This is nice and simple. I am still learning OpenSIPs, but is it possible to combine this with a registrar function? Looking how to combine Load Balancing to a few Asterisk servers with OpenSIP also performing the registration. [bogdan] - Of course it is possible - if you look at the default opensips cfg (that has the registrar capabilities), for processing the INVITE requests you can use load_balancing() function. If you have issues, use the mailing list for getting help Changed lines 298-299 from:
(:nl:)>>messagehead<< — 20 March 2009, 02:41to:
Changed lines 301-305 from:
This is nice and simple. I am still learning OpenSIPs, but is it possible to combine this with a registrar function? Looking how to combine Load Balancing to a few Asterisk servers with OpenSIP also performing the registration. to:
Hi. I´ve installed the new version (1.5) and I'm using load_balancer module but I'm having a problem... When a SIP server goes down and if it had the best attributes, load_balancer keeps sending the calls to it and all my calls drop. Is this normal? Can Opensips notices that this server is not working and pass it to the next sip server? Thank you! [bogdan]- unfortunately in the current version (1.5) you can not disable from script a destination; but you can do it from outside, via MI command (lb_resize to 0); you can use exec() from script to run the opensipsctl and resize the 0 the guilty server. Hope it will help. - btw, we can do disable from script with 1.6 Changed lines 308-309 from:
bogdan — 23 March 2009, 11:59to:
Changed lines 311-313 from:
Of course it is possible - if you look at the default opensips cfg (that has the registrar capabilities), for processing the INVITE requests you can use load_balancing() function. If you have issues, use the mailing list for getting help to:
Thank you bogdan, it really helped me. Regards! Changed lines 316-317 from:
to:
Changed lines 319-321 from:
Hi. I´ve installed the new version (1.5) and I'm using load_balancer module but I'm having a problem... When a SIP server goes down and if it had the best attributes, load_balancer keeps sending the calls to it and all my calls drop. Is this normal? Can Opensips notices that this server is not working and pass it to the next sip server? Thank you! to:
What if you have, let's say, 3 phones. You want each phone being able to contact each others. BUT, if you don't fall on the same server where the REGISTER was broadcasted, the PABX won't know the IP of the callee, and call won't be achieved. Is there a way to bounce REGISTER to multiple PABX ? Thanks ! [bogdan] - I do not think this is a typical case of LB (as there is some relation between the PBX you balance). What you can do is to separately deal with REGISTER and fork it (from LB server, with no LB) to all PBX and to do do LB only for INVITEs. Just an idea Changed lines 326-327 from:
bogdan — 06 April 2009, 21:16to:
Changed lines 330-331 from:
Hi haidavila, unfortunately in the current version (1.5) you can not disable from script a destination; but you can do it from outside, via MI command (lb_resize to 0); you can use exec() from script to run the opensipsctl and resize the 0 the guilty server. Hope it will help. to:
Does anyone know where I can find a good instruction on how to successfully integrate OpenSIPS with Asterisk & A2Billing systems that would enable me use OpenSIPS for SIP registration while A2Billing + Asterisk perform billing/VoIP functions? Changed lines 333-334 from:
to:
(:nl:)>>messagehead<< asterisktech? — 21 April 2009, 14:25Changed lines 336-338 from:
Thank you bogdan, it really helped me. Regards! to:
Hi, I also would appreciate if someone could post here a howto of integration of opensips with asterisk. asterisktech [bogdan] - what kind of "integration" you have in mind? I mean what opensips to do and what asterisk to do. Changed lines 345-346 from:
to:
Changed lines 349-351 from:
What if you have, let's say, 3 phones. You want each phone being able to contact each others. BUT, if you don't fall on the same server where the REGISTER was broadcasted, the PABX won't know the IP of the callee, and call won't be achieved. Is there a way to bounce REGISTER to multiple PABX ? Thanks ! to:
Hi, what I like to do is to connect more than one client (e.g. desktop phone and soft phone) to one asterisk sip account. Asterisk cannot handle this because only one client can register. So opensips should work as sort of client inbetween. Username/password verification should be done by Asterisk. Does anyone know how to do this and give me a sample configuration for opensips? Thanks Changed lines 360-361 from:
bogdan — 15 April 2009, 11:50to:
Changed lines 363-368 from:
Elred, I do not think this is a typical case of LB (as there is some relation between the PBX you balance). What you can do is to separately deal with REGISTER and fork it (from LB server, with no LB) to all PBX and to do do LB only for INVITEs. Just an idea to:
HI, I am load balancing the calls between gateways with different port values. Say I have total of 15 ports, the load balance modules works fine till 15th call. At 16th call load balance fails(this is the only call made,means all 15 ports are free ) and I am not getting calls on the gateway if I don't issue lb_reload command. I would appreciate if someone could let me know any other method to call get the current load status automatically set without entering the lb_reload comman statement. thanks Changed lines 371-372 from:
to:
Deleted lines 374-379:
Does anyone know where I can find a good instruction on how to successfully integrate OpenSIPS with Asterisk & A2Billing systems that would enable me use OpenSIPS for SIP registration while A2Billing + Asterisk perform billing/VoIP functions? (:nl:)>>messagehead<< asterisktech? — 21 April 2009, 14:25Changed lines 377-379 from:
I also would appreciate if someone could post here a howto of integration of opensips with asterisk. asterisktech to:
I'm getting the error: ERROR:core:yyparse: module 'mi_xmlrpc.so' not found in '/usr/local/lib/opensips/modules/' all the time whenever I try to use the load_balancer module. This is something I got since 1.5.1 and thought was a bug in that version and used dispatcher instead. Today, I made a fresh install of opensips 1.5.2 over a Centos 5.1 and got the same error. Could somebody point me in the right direction to solve this problem ? thanks! Changed lines 387-388 from:
bogdan — 23 April 2009, 11:14to:
Changed lines 390-391 from:
Hi asterisktech - what kind of "integration" you have in mind? I mean what opensips to do and what asterisk to do. Regards, Bogdan to:
Hello Bogdan, Great work... what if one of balanced server has ended the call in case of the limit call time ? - OpenSIPS doesn't release resources as I realised... - how can I tell LB module that it should release resources? Is there any way to shere information about resources between LB and VOIP(switches,gateways,etc) ? Changed lines 394-395 from:
to:
Changed lines 397-405 from:
Hi, what I like to do is to connect more than one client (e.g. desktop phone and soft phone) to one asterisk sip account. Asterisk cannot handle this because only one client can register. So opensips should work as sort of client inbetween. Username/password verification should be done by Asterisk. Does anyone know how to do this and give me a sample configuration for opensips? Thanks to:
Javier, You need to uncomment mi_xmlrpc in Makefile to compile the module , but you will require xmlrpc-c and xmlrpc-c-devel installed ( I am using xmlrpc-c-1.16.6-1.1582 on Centos 5.3) to compile 1.5.2. So far its working but its not supported. Will update this if I find issues with xmlrpc-c version. Changed lines 402-403 from:
to:
Changed lines 405-410 from:
HI, I am load balancing the calls between gateways with different port values. Say I have total of 15 ports, the load balance modules works fine till 15th call. At 16th call load balance fails(this is the only call made,means all 15 ports are free ) and I am not getting calls on the gateway if I don't issue lb_reload command. I would appreciate if someone could let me know any other method to call get the current load status automatically set without entering the lb_reload comman statement. thanks to:
Plimaye, Thank you very much for your help. I did that and certainly, it was in the exclude modules at makefile. I commented it. After that, I ran make clean, make and make install again and compiled ok (no errors) but I can't find xmlrpc-c and xmlrpc-c-devel to install. and every time I try to run opensips, I get: ERROR:core:sr_load_module: could not open module <mi_xmlrpc.so>: mi_xmlrpc.so: cannot open shared object file: No such file or directory and really mi_xmlrpc.so is there in the modules folder!!! If you have any other suggestion, please let me know. Thanks a lot again! [bogdan] - check if your cfg file is pointing to the right directory for loading the modules Deleted lines 422-476:
November 12, 2009, at 10:41 PM
by
- Comment addedAdded lines 534-550:
October 30, 2009, at 11:14 AM
by
- Comment addedAdded lines 521-533:
October 23, 2009, at 01:37 PM
by
- Changed lines 31-32 from:
Form the LB module perspective, the destinations are not homogeneous - they are not alike; and not only from capacity point of view, but also from what kind of services/resources they offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -s ome of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. to:
Form the LB module perspective, the destinations are not homogeneous - they are not alike; and not only from capacity point of view, but also from what kind of services/resources they offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -some of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. Changed line 64 from:
The resource detection is done in the OpenSIPS routing script, based on whatever information is appropriated. For example, looking at the RURI (dialled number) you can see if the call must go to PSTN or if it a voicemail or conference number; also, by looking at the codecs advertised in the SDP, you can figure out if transcoding is or not also required. to:
The resource detection is done in the OpenSIPS routing script, based on whatever information is appropriated. For example, looking at the RURI (dialed number) you can see if the call must go to PSTN or if it a voicemail or conference number; also, by looking at the codecs advertised in the SDP, you can figure out if transcoding is or not also required. October 23, 2009, at 01:36 PM
by
- Changed line 31 from:
Form the LB module perspective, the destinations are not homogeneous - they are not alike; and not only from capacity point of view, but also from what kind of services/resources they do offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -s ome of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. to:
Form the LB module perspective, the destinations are not homogeneous - they are not alike; and not only from capacity point of view, but also from what kind of services/resources they offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -s ome of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. October 23, 2009, at 01:35 PM
by
- Changed line 31 from:
Form the LB module perspective, the destinations are not homogeneous - they are not a like; and not only from capacity point of view, but also from what kind of services/resources they do offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -s ome of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. to:
Form the LB module perspective, the destinations are not homogeneous - they are not alike; and not only from capacity point of view, but also from what kind of services/resources they do offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -s ome of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. September 24, 2009, at 01:14 PM
by
- fixed CANCEL processing in scriptChanged lines 230-232 from:
if ( !t_check_trans() ) { if (is_method("CANCEL")) exit; to:
if ( is_method("CANCEL") ) { if ( t_check_trans() ) t_relay(); exit; August 26, 2009, at 06:47 PM
by
- Comment addedAdded lines 512-519:
August 18, 2009, at 09:27 PM
by
- Comment addedAdded lines 501-511:
August 18, 2009, at 04:24 PM
by
- Comment addedAdded lines 486-500:
August 14, 2009, at 06:04 PM
by
- Comment addedAdded lines 479-485:
August 08, 2009, at 01:52 AM
by
- Comment addedAdded lines 471-478:
August 06, 2009, at 07:04 PM
by
- Comment addedAdded lines 463-469:
August 06, 2009, at 06:32 PM
by
- Comment addedAdded lines 456-462:
August 06, 2009, at 05:49 PM
by
- Comment addedAdded lines 443-456:
August 06, 2009, at 04:49 PM
by
- Comment addedAdded lines 437-442:
(:nl:)>>messagehead<< bogdan — 06 August 2009, 15:49August 04, 2009, at 06:40 PM
by
- Comment addedAdded lines 418-436:
August 02, 2009, at 09:33 PM
by
- Comment addedAdded lines 410-417:
August 01, 2009, at 11:17 AM
by
- Comment addedAdded lines 403-409:
July 31, 2009, at 03:25 AM
by
- Comment addedAdded lines 389-403:
July 13, 2009, at 04:13 PM
by
- Added line 190:
loadmodule "modules/rr/rr.so" June 23, 2009, at 12:24 PM
by
- Deleted lines 387-392:
June 23, 2009, at 06:27 AM
by
- Comment addedAdded lines 386-392:
June 09, 2009, at 07:15 PM
by
- Comment addedAdded lines 375-385:
May 10, 2009, at 11:35 AM
by
- Comment addedAdded lines 361-374:
April 23, 2009, at 12:14 PM
by
- Comment addedAdded lines 355-360:
(:nl:)>>messagehead<< bogdan — 23 April 2009, 11:14April 21, 2009, at 03:25 PM
by
- Comment addedAdded lines 345-354:
(:nl:)>>messagehead<< asterisktech? — 21 April 2009, 14:25April 19, 2009, at 05:25 AM
by
- Comment addedAdded lines 339-344:
April 15, 2009, at 12:50 PM
by
- Comment addedAdded lines 333-338:
(:nl:)>>messagehead<< bogdan — 15 April 2009, 11:50April 14, 2009, at 08:01 PM
by
- Comment addedAdded lines 325-332:
April 11, 2009, at 04:21 AM
by
- Comment addedAdded lines 317-324:
April 06, 2009, at 10:16 PM
by
- Comment addedAdded lines 310-316:
(:nl:)>>messagehead<< bogdan — 06 April 2009, 21:16April 04, 2009, at 05:21 AM
by
- Comment addedAdded lines 302-309:
March 23, 2009, at 12:59 PM
by
- Comment addedAdded lines 296-301:
(:nl:)>>messagehead<< bogdan — 23 March 2009, 11:59March 20, 2009, at 03:41 AM
by
- Comment addedAdded lines 290-295:
(:nl:)>>messagehead<< — 20 March 2009, 02:41March 18, 2009, at 11:35 AM
by
- Comment addedAdded lines 284-289:
(:nl:)>>messagehead<< bogdan — 18 March 2009, 10:35March 18, 2009, at 11:34 AM
by
- Changed line 19 from:
A Workshop on this topic will be hold at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009>><<
to:
A Workshop on this topic will be hold at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009 March 16, 2009, at 12:41 AM
by
- Comment addedAdded lines 279-284:
March 11, 2009, at 10:54 AM
by
- Changed line 19 from:
[http://www.amoocon.de/talks/8|A Workshop on this topic] will be hold at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009>><<
to:
A Workshop on this topic will be hold at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009>><<
March 11, 2009, at 10:53 AM
by
- Added lines 18-19:
[http://www.amoocon.de/talks/8|A Workshop on this topic] will be hold at Amoocon (former AsteriskTag) in Rostock, 4-5 May 2009>><<
March 09, 2009, at 08:30 PM
by
- Added line 2:
This page has been visited 7552 times. March 09, 2009, at 04:35 PM
by
- Added line 192:
loadmodule "modules/load_balancer/load_balancer.so" March 04, 2009, at 09:23 PM
by
- Changed line 12 from:
The "load-balancing" functionality comes to replace the "dispatcher" one. The difference comes in having or not load information about the destinations where you are routing to: to:
The "load-balancing" functionality comes to enhance the "dispatcher" one. The difference comes in having or not load information about the destinations where you are routing to: March 04, 2009, at 09:04 PM
by
- Changed lines 273-276 from:
to:
Comments(:commentboxchrono:) March 04, 2009, at 09:03 PM
by
- Changed line 19 from:
to:
Changed line 125 from:
to:
Changed lines 129-273 from:
Here is the full configuration to:
Here is the full configuration and script for performing LB between media peers. ConfigurationLet's consider the case previously described: 4 destinations/boxes in the LB set 1) offers 30 channels for transcoding and 32 for PSTN 2) offers 100 voicemail channels and 10 for transcoding 3) offers 50 voicemail channels and 300 for conference 4) offers 10 voicemail, 10 conference, 10 transcoding and 32 PSTN This translated into the following setup: +----+----------+------------------------+---------------------------------+ | id | group_id | dst_uri | resources | +----+----------+------------------------+---------------------------------+ | 1 | 1 | sip:yate1.mycluset.net | transc=30; pstn=32 | | 2 | 1 | sip:yate2.mycluset.net | vm=100; transc=10 | | 3 | 1 | sip:yate3.mycluset.net | vm=50; conf=300 | | 4 | 1 | sip:yate4.mycluset.net | vm=10;conf=10;transc=10;pstn=32 | +----+----------+------------------------+---------------------------------+ OpenSIPS Scriptingdebug=1 memlog=1 fork=yes children=2 log_stderror=no log_facility=LOG_LOCAL0 disable_tcp=yes disable_dns_blacklist = yes auto_aliases=no check_via=no dns=off rev_dns=off listen=udp:xxx.xxx.xxx.xxx:5060 loadmodule "modules/maxfwd/maxfwd.so" loadmodule "modules/sl/sl.so" loadmodule "modules/db_mysql/db_mysql.so" loadmodule "modules/tm/tm.so" loadmodule "modules/xlog/xlog.so" loadmodule "modules/uri/uri.so" loadmodule "modules/dialog/dialog.so" loadmodule "modules/mi_fifo/mi_fifo.so" loadmodule "modules/mi_xmlrpc/mi_xmlrpc.so" loadmodule "modules/signaling/signaling.so" loadmodule "modules/textops/textops.so" modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo") modparam("dialog", "dlg_flag", 13) modparam("dialog", "db_mode", 1) modparam("dialog", "db_url", "mysql://opensips:opensipsrw@localhost/opensips") modparam("rr","enable_double_rr",1) modparam("rr","append_fromtag",1) modparam("load_balancer", "db_url","mysql://opensips:opensipsrw@localhost/opensips") route{ if (!mf_process_maxfwd_header("3")) { sl_send_reply("483","looping"); exit; } if (!has_totag()) { # initial request record_route(); } else { # sequential request -> obey Route indication loose_route(); t_relay(); exit; } # handle cancel and re-transmissions if ( !t_check_trans() ) { if (is_method("CANCEL")) exit; } # from now on we have only the initial requests if (!is_method("INVITE")) { send_reply("405","Method Not Allowed"); exit; } # detect resources and do balancing if ($rU=~"^1") { # looks like a Conference call load_balance("1","conf"); } else if ($rU=~"^2") { # looks like a VoiceMail call load_balance("1","vm"); } else { # PSTN call, but the GWs supports only G711 # for calls without G711, transcoding will be used on the GW if (!search_body("G711") )) { load_balance("1","transc;pstn"); } else { load_balance("1","pstn"); } } # LB function returns negative if no suitable destination (for requested resources) is found, # or if all destinations are full if ($retcode<0) { sl_send_reply("500","Service full"); exit; } xlog("Selected destination is: $du\n"); # send it out if (!t_relay()) { sl_reply_error(); } } March 04, 2009, at 08:33 PM
by
- Changed lines 53-56 from:
to:
For runtime, the LB module provides MI commands for:
Changed lines 79-81 from:
to:
The LB module provides an MI function that allows the admin to inspect the current load over the destinations. Changed lines 91-92 from:
to:
Added lines 124-125:
Added lines 128-129:
Here is the full configuration March 04, 2009, at 08:27 PM
by
- Added lines 78-117:
The logic used by the LB module to select the destination is:
Example: 4 destinations/boxes in the LB set 1) offers 30 channels for transcoding and 32 for PSTN 2) offers 100 voicemail channels and 10 for transcoding 3) offers 50 voicemail channels and 300 for conference 4) offers 10 voicemail, 10 conference, 10 transcoding and 32 PSTN when calling load_balance("1","transc;pstn") -> 1) only boxes (1) and (4) will be selected at as they offer both transcoding and pstn 2) evaluating the load : (1) transcoding - 10 channels used; PSTN - 18 used (4) transcoding - 9 channels used; PSTN - 16 used evaluating available load (capacity-load) : (1) transcoding - 20 channels used; PSTN - 14 used (4) transcoding - 1 channels used; PSTN - 16 used 3) for each box, the minimum available load (through all resources) (1) 14 (PSTN) (2) 1 (transcoding) 4) final selected box in (1) as it has the the biggest (=14) available load for the most loaded resource. The selection algorithm tries to avoid the intensive usage of a resource per box. March 04, 2009, at 07:48 PM
by
- Changed lines 71-74 from:
to:
The load_balance() will automatically create the dialog state for the call (in order to monitor it) and will also allocate the requested resources for it (from the selected box). The resources will be automatically released when the call terminates. March 04, 2009, at 07:45 PM
by
- Changed lines 16-19 from:
to:
Added lines 55-72:
Using the LB functionality is very simple - you just have to pass to the LB module what kind of resources the call requires. The resource detection is done in the OpenSIPS routing script, based on whatever information is appropriated. For example, looking at the RURI (dialled number) you can see if the call must go to PSTN or if it a voicemail or conference number; also, by looking at the codecs advertised in the SDP, you can figure out if transcoding is or not also required. if (!load_balance("1","transc;pstn")) { sl_send_reply("500","Service full"); exit; } The first parameter of the function identifies the LB set to be used (see the group_id column in the above DB snapshot). Second parameter is list of the required resource for the call. March 04, 2009, at 07:36 PM
by
- Added lines 31-52:
Example: 4 destinations/boxes in the LB set 1) offers 30 channels for transcoding and 32 for PSTN 2) offers 100 voicemail channels and 10 for transcoding 3) offers 50 voicemail channels and 300 for conference 4) offers 10 voicemail, 10 conference, 10 transcoding and 32 PSTN This translated into the following setup: +----+----------+------------------------+---------------------------------+ | id | group_id | dst_uri | resources | +----+----------+------------------------+---------------------------------+ | 1 | 1 | sip:yate1.mycluset.net | transc=30; pstn=32 | | 2 | 1 | sip:yate2.mycluset.net | vm=100; transc=10 | | 3 | 1 | sip:yate3.mycluset.net | vm=50; conf=300 | | 4 | 1 | sip:yate4.mycluset.net | vm=10;conf=10;transc=10;pstn=32 | +----+----------+------------------------+---------------------------------+ March 04, 2009, at 07:26 PM
by
- Changed lines 22-23 from:
When looking at the LB implementation in OpenSIPS we have 3 aspects: to:
When looking at the LB implementation in OpenSIPS, we have 3 aspects: Changed lines 26-32 from:
Requesting Load-balancing (resources)to:
A destination is defined by its address (a SIP URI) and its description as capacity. Form the LB module perspective, the destinations are not homogeneous - they are not a like; and not only from capacity point of view, but also from what kind of services/resources they do offer. For example, you may have a set of Yate/Asterisk boxes for media-related services -s ome of them are doing transcoding, other voicemail or conference, other simple announcement , other PSTN termination. But you may have mixed boxes - one box may do PSTN and voicemail in the same time. So each destination from the set may offer a different set of services/resources. So, for each destination, the LB module defines the offered resources, and for each resource, it defines the capacity / maximum load as number of concurrent calls the destination can handle for that resource. Invoking Load-balancingMarch 04, 2009, at 07:05 PM
by
- Added line 19:
Changed lines 22-23 from:
to:
When looking at the LB implementation in OpenSIPS we have 3 aspects: Destination setRequesting Load-balancing (resources)The LB logicMarch 04, 2009, at 06:43 PM
by - March 04, 2009, at 06:43 PM
by
- Changed lines 7-8 from:
The "load-balancing" module comes to provide traffic routing based on load. Shortly, when OpenSIPS routes calls to a set of destinations, it is able to keep the load (as number of ongoing calls) The "load-balancing" functionality comes to replace the "dispatcher". to:
The "load-balancing" module comes to provide traffic routing based on load. Shortly, when OpenSIPS routes calls to a set of destinations, it is able to keep the load status (as number of ongoing calls) of each destination and to choose to route to the less loaded destination (at that moment). OpenSIPS is aware of the capacity of each destination - it is preconfigured with the maximum load accepted by the destinations. To be more precise, when routing, OpenSIPS will consider the less loaded destination not the destination with the smallest number of ongoing calls, but the destination with the largest available slot. Also, the "load-balancing" (LB) module is able to receive feedback from the destinations (if they are capable of). This mechanism is used for notifying OpenSIPS when the maximum capacity of a destination changed (like a GW with more or less E1 cards). The "load-balancing" functionality comes to replace the "dispatcher" one. The difference comes in having or not load information about the destinations where you are routing to:
March 04, 2009, at 06:08 PM
by
- Changed lines 7-8 from:
to:
The "load-balancing" module comes to provide traffic routing based on load. Shortly, when OpenSIPS routes calls to a set of destinations, it is able to keep the load (as number of ongoing calls) The "load-balancing" functionality comes to replace the "dispatcher". March 04, 2009, at 05:57 PM
by
- Deleted lines 4-6:
Load Balancing IntroAdded lines 6-12:
Load Balancing - how it worksMarch 04, 2009, at 05:35 PM
by
- Added lines 6-11:
Load Balancing in OpenSIPSStudy Case: routing the media gatewaysMarch 04, 2009, at 05:23 PM
by
- Added lines 1-6:
Resources -> Documentation -> Tutorials -> Load Balancing(:toc-float Table of Content:) Load Balancing Intro |