[Freeswitch-users] Load balancing solution using pure FreeSWITCH

Vitalii Colosov vetali100 at gmail.com
Tue Mar 16 06:19:26 PDT 2010


Hi Tihomir,
What do you mean by "took from Mera"?
If someone else already implemented this, could you please provide me a
link?

This solution was invented by me personally, after looking into the
following: http://wiki.freeswitch.org/wiki/SBC_Setup
They use Kamailio layer as routing, I decided that we can avoid this and use
OOB things.

Thanks for your reply, it can add more value to the solution.

Regards,
vIT



2010/3/16 Tihomir Culjaga <tculjaga at gmail.com>

> this is something you took from Mera .. isn't it ? :)
>
>
>
> On Tue, Mar 16, 2010 at 1:04 PM, Vitalii Colosov <vetali100 at gmail.com>wrote:
>
>> Hi dear FS community,
>>
>> After a brief analysis of 2 solutions using OpenSIPS and Kamailio (
>> http://www.opensips.org/html/docs/modules/devel/load_balancer.html#id226109) and (
>> http://wiki.freeswitch.org/wiki/SBC_Setup) I decided to implement my own
>> solution using ONLY FreeSWITCH and ONLY 1 table of any database server (we
>> use MySQL).
>>
>> It works on few of our servers right now without any issues.
>>
>> Feel free to reuse / improve it or provide your comments if you see
>> something wrong with it.
>>
>>
>> We have one routing server (RS) and several Media Servers (MS).
>> FreeSWITCH is installed on each server in default configuration.
>>
>> --> MS_1
>> RS  --> MS_2
>> --> MS_N
>>
>>
>> (Failover can be implemented by adding one more routing server, but this
>> is out of scope of current description).
>>
>
> routing server is your single point of failure, you should make two of them
> in active/standby mode. What about registered endpoints ? ... where do you
> register them?.... you should have a DB replication in order to have the
> "registered context" distributed between both routing servers
>
>
> So, i'd suggest to bring up a LAN_HA and have a floating address between
> your routing servers.... of course the you should be using ODBC in the core
> to have registrations on both servers.
>
>
>
>
>>
>> Routing server routes calls to media servers based on logic that you can
>> easily define.
>> (Generally speaking, Routing server can route part of the calls onto
>> itself, but to simplify let's say that it will route only to Media Servers).
>>
>> you will be loosing calls on the on the MS if it goes down ... maybe there
> is a way to "replace" media resource for that calls and keep them going even
> after the MS went down.
>
>
>
>>
>> Routing server is used to register subscribers (it will have directory
>> files
>> ./freeswitch/conf/directory/default/10001whatever.xml-99999whatever.xml).
>> Media servers do NOT contain files with users (security issue? probably
>> should be managed on dialplan stage of media servers by comparing ip
>> addresses of requests).
>>
>>
> consider ODBC in the core!
>
>
>>
>> The whole routing can be presented by the following chain:
>>
>> Call arrives into Default context-->RS default dialplan-->Lua script-->PHP
>> script to get destination MEDIA SERVER IP-->back to Lua script-->Bridge
>> "sofia/external/" to determined MS IP address-->[Bridge to fail over media
>> server, optionally]-->End
>>
>> Let's say we need to route all international calls based on less loaded
>> server (other logic can be easily implemented in PHP script as well).
>>
>> *1. RS Dialplan: default.xml*
>> <include>
>>         <extension name="route">
>>                 <condition field="destination_number"
>> expression="^(00)(\d+)">
>>                         <action application="lua" data="route.lua $2"/>
>>                 </condition>
>>         </extension>
>> </include>
>>
>>
>> *2. RS Lua script: route.lua*
>> called_number = argv[1]; //without "00"
>> api = freeswitch.API();
>> server_ip_address = api:executeString("curl
>> http://localhost/get_server_ip.php);
>> forwarding_session_string =
>> "sofia/external/"..called_number.."@"..server_ip_address;
>> session:setVariable("bypass_media", "true"); //described below!!!
>> session:execute("bridge",forwarding_session_string);
>>
>>
> do your bridging in the dialplan not from a script... you will get better
> performances!
>
>
>
>
>> *3. PHP script: get_server_ip.php*
>> <<<  ANY PHP CODE THAT WILL QUERY COMMON DATABASE AND WILL DETERMINE LESS
>> LOADED AT THE MOMENT SERVER>>>
>> die($less_loaded_server_ip);
>>
>>
>> All Media Servers should provide information about their current load into
>> one common database (dedicated server or routing server can be used for
>> database).
>> If you use scripts you can update this table on starting a call and after
>> call finished.
>> Or you can create a job that will query FreeSWITCH and will update the
>> database every, say, 10 seconds.
>>
>>
>> Basically that's all (really!)
>> I beleive it can be used for most general purpose scenarios without need
>> of third-party tools.
>>
>> P.S.
>> The only problem we had from the beginning was that RTP media traffic was
>> passing thru both servers: RS and Media Server.
>> But after we added the following command to the routing script, RTP media
>> traffic started to pass only thru Media server, making RS almost free.
>> session:setVariable("bypass_media", "true");
>>
>>
>>
> anyhow it is a good start ... with a custom module for media server
> "kepalive" and resource migration it could be a great solution.
>
>
> T.
>
> _______________________________________________
> FreeSWITCH-users mailing list
> FreeSWITCH-users at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-users
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-users
> http://www.freeswitch.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-users/attachments/20100316/881e363a/attachment-0002.html 


More information about the FreeSWITCH-users mailing list