[Freeswitch-users] Clustering FreeSWITCH

Gabriel Kuri gkuri at ieee.org
Wed Oct 29 21:15:40 PDT 2008


I'll chime in since I'm currently in the process of building a very
similar environment...

I currently have two FS boxes using xml_curl for configuration,
dialplan, and directory data. All sip session info and voicemail data is
stored in the mysql db which is on two multi-master mysql boxes. The two
mysql boxes are in no way clustered, but the DNS A record round robins
between them so generally the FS servers are load balancing their
traffic between the two.. xml_curl pulls its data from the mysql db as
well, so this way I could theoretically add as many FS boxes as I want,
since they will all go back to the db for directory, configuration,
dialplan, voicemail, sip registration data, etc.

The UAs register directly with the FS boxes using DNS SRV and NAPTR
records. As Brian already pointed out, SRV/NAPTR is the best way to go.

Regarding your point of dealing with UAs sitting behind a NAT
firewall/router and registered to any one of your many FS boxes, unless
you have a single proxy for all your UAs, you need to bridge the call to
the FS server the UA is registered with to get through the UA's firewall.

I'm dealing with this in my dialplan through xml_curl. If a call comes
in for a UA, the xml_curl module looks up in the sip_registrations table
the location(s) of the FS server the user is registered with and if
necessary, bridges the call to the appropriate FS server(s). Those
servers in turn look up the user location, realize the user is
registered locally, and generates a ${sofia_contact(user%domain.com
<mailto:user at domain.com>)}to bridge the call to the one or many
registrations. With UAs behind NAT/firewall routers, I think this is the
only way to do it unless you want a SIP proxy sitting in front of your
FS boxes with a single IP dealing with the UAs.

While this environment isn't completely fault tolerant, I think it's
easily scaled, as you can add more FS boxes with very little
configuration effort since everything goes back to the db.

If you'd like some help putting together the wiki, contact me offline,
I'm more than willing to help.

Now if we could only purchase g.729 licenses for transcoding in FS, that
would solve a huge headache for me :) ...


Marc Lewis wrote:
> I actually spent a big chunk of today doing various tests. Freeswitch
> is doing all the right things in this scenario. The problem actually
> turns out to be my router/firewall that I'm testing behind. When the
> phones register, it only opens up the port back from the IP address of
> the server it registers to, so when the secondary server tries to send
> the invite, the router blocks it. In case anyone is curious, the
> router/firewall is a Linux box running Arno's Firewall. I'll be doing
> more tests with different routers to see which ones work and which
> ones don't. I'll post my results on the wiki page that I'll be
> creating that covers the setup I've got.
> For your other points, I'll take them (at least a few of them) one by one.
> 1. I'm doing this already to an extent. My "fs1" box is using a
> floating IP address and is being monitored using Redhat's cluster
> suite. If that box goes down, the IP's migrate to a backup machine
> that contains identical copies of the configurations and access to the
> shared storage. While not a load balancer, this keeps the primary
> switch up (except for the wedges that I've been experiencing that I
> talk about in another thread).
> The failover switch, my "fs2" box, is running on in a Xen guest
> machine on another server.
> 2. Freeswitch can't do what you describe. I believe that it does have
> the architecture for it, though, and it will just be a SMOP(tm)
> (Simple Matter Of Programming). Once Freeswitch matures a bit more I
> expect we'll be seeing all sorts of enterprise solutions for it.
> 3. True. Unless you control everything end to end like Cisco's Call
> Manager, you have to deal with what's out there, so you work up
> solutions like the one I've described.
> 4. Brian followed up on this point, and he said it better than I could.
> 5. I do agree that conferencing needs to be a bit more robust in a
> clustered environment. However, there is already a lot of that can be
> done to make Freeswitch scale by having multiple boxes and putting
> different conferences on different servers. Using xml_curl, you can
> write a back-end application that easily routes conferences to
> multiple different boxes to allow some form of load balancing.
> 6. I'm not nearly as worried about current calls dropping in the case
> of a failure as I am about new calls being routed and phones being
> registered. It would be nice in the case of a failure to not have
> calls drop, but not a requirement for me.
> 7. Carrierroute works extremely well for me in my environment. It
> allows me to have great control with least cost routing as well as
> have automatic redundant gateways both in and out. It also supports
> the shared database model for building in my own redundancies. The
> only thing that I don't like about it is that I can't selectively
> handle the media path. With my CR setup it doesn't touch any media at
> all. That has caused me some issues with one or two of my carriers,
> but nothing that was insurmountable. The ones I've had problems with
> expect you to be running a b2bua and have media come from the same IP
> as the SIP messages. For that reason alone I may end up replacing
> OpenSER with Freeswitch at some point in the future and selectively
> bypass media, but only if I can get a configuration as efficient as my
> CR setup. If not, I'll just add a second Freeswitch gateway that talks
> only to those certain providers. Not ideal, but it works.
> I will be starting a wiki page about everything I've setup within the
> next couple days.
> - Marc
> Yuval Hertzog wrote:
>> I assume the problem you asked about it happening because the client
>> is disregarding the INVITE from a server with an IP address it was
>> not registered to. If you try to capture the packets going out of
>> your FS (or packets coming in your phone client), I bet you'll see
>> the INVITE request, but no activity thereafter.
>> I believe that when considering High-Availability for FreeSWITCH,
>> these issues need to be addressed:
>> 1. A shared/floating IP clustering solution such as a load-balancer
>> will only work if the SOFIA hash table is shared between all
>> servers. I don’t know if FreeSWITCH entire state is being held in
>> the database or whether some elements are being held in memory.
>> 2. FreeSWITCH needs to have shared-bus architecture to allow for a
>> fully clustered solution. Currently, I don’t think that two parked
>> channels on different cluster nodes can be bridged in the current
>> architecture because there’s no inter-cluster media switching
>> protocol that I know of.
>> 3. A Meshed server approach where different clients are registered to
>> different nodes (like the Cisco Call Manager architecture) seems to
>> be the only immediate option but it is problematic as it requires the
>> client to be configured with a list of redundant servers and most
>> clients don’t have that functionality.
>> 4. I would strongly recommend reconsidering the use of any DNS
>> feature (such as SRV records) when deploying a telephony
>> infrastructure. Of course, it all depends what this deployment is
>> for. DNS is commonly used in the ITSP space due to the vast audience
>> but enterprises (all sized) are recommended to refrain adding DNS to
>> the list of point-of-failures in their telephony architectures.
>> 5. I believe the FreeSWITCH conferencing module needs to be adapted
>> to support clustering in order to scale over more than one server.
>> This is due to the same share-bus issue mentioned earlier.
>> 6. In a meshed servers architecture you will need to implement a
>> mechanism that will identify which node in the cluster “owns�
>> B-Leg, bridge the call to that node and in that node bridge the call
>> again to B-Leg. When you find a way to implement it (I believe
>> FreeSWITCH to have the tools to enable you to do it now), it would
>> solve your current issue.
>> 7. I still have doubts about using carrierroute module opposed to the
>> DISPATCHER module for inbound traffic, mainly because of the
>> registration issue, but I don’t have sufficient experience to
>> determine that.
>> Anyway, it’s very interesting and I definitely like to know how
>> you’re going with it.
>> *On Thu Oct 30 2:04 , "Anthony Minessale" sent:
>> *
>>     This all seems right and would make a great wiki page.
>>     What you have described *should* work.
>>     when a phone registers try doing
>>     sofia_contact <user at domain.com
>>     <javascript:top.opencompose('user at domain.com','','','')>>
>>     from the cli on each box and see what you get.
>>     you can also use this function in the dialpan
>>     ${sofia_contact(user at domain.com
>>     <javascript:top.opencompose('user at domain.com','','','')>)}
>>     check that they are both using the same domain name as the
>>     profile name
>>     or at least have an alais for it etc.
>>     if it's a bug i can fix it pretty fast as that is the intended
>>     behaviour
>>     perhaps you can join irc and get us in the box(s) to have a look
>>     at it as we
>>     do not have that situation labbed up anywhere.
>>     On Tue, Oct 28, 2008 at 6:41 PM, Marc Lewis <marc at avvatel.com
>>     <javascript:top.opencompose('marc at avvatel.com','','','')>> wrote:
>>         I am in the process of making my FreeSWITCH installation highly
>>         available and I'm running into a couple of snags that was
>>         hoping that
>>         someone may have some insight on.
>>         First, the setup as it is now.
>>         There are two installations of FS on two different servers,
>>         lets call
>>         them fs1 and fs2. They each pull their configurations, dialplan,
>>         directory and post CDR's all using mod_curl from a central
>>         web server.
>>         That part works great.
>>         Calls into and out of FS go through an OpenSER proxy set up using
>>         carrierroute. That part also works great for outbound calls
>>         to the
>>         PSTN. Inbound calls also come in through this OpenSER proxy
>>         and get
>>         routed to the primary switch fs1. That also works perfectly
>>         as long as
>>         its going to fs1.
>>         fs1 and fs2 are both setup to use an ODBC connection to store
>>         registrations. This is pointed to a MySQL database made highly
>>         available using the RedHat Cluster Suite on a shared fibre
>>         channel
>>         partition. fs1 and fs2 both share the same database.
>>         Voicemail storage
>>         on fs1 is directly mounted on a GFS2 partition, fs2 is
>>         mounting the
>>         shared storage from a different server via NFS for no single
>>         point of
>>         failure.
>>         For the phones, I have them setup to use SRV records and have
>>         fs1 at
>>         priority 10 and fs2 at priority 20 for acme.domain.com
>>         <http://acme.domain.com>. I've tested
>>         this and phones register to the correct server and the
>>         sip_registration
>>         table shows either fs1 or fs2 as the hostname as I would expect.
>>         Here is the problem. If user 100 at acme.domain.com
>>         <javascript:top.opencompose('100 at acme.domain.com','','','')>
>>         registers on fs2 and a
>>         call comes in from the OpenSER proxy to fs1, bridging the call to
>>         /sofia/internal/100%acme.domain.com <http://acme.domain.com>
>>         from fs1 doesn't ring the phone. Is
>>         there a difference between
>>         'sofia/internal/100%acme.domain.com <http://acme.domain.com>' and
>>         'user/100 at acme.domain.com
>>         <javascript:top.opencompose('100 at acme.domain.com','','','')>'?
>>         Calls out from either fs1 or fs2 routed to the proxy work
>>         fine, its just
>>         calls coming in from the proxy. If the call doesn't go to the
>>         switch
>>         the user is registered on, the user's phone doesn't ring. It
>>         still goes
>>         to voicemail, etc., so that part works.
>>         Is there a better way to cluster FreeSWITCH than DNS SRV
>>         records and a
>>         shared state database?
>>         Also, as a side note to Anthony, Brian, et al, if this is the
>>         best way,
>>         I'll be happy to write up a wiki page on how I have this
>>         setup with a
>>         lot more detail than this. I was not able to find much in the
>>         way of
>>         highly available configurations or cluster configurations, so
>>         I put
>>         together this system using information cobbled from the wiki,
>>         mailing
>>         list messages and lurking on IRC.
>>         Thanks.
>>         - Marc
>>         --
>>         Marc Lewis
>>         Avvatel Corporation
>>         _______________________________________________
>>         Freeswitch-users mailing list
>>         Freeswitch-users at lists.freeswitch.org
>>         <javascript:top.opencompose('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
>>     -- 
>>     Anthony Minessale II
>>     FreeSWITCH http://www.freeswitch.org/
>>     ClueCon http://www.cluecon.com/
>>     AIM: anthm
>>     MSN:anthony_minessale at hotmail.com
>>     <javascript:top.opencompose('MSN:anthony_minessale at hotmail.com','','','')>
>>     GTALK/JABBER/PAYPAL:anthony.minessale at gmail.com
>>     <javascript:top.opencompose('PAYPAL:anthony.minessale at gmail.com','','','')>
>>     IRC: irc.freenode.net <http://irc.freenode.net> #freeswitch
>>     FreeSWITCH Developer Conference
>>     sip:888 at conference.freeswitch.org
>>     <javascript:top.opencompose('sip:888 at conference.freeswitch.org','','','')>
>>     iax:guest at conference.freeswitch.org/888
>>     <http://iax:guest@conference.freeswitch.org/888>
>>     googletalk:conf+888 at conference.freeswitch.org
>>     <javascript:top.opencompose('googletalk:conf_PLUS_888 at conference.freeswitch.org','','','')>
>>     pstn:213-799-1400
>> ------------------------------------------------------------------------
>> _______________________________________________
>> 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
> -- 
> Marc Lewis
> Avvatel Corporation
> ------------------------------------------------------------------------
> _______________________________________________
> 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

More information about the FreeSWITCH-users mailing list