Skip to main content

On This Page

Implementing High-Availability SIP Trunking for ViciDial

2 min read
Share

These articles are AI-generated summaries. Please check the original sources for full details.

SIP Trunk Failover & Load Balancing for ViciDial

ViciDial environments often rely on sequential trunk assignment which creates a critical single point of failure. This implementation guide details how to utilize Asterisk 16.x or 18.x to achieve automated multi-trunk redundancy.

Why This Matters

In production call centers, a single carrier outage can halt operations entirely if trunks are assigned sequentially without native intelligence. Technical reality necessitates shifting from manual carrier management to active-active load balancing where health monitoring scripts and intelligent dialplans dynamically reroute traffic based on real-time SIP peer availability to maintain persistent connectivity.

Key Insights

  • ViciDial 2.14.1 or later is mandatory for advanced failover as earlier versions lack native multi-trunk intelligence.
  • SIP health monitoring via ‘qualify=yes’ allows Asterisk to detect carrier status every 60 seconds by default.
  • Active-active load balancing utilizes the Asterisk Database (ASTDB) to track call counts and distribute traffic via modulo arithmetic.
  • Automated health check scripts running via cron can update the vicidial_carrier_log every 5 minutes to toggle trunk status.
  • Weighted load balancing allows for asymmetric traffic distribution, enabling a 70/30 split between high and low capacity providers.

Working Examples

Active-Active round-robin dialplan using Asterisk DB to alternate between two SIP trunks.

[outbound-active-active]
exten => _1NXXNXXXXXX,1,NoOp(Active-Active Load Balance)
exten => _1NXXNXXXXXX,n,Set(CALL_COUNT=${EVAL(${ASTDB(vicidial,call_index)} + 1)})
exten => _1NXXNXXXXXX,n,Set(ASTDB(vicidial,call_index)=${CALL_COUNT})
exten => _1NXXNXXXXXX,n,GotoIf($[${MATH(${CALL_COUNT} % 2)}=0]?try1:try2)
exten => _1NXXNXXXXXX,n(try1),Dial(SIP/${EXTEN}@trunk1)
exten => _1NXXNXXXXXX,n,GotoIf($["${DIALSTATUS}"="ANSWER"]?end:try2)
exten => _1NXXNXXXXXX,n(try2),Dial(SIP/${EXTEN}@trunk2)
exten => _1NXXNXXXXXX,n(end),Hangup()

Bash script for real-time trunk health monitoring and ViciDial database updates.

#!/bin/bash
TRUNK1_STATUS=$(asterisk -rx "sip show peer trunk1" 2>/dev/null | grep "Status" | awk '{print $3}')
if [ "$TRUNK1_STATUS" = "OK" ]; then
  mysql -u root -p$DB_PASS asterisk -e "UPDATE vicidial_carrier_log SET active='Y' WHERE carrier_id='1';"
else
  mysql -u root -p$DB_PASS asterisk -e "UPDATE vicidial_carrier_log SET active='N' WHERE carrier_id='1';"
fi

Practical Applications

  • Use Case: Multi-carrier redundancy ensures outbound campaigns automatically reroute to a secondary provider if the primary peer becomes UNREACHABLE. Pitfall: Setting qualifyfreq too high, leading to significant detection lag during provider outages.
  • Use Case: Weighted load balancing for asymmetric trunk capacities. Pitfall: Failing to set concurrent call limits in ViciDial Admin, which can lead to provider-side congestion and dropped calls.
  • Use Case: Automated carrier management via cron. Pitfall: Hard-coding MySQL passwords in scripts without proper file permissions (chmod 600), creating a security vulnerability.

References:

Continue reading

Next article

Mastering Tool Calling for Production AI Agents: A Technical Roadmap

Related Content