Multiple IAX2 Trunks Load Balancing

Home » Asterisk Users » Multiple IAX2 Trunks Load Balancing
Asterisk Users 8 Comments

Hi – I have 2 Asterisk servers connected using 05 IAX2 trunks. I want to load balance incoming calls over IAX2 trunks. If any trunk goes down the calls traffic will be shared with other available trunks. When it gets Up the script is supposed to perform as desired i.e in load balance mode.

Thanks in advance.

8 thoughts on - Multiple IAX2 Trunks Load Balancing

  • Hi,

    Generally, incoming traffic (http/mail/sip/vpn/etc) can easily spread with the random functions with iptables. Perhaps also have a look at:
    http://www.linuxvirtualserver.org/VS-NAT.html

    But i feel that might not work in this case, if all your trunk-connections are already up-and-running.

    If so, you might contemplate an alternative approach. It sounds that you want to do the load balancing trick upon the application layer (eg. within asterisk)

    Perhaps it is possible to do the L.B. at the O.S. or network level, and let all trunks appear to asterisk to one single trunk.

  • Hans said:

    Hi,

    Generally, incoming traffic (http/mail/sip/vpn/etc) can easily spread with the random functions with iptables. Perhaps also have a look at:
    http://www.linuxvirtualserver.org/VS-NAT.html

    But i feel that might not work in this case, if all your trunk-connections are already up-and-running.

    If so, you might contemplate an alternative approach. It sounds that you want to do the load balancing trick upon the application layer (eg. within asterisk)

    Perhaps it is possible to do the L.B. at the O.S. or network level, and let all trunks appear to asterisk to one single trunk.

    Don asks:

    What’s the value of load balancing multiple IAX trunks between the same system pair? What resources are being balanced?

    –Don

  • 1) It’s been said (but I’ve never experienced it) that IAX performs poorly at high channel levels. Something about all those packets being handled with a single socket (bound to port 4569). Maybe the OP is trying to distribute the load over a handful of sockets.

    2) Maybe the OP is trying to distribute the load over different physical media.

    3) Maybe the OP is just trying to develop a load balancing methodology.

    Multiple trunks between the same pair of hosts does seem odd.

  • ++++++++++

    Perhaps the O.P. can explain about his intentions…

    In some situations it makes sense though:
    If you have to connect two servers, and use different kind of infrastructure / multiple providers…

    hw

  • Friends let me define the scenario please;
    Scenario:
    2 asterisk servers (A & B) are connected using 05 IAX2 trunks between them. The machine A is running asterisk & Openvpn server in TUN mode (5 instances with difference IP addresses for clients). The machine B is running asterisk with 05 OpenVPN clients using 05 bandwidths. The IAX trunks are established between each pair of P-2-P ip address of machine A (The OPENVPN
    Server) & machine B (The Openvpn client). Requirement:
    Required dial plan configuration at machine A for incoming calls from VoIP
    Switch/VOS which can forward the calls to IAX2 trunks in round robin fashion like Load Balancing. If any trunk goes down it starts forwarding the traffic to other available trunks & when it gets UP the dialplan should perform as desired. Like L.B & Fail-over scenarios.

  • Are you looking for something like this?

    Note: This will continuously go between the two trunks until the caller hangs up, can be fixed by adding loop counter.

    ;
    ; extensions.conf
    ;
    [LOADBALANCE]
    exten => _X.,1,NoOp(Connect to least used trunk)
    ; – show active count exten => _X.,n,NoOp(Calls:
    ${GROUP_COUNT(TRUNK01CNT)}/${GROUP_COUNT(TRUNK02CNT)} of
    ${MATH(${GROUP_COUNT(TRUNK01CNT)}+${GROUP_COUNT(TRUNK02CNT)},int)})
    ; – goto least used trunk exten => _X.,n,GotoIf($[${GROUP_COUNT(TRUNK01CNT)} < ${GROUP_COUNT(TRUNK02CNT)}]?TRUNK02,${EXTEN},1:TRUNK01,${EXTEN},1) ; ; [TRUNK01] exten => _X.,1,NoOp(Using Trunk 01)
    ; – set trunk used counter exten => _X.,n,Set(GROUP()=TRUNK01CNT)
    ; – dial trunk exten => _X.,n,Dial(IAX/T01/${EXTEN})
    ; – add loop counter to stop infinite loop exten => _X.,n,NoOp(Use next TRUNK02is congestion or chanunavial)
    ; – next trunk if CONGESTION
    exten => _X.,n,GotoIf($[“${DIALSTATUS}”=”CONGESTION”]?TRUNK02,${EXTEN},1)
    ; – next trunk if CHANUNAVAIL
    exten => _X.,n,GotoIf($[“${DIALSTATUS}”=”CHANUNAVAIL”]?TRUNK02,${EXTEN},1)
    exten => _X.,n,Hangup()
    ;
    ;
    [TRUNK02]
    ; – same as above exten => _X.,1,NoOp(Using Trunk 02)
    exten => _X.,n,Set(GROUP()=TRUNK02CNT)
    exten => _X.,n,Dial(IAX/T02/${EXTEN})
    exten => _X.,n,NoOp(Use next TRUNK01is congestion or chanunavial)
    exten => _X.,n,GotoIf($[“${DIALSTATUS}”=”CONGESTION”]?TRUNK01,${EXTEN},1)
    exten => _X.,n,GotoIf($[“${DIALSTATUS}”=”CHANUNAVAIL”]?TRUNK01,${EXTEN},1)
    exten => _X.,n,Hangup()
    ;
    ; – end