[Asterisk-Users] Hypothetical : Working across multiple servers??

John Todd jtodd at loligo.com
Wed Oct 8 11:17:22 MST 2003


>Hypothetical question..
>
>Lets say there is a situation where you are using the highest 
>compression codecs for all extensions (I guess that would be G.729) 
>and the load on a single server is overpowering the most powerful 
>single processor(lets say SMP is not an option).. So two or more 
>servers are required..
>
>Or
>
>The situation is that you need fault tolerance so want to have two 
>Asterisk servers serving the same population of users and all users 
>are able to authenticate to both servers (I guess you simply copy 
>the same sip.conf to both servers for this) but you also want all 
>other extensions to be availible to all users irrespective of which 
>server they have connected to..
>
>I guess in a way it would be like an Asterisk cluster of some sort..
>
>What would the solution be? Has anyone got an install similar that 
>they would like to share how it was done?
>
>Later..

There are ugly hacks to get that working currently.  They involve 
using the "busy" +101 priority leaping to do really horrible, 
horrible things.  Failover or distributed load is not handled well by 
Asterisk at the application layer; best to handle it at the IP layer, 
and use a load-sharing device of some sort, and config each server 
exactly the same.

[daydreaming below]

I agree that there is currently lacking in Asterisk the support to 
handle "dynamic" extensions that appear and disappear based on 
registration functions.  This seems to be an unusual holdover from 
old telephony concepts where an extension is "attached" to one 
particular switch, and can't move between switches.  In our case, 
SIP/MGCP/H323/etc. clients are "attached" to certain Asterisk 
servers, and the dial plans to handle each of those extensions needs 
to be explicitly stated.  Bleh.

To do this "correctly" would require significant re-programming of 
the current dialplan to allow dynamic lists of extensions which were 
somehow associated with particular SIP/IAX/H323/etc. users.  Then, it 
would be a simple matter of using the "switch" statement to reference 
the contexts on the remote server.

Note that there would optimally be support for multiple references to 
the same number, such that multi-path ringing would happen.  This 
would allow for "closest answer" type calling (similar to they way 
that some BGP routes are announced from multiple locations - the 
"closest" announcement wins.)

Other problems: I am uncertain if the switch statement dynamically 
updates extension lists on remote servers.  In other words, if after 
you start up two Asterisk servers, and someone were to register 
themselves with a SIP client, is there any mechanism by which the 
remote servers would be able to know about the "new" number if a such 
a plan were implemented?

The example below are preliminary thoughts, but the more I think 
about it, the more I like this idea.  It's very flexible, supports 
multiple dialing authority realms with 'virtual' groups, and even may 
be totally generic across channel types if the standard string 
manipulation tricks were to be implemented in the search.

A user could register with server1 OR with server2, and they would 
get the call.  Each server would be configured almost identically 
(except for the "switch" line, and relevant settings in iax.conf for 
the other peer, which I do not include for brevity.)  In fact, the 
sip user could register with BOTH server1 and server2, and still get 
the call.  (No, this double-registry ability isn't a bug - this is a 
useful feature.  If you want to do account locking, that's a totally 
different story that should not be addressed in these parts of the 
dialplan.)


It might look something like this on each server:

; -------------------------
; extensions.conf snippet
;
[from-my-sip-phones]
include => all-sip
switch  => IAX2/server1:pennypriddy at server2/all-sip
;
exten => i,1,Answer
exten => i,2,Playback(user-not-logged-into-any-servers-now)
exten => i,3,Hangup
exten => h,1,Hangup
;
;
; The extension value ${company1-sip} is really an array of
;  values that represents any static hosts or
;  currently registered dynamic hosts within that
;  particular dynamicgroup name, as filled by the various
;  channel configuration files.
;  If user 2000  were currently registered, then ${company1-sip}
;  would  be expanded, a match would be found, and the
;  SIP call would be completed.
;
; Note that if the extension did not exist in the list, then
;  the call would never be passed in here, so there is no
;  need for an "i" extension in this context (it's handled
;  up in the [from-my-sip-phones] context.
;
;
[all-sip]
exten => ${company1-sip},1,Dial(SIP/${EXTEN})
;
;
exten => h,1,Hangup
;

; -------------------------
; sip.conf snippet
;
;
; dynamicname should default to peer name if not specified (shown
;  in this example for clarity, even though set to the default value)
; dynamicname should support any valid string data
;
; dynamicgroup should default to channel type (sip, mgcp, h323, etc.)
;   if not specified (exten => ${sip},1,Dial(SIP/${EXTEN})
; dynamicgroup should support any valid string data
;
; Neither dynamicgroup nor dynamicname are configured if the
;  SIP device was not registered, or had an invalid "qualify"
;  result (if static.)  Static hosts with no qualify= tests
;  would always appear in the array.
;
;
[2000]
type=friend
username=2000
secret=nomatterwhereyougo
host=dynamic
context=from-my-sip-phones
canreinvite=yes
nat=1
dynamicgroup=company1-sip
dynamicname=2000

[2001]
type=friend
username=2001
secret=notmyplanetmonkeyboy
host=dynamic
context=from-my-sip-phones
canreinvite=yes
nat=1
dynamicgroup=company1-sip
dynamicname=2001

; end sip.conf snippet


JT



More information about the asterisk-users mailing list