Hi Tihomir,<div>What do you mean by &quot;took from Mera&quot;? </div><div>If someone else already implemented this, could you please provide me a link?</div><div><br></div><div>This solution was invented by me personally, after looking into the following: <a href="http://wiki.freeswitch.org/wiki/SBC_Setup" target="_blank">http://wiki.freeswitch.org/wiki/SBC_Setup</a></div>
<div>They use <span class="Apple-style-span" style="font-family: sans-serif; font-size: 13px; line-height: 19px; ">Kamailio layer as routing, I decided that we can avoid this and use OOB things.</span></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 19px;"><br>
</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 19px;">Thanks for your reply, it can add more value to the solution.</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 19px;"><br>
</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 19px;">Regards,</span></font></div><div><font class="Apple-style-span" face="sans-serif"><span class="Apple-style-span" style="line-height: 19px;">vIT<br>
</span></font><br></div><div><br></div><div><br><div class="gmail_quote">2010/3/16 Tihomir Culjaga <span dir="ltr">&lt;<a href="mailto:tculjaga@gmail.com">tculjaga@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
this is something you took from Mera .. isn&#39;t it ? :)<br><br><br><br><div class="gmail_quote"><div class="im">On Tue, Mar 16, 2010 at 1:04 PM, Vitalii Colosov <span dir="ltr">&lt;<a href="mailto:vetali100@gmail.com" target="_blank">vetali100@gmail.com</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex"><div>Hi dear FS community,</div><div><br></div><div>After a brief analysis of 2 solutions using OpenSIPS and <span style="font-family:sans-serif;font-size:13px;line-height:19px">Kamailio </span>(<a href="http://www.opensips.org/html/docs/modules/devel/load_balancer.html#id226109" target="_blank">http://www.opensips.org/html/docs/modules/devel/load_balancer.html#id226109</a> ) and (<a href="http://wiki.freeswitch.org/wiki/SBC_Setup" target="_blank">http://wiki.freeswitch.org/wiki/SBC_Setup</a>) I decided to implement my own solution using ONLY FreeSWITCH and ONLY 1 table of any database server (we use MySQL).</div>


<div><br></div><div>It works on few of our servers right now without any issues.</div><div><br></div><div>Feel free to reuse / improve it or provide your comments if you see something wrong with it.</div><div><br></div><div>


<br></div><div>We have one routing server (RS) and several Media Servers (MS).</div><div>FreeSWITCH is installed on each server in default configuration.</div><div><br></div><div><span style="white-space:pre">        </span>--&gt; MS_1</div>


<div>RS  --&gt; MS_2</div><div><span style="white-space:pre">        </span>--&gt; MS_N</div><div><br></div><div><br></div><div>(Failover can be implemented by adding one more routing server, but this is out of scope of current description).</div>

</blockquote></div><div><br>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 &quot;registered context&quot; distributed between both routing servers<br>

<br><br>So, i&#39;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.<br><br><br> </div><div class="im">
<blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex">

<div><br></div><div>Routing server routes calls to media servers based on logic that you can easily define.</div><div>(Generally speaking, Routing server can route part of the calls onto itself, but to simplify let&#39;s say that it will route only to Media Servers).</div>


<div><br></div></blockquote></div><div>you will be loosing calls on the on the MS if it goes down ... maybe there is a way to &quot;replace&quot; media resource for that calls and keep them going even after the MS went down.<br>

<br> </div><div class="im"><blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex"><div></div><div><br></div><div>Routing server is used to register subscribers (it will have directory files ./freeswitch/conf/directory/default/10001whatever.xml-99999whatever.xml).</div>

<div>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).</div>
<div><br></div></blockquote></div><div><br>consider ODBC in the core!<br> <br></div><div class="im"><blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex">
<div></div><div>
<br></div><div>The whole routing can be presented by the following chain:</div><div><br></div><div>Call arrives into Default context--&gt;RS default dialplan--&gt;Lua script--&gt;PHP script to get destination MEDIA SERVER IP--&gt;back to Lua script--&gt;Bridge &quot;sofia/external/&quot; to determined MS IP address--&gt;[Bridge to fail over media server, optionally]--&gt;End</div>


<div><br></div><div>Let&#39;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).</div><div><br></div><div><u>1. RS Dialplan: default.xml</u></div>


<div>&lt;include&gt;</div><div>        &lt;extension name=&quot;route&quot;&gt;</div><div>                &lt;condition field=&quot;destination_number&quot; expression=&quot;^(00)(\d+)&quot;&gt;</div><div>                        &lt;action application=&quot;lua&quot; data=&quot;route.lua $2&quot;/&gt;</div>


<div>                &lt;/condition&gt;</div><div>        &lt;/extension&gt;        </div><div>&lt;/include&gt;        </div><div><br></div><div><br></div><div><u>2. RS Lua script: route.lua</u></div><div>called_number = argv[1]; //without &quot;00&quot;</div>


<div>api = freeswitch.API();</div><div>server_ip_address = api:executeString(&quot;curl <a href="http://localhost/get_server_ip.php" target="_blank">http://localhost/get_server_ip.php</a>);</div><div>forwarding_session_string = &quot;sofia/external/&quot;..called_number..&quot;@&quot;..server_ip_address;</div>


<div>session:setVariable(&quot;bypass_media&quot;, &quot;true&quot;); //described below!!!</div><div>session:execute(&quot;bridge&quot;,forwarding_session_string);</div><div><br></div></blockquote></div><div><br>do your bridging in the dialplan not from a script... you will get better performances!<br>

<br><br> </div><div class="im"><blockquote class="gmail_quote" style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex"><div></div><div><u>3. PHP script: get_server_ip.php</u></div>
<div>&lt;&lt;&lt;  ANY PHP CODE THAT WILL QUERY COMMON DATABASE AND WILL DETERMINE LESS LOADED AT THE MOMENT SERVER&gt;&gt;&gt;</div><div>die($less_loaded_server_ip);</div><div><br></div><div><br></div><div>All Media Servers should provide information about their current load into one common database (dedicated server or routing server can be used for database).</div>


<div>If you use scripts you can update this table on starting a call and after call finished.</div><div>Or you can create a job that will query FreeSWITCH and will update the database every, say, 10 seconds.</div><div><br>


</div><div><br></div><div>Basically that&#39;s all (really!)</div><div>I beleive it can be used for most general purpose scenarios without need of third-party tools.</div><div><br></div><div>P.S. </div><div>The only problem we had from the beginning was that RTP media traffic was passing thru both servers: RS and Media Server.</div>


<div>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.</div><div>session:setVariable(&quot;bypass_media&quot;, &quot;true&quot;);</div>


<div><br></div><div><br></div></blockquote></div><div><br>anyhow it is a good start ... with a custom module for media server &quot;kepalive&quot; and resource migration it could be a great solution.<br><br></div></div><br>
T.<br>
<br>_______________________________________________<br>
FreeSWITCH-users mailing list<br>
<a href="mailto:FreeSWITCH-users@lists.freeswitch.org">FreeSWITCH-users@lists.freeswitch.org</a><br>
<a href="http://lists.freeswitch.org/mailman/listinfo/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/listinfo/freeswitch-users</a><br>
UNSUBSCRIBE:<a href="http://lists.freeswitch.org/mailman/options/freeswitch-users" target="_blank">http://lists.freeswitch.org/mailman/options/freeswitch-users</a><br>
<a href="http://www.freeswitch.org" target="_blank">http://www.freeswitch.org</a><br>
<br></blockquote></div><br></div>