مجله ایرانیکاسرورآموزش سرور، هاست، وردپرس و شبکه
آموزشی

ساخت زیرساخت VoIP پایدار با OpenSIPS؛ چند PBX، Load Balancing و Failover

OpenSIPS یک SIP Server متن‌باز و بسیار سبک است که می‌تواند جلوی چند Asterisk، FreeSWITCH یا PBX دیگر قرار بگیرد و تماس‌ها را بین آن‌ها توزیع کند؛ بدون اینکه کاربر یا SIP Provider لازم…

ساخت زیرساخت VoIP پایدار با OpenSIPS؛ چند PBX، Load Balancing و Failover
خلاصه سریع این آموزش

OpenSIPS یک SIP Server متن‌باز و بسیار سبک است که می‌تواند جلوی چند Asterisk، FreeSWITCH یا PBX دیگر قرار بگیرد و تماس‌ها را بین آن‌ها توزیع کند؛ بدون اینکه کاربر…

۲۲ دقیقه مطالعه ۰ دیدگاه ۲۵ مهر ۱۴۰۵ آخرین به‌روزرسانی
OpenSIPS یک SIP Server متن‌باز و بسیار سبک است که می‌تواند جلوی چند Asterisk، FreeSWITCH یا PBX دیگر قرار بگیرد و تماس‌ها را بین آن‌ها توزیع کند؛ بدون اینکه کاربر یا SIP Provider لازم باشد از تعداد Backendهای شما اطلاع داشته باشد.اگر فقط یک PBX دارید، معمولاً نیازی به OpenSIPS نیست. اما وقتی تعداد تماس‌ها بالا می‌رود، چند PBX دارید، می‌خواهید Node خراب به‌صورت خودکار از مدار خارج شود یا ظرفیت سرورها با هم یکسان نیست، OpenSIPS می‌تواند به لایه SIP Edge و Load Balancer معماری تبدیل شود.در این آموزش تفاوت Dispatcher و Load Balancer را دقیق بررسی می‌کنیم، یک Pool از چند PBX می‌سازیم، Health Check با SIP OPTIONS را فعال می‌کنیم، Failover تماس را طراحی می‌کنیم، توضیح می‌دهیم Dialog State چگونه روی انتخاب Backend اثر دارد و در پایان مشخص می‌کنیم RTPEngine چه زمانی باید وارد مسیر RTP شود.

نسخه مبنا: این مقاله بر اساس OpenSIPS 4.0 نوشته شده است. در زمان بررسی، نسخه 4.0.2 جدیدترین Release شاخه Stable و نسخه 3.6.9 آخرین شاخه LTS پشتیبانی‌شده است.

فهرست مطالب

OpenSIPS دقیقاً چیست؟

OpenSIPS در اصل یک موتور SIP Signaling است.

یعنی Messageهایی مثل:

🔹 REGISTER

🔹 INVITE

🔹 ACK

🔹 BYE

🔹 CANCEL

🔹 OPTIONS

🔹 SUBSCRIBE

🔹 NOTIFY

را دریافت، بررسی و Route می‌کند.

برخلاف Asterisk، کار اصلی OpenSIPS پخش Music on Hold، اجرای IVR یا Mix کردن Conference نیست.

OpenSIPS بیشتر نقش:

مسیر‌یاب SIP، Registrar، Load Balancer و Edge Proxy

را دارد.

OpenSIPS جای PBX را می‌گیرد؟

معمولاً خیر.

در معماری این مقاله:

OpenSIPS: SIP Routing، Load Balancing، Health Check، Failover و Edge Security

Asterisk/FreeSWITCH: Dialplan، IVR، Queue، Recording، Voicemail و Media Application

را انجام می‌دهند.

معماری هدف ما

فرض کنیم سه PBX داریم:

PBX-01   10.20.0.11:5060
PBX-02   10.20.0.12:5060
PBX-03   10.20.0.13:5060

کاربران و Carrier فقط این آدرس را می‌بینند:

sip.example.com
        |
        v
    OpenSIPS
     /  |  \
    /   |   \
 PBX1 PBX2 PBX3

چرا این معماری بهتر از اتصال مستقیم به PBX است؟

اگر کاربران مستقیماً به یک PBX متصل باشند، ظرفیت و خرابی همان Node مستقیماً روی کاربران اثر می‌گذارد.

با OpenSIPS می‌توانید:

🔹 تماس‌های جدید را بین چند PBX تقسیم کنید.

🔹 Node خراب را از Pool خارج کنید.

🔹 Node تعمیرشده را خودکار به Pool برگردانید.

🔹 ظرفیت متفاوت هر PBX را در نظر بگیرید.

🔹 IPهای Backend را از Internet جدا نگه دارید.

🔹 Media Layer را جداگانه با RTPEngine کنترل کنید.

Dispatcher یا Load Balancer؟

این دو Module در OpenSIPS یک کار یکسان انجام نمی‌دهند.

Dispatcher چگونه کار می‌کند؟

Dispatcher مقصد را از بین یک Destination Set انتخاب می‌کند.

انتخاب می‌تواند بر اساس:

🔹 Hash

🔹 Weight

🔹 Request Attribute

باشد.

اما Dispatcher در حالت پایه نمی‌داند PBX انتخاب‌شده الآن چند تماس فعال دارد.

بنابراین ممکن است Traffic را از نظر تعداد INVITE تقریباً مساوی پخش کند ولی Load واقعی سرورها برابر نباشد.

یک مثال از مشکل Dispatcher

فرض کنید:

PBX-01 → 100 تماس دو دقیقه‌ای
PBX-02 → 100 تماس بیست دقیقه‌ای

از نظر تعداد Call Attempt ممکن است هر دو مساوی باشند.

اما چند دقیقه بعد:

PBX-01 تقریباً خالی شده است، در حالی که PBX-02 هنوز بیشتر تماس‌های خود را نگه داشته است.

Dispatcher به‌تنهایی الزاماً این تفاوت را نمی‌بیند.

Load Balancer چه تفاوتی دارد؟

ماژول `load_balancer` وضعیت تماس‌های فعال را نگه می‌دارد.

OpenSIPS برای هر Destination ظرفیت تعریف‌شده را می‌داند و مقدار ظرفیت باقی‌مانده را هنگام انتخاب Backend لحاظ می‌کند.

یعنی اگر:

PBX-01 ظرفیت 200 Call
PBX-02 ظرفیت 100 Call
PBX-03 ظرفیت 50 Call

داشته باشند، Load Balancer الزاماً تماس‌ها را 33/33/33 تقسیم نمی‌کند.

Load Balancer چگونه Load را می‌فهمد؟

ماژول Load Balancer از Dialog Tracking استفاده می‌کند.

هنگامی که:

lb_start()

اجرا می‌شود، OpenSIPS تماس را برای Load Balancer دنبال می‌کند.

زمانی که Dialog تمام شود، Resource رزروشده آزاد می‌شود.

Resource در Load Balancer یعنی چه؟

Resource فقط «Call» نیست.

می‌توانید انواع Capacity تعریف کنید.

مثلاً یک Backend ممکن است:

calls=200
transcoding=40
conference=20

ظرفیت داشته باشد.

در نتیجه تماس نیازمند Transcoding را می‌توانید فقط به Nodeهایی بفرستید که Resource مربوطه دارند.

برای سه PBX معمولی چه Resourceای تعریف کنیم؟

اگر همه PBXها یک کار انجام می‌دهند، می‌توانید Resource ساده‌ای مثل:

voice=200

استفاده کنید.

نمونه Pool ما

Backend آدرس ظرفیت Voice Health Check
PBX-01 sip:10.20.0.11:5060 200 دائم
PBX-02 sip:10.20.0.12:5060 120 دائم
PBX-03 sip:10.20.0.13:5060 80 دائم

OpenSIPS 4.0 را روی چه سیستم‌عاملی نصب کنیم؟

Repository رسمی فعلی OpenSIPS برای OpenSIPS 4.0 و 3.6 روی Debian Bookworm و Trixie و چند نسخه Ubuntu Package ارائه می‌کند.

برای این آموزش از:

Debian 12 Bookworm

استفاده می‌کنیم.

مرحله ۱: Repository رسمی OpenSIPS را اضافه کنید

ابتدا ابزارهای پایه:

apt-get update
apt-get install -y ca-certificates curl gnupg lsb-release mariadb-server

Repository Key:

curl https://apt.opensips.org/opensips-org.gpg \
-o /usr/share/keyrings/opensips-org.gpg

Repository شاخه 4.0 Stable

. /etc/os-release

echo "deb [signed-by=/usr/share/keyrings/opensips-org.gpg] https://apt.opensips.org ${VERSION_CODENAME} 4.0-releases" \
> /etc/apt/sources.list.d/opensips.list

OpenSIPS را نصب کنید

apt-get update
apt-get install -y opensips opensips-cli \
opensips-mysql-module opensips-mysql-dbschema

نسخه را بررسی کنید

opensips -V

مرحله ۲: قبل از Load Balancing شبکه PBXها را درست کنید

بهترین حالت این است که PBXهای Backend روی شبکه Private باشند.

مثلاً:

OpenSIPS: 10.20.0.5
PBX-01:   10.20.0.11
PBX-02:   10.20.0.12
PBX-03:   10.20.0.13

و فقط OpenSIPS Public IP داشته باشد.

Backendها را مستقیم روی اینترنت باز نکنید

اگر SIP ورودی همیشه باید از OpenSIPS بیاید، Firewall هر PBX را طوری تنظیم کنید که SIP فقط از IPهای OpenSIPS مجاز باشد.

این کار باعث می‌شود Botها نتوانند مستقیم Registration یا INVITE به PBX بفرستند.

مرحله ۳: Database را برای OpenSIPS آماده کنید

Load Balancer Destinationها را معمولاً از جدول Database می‌خواند.

جدول `load_balancer` شامل فیلدهای مهم زیر است:

فیلد کاربرد
group_id گروه Destinationها
dst_uri SIP URI سرور مقصد
resources ظرفیت Resourceهای Backend
probe_mode نوع Health Check
attrs Metadata اختیاری
description توضیح Node

نمونه Destination برای سه PBX

ساختار منطقی جدول می‌تواند چنین باشد:

group_id | dst_uri              | resources | probe_mode
1        | sip:10.20.0.11:5060  | voice=200 | 2
1        | sip:10.20.0.12:5060  | voice=120 | 2
1        | sip:10.20.0.13:5060  | voice=80  | 2

`probe_mode=2` یعنی Destination حتی در حالت سالم هم دائماً Probe می‌شود.

probe_mode چه حالت‌هایی دارد؟

در OpenSIPS سه Mode اصلی داریم:

0: هیچ Probing انجام نشود.

1: فقط وقتی Destination Disabled است Probe شود تا در صورت بازگشت دوباره فعال شود.

2: همیشه Probe شود.

برای PBX Pool تولیدی، Mode 2 معمولاً برای Health Visibility بهتر است؛ البته باید Backend به OPTIONS درست پاسخ دهد.

مرحله ۴: Moduleهای لازم را فعال کنید

در:

/etc/opensips/opensips.cfg

حداقل Moduleهای مرتبط را Load کنید:

loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "dialog.so"
loadmodule "db_mysql.so"
loadmodule "load_balancer.so"

Database URL را تنظیم کنید

modparam("load_balancer", "db_url",
"mysql://opensips:STRONG_DB_PASSWORD@127.0.0.1/opensips")

Credential نمونه را با مقدار واقعی و امن جایگزین کنید.

Health Check با OPTIONS

OpenSIPS به‌صورت پیش‌فرض می‌تواند SIP OPTIONS برای Probing بفرستد.

مثلاً:

modparam("load_balancer", "probing_interval", 10)
modparam("load_balancer", "probing_method", "OPTIONS")

Default مستند `probing_interval` برابر 30 ثانیه است؛ در مثال ما آن را روی 10 ثانیه قرار داده‌ایم تا Recovery سریع‌تر دیده شود.

Interval خیلی کوتاه هم همیشه بهتر نیست

اگر 100 Backend داشته باشید و هر ثانیه Probe بفرستید، Health Check خودش Traffic اضافه تولید می‌کند.

Interval را بر اساس:

🔹 تعداد Backend

🔹 Recovery Time مورد انتظار

🔹 ظرفیت شبکه

انتخاب کنید.

مرحله ۵: تماس جدید را با lb_start به Backend بفرستید

یک Route ساده می‌تواند چنین باشد:

if (is_method("INVITE") && !has_totag()) {

    record_route();

    if (!lb_start(1, "voice")) {
        send_reply(503, "No PBX Capacity");
        exit;
    }

    t_on_failure("PBX_FAILOVER");

    if (!t_relay()) {
        send_reply(500, "Relay Failed");
    }

    exit;
}

`lb_start(1, “voice”)` از Group شماره 1 Destinationی را انتخاب می‌کند که Resource `voice` داشته باشد و بیشترین ظرفیت مناسب باقی‌مانده را ارائه دهد.

$du چه می‌شود؟

Load Balancer آدرس Backend انتخاب‌شده را در Destination URI قرار می‌دهد.

یعنی OpenSIPS مشخص می‌کند Request باید به کدام PBX Relay شود.

Dialog Tracking چه زمانی شروع می‌شود؟

در Load Balancing، OpenSIPS برای آن تماس Dialog State ایجاد می‌کند تا Resource مصرف‌شده در طول Call دنبال شود.

با پایان Call، Resource آزاد می‌شود.

چرا BYE مهم است؟

اگر تماس معمولی با BYE تمام شود، Dialog به‌درستی Closed می‌شود.

اما اگر Endpoint یا Network ناگهان از بین برود و BYE نرسد، Dialog تا Timeout باقی می‌ماند.

برای همین Dialog Timeout باید با نوع تماس‌های واقعی شما متناسب باشد.

اگر Dialog State خراب باشد Load هم اشتباه می‌شود

فرض کنید OpenSIPS تصور کند PBX-01 هنوز 100 Call فعال دارد، در حالی که Asterisk Restart شده و همه تماس‌ها از بین رفته‌اند.

Load Balancer ممکن است مدتی ظرفیت آن Node را کمتر از واقعیت در نظر بگیرد.

پس Dialog State و Recovery در معماری HA مهم‌اند.

مرحله ۶: Failover را با lb_next بسازید

اگر Backend اول پاسخ نداد، Destination بعدی را امتحان می‌کنیم.

failure_route[PBX_FAILOVER] {

    if (t_was_cancelled()) {
        exit;
    }

    if (t_check_status("408|500|502|503|504")) {

        if (lb_next()) {
            t_on_failure("PBX_FAILOVER");
            t_relay();
            exit;
        }
    }
}

آیا هر 5xx یعنی Backend خراب است؟

نه.

این نکته مهم است.

برای مثال 503 ممکن است معنی «ظرفیت سرویس کامل است» بدهد، نه اینکه PBX Offline باشد.

پس Failover روی 5xx قابل استفاده است، اما Disabled کردن کامل Node باید محتاطانه‌تر باشد.

چه زمانی Backend را Disabled کنیم؟

اگر:

🔹 Transport Timeout

🔹 Connection Failure

🔹 OPTIONS Failure پایدار

دارید، احتمال Down بودن Backend بالاتر است.

در این حالت می‌توانید از:

lb_disable_dst()

استفاده کنید.

Node Disabled چطور دوباره وارد Pool می‌شود؟

اگر `probe_mode` مناسب داشته باشد، OpenSIPS به Probe کردن ادامه می‌دهد.

وقتی OPTIONS دوباره پاسخ موفق دریافت کند، Node می‌تواند Auto Enable شود.

Health Check فقط Ping شبکه نیست

ICMP Ping ثابت نمی‌کند SIP Service روی Asterisk سالم است.

ممکن است Server Ping بدهد اما:

🔹 Asterisk متوقف شده باشد.

🔹 PJSIP Module Crash کرده باشد.

🔹 Port 5060 بسته شده باشد.

OPTIONS Health Check به Application نزدیک‌تر است.

اما OPTIONS هم کامل‌ترین Health Check نیست

ممکن است Asterisk OPTIONS را 200 OK بدهد ولی Database یا Dialplan Application مشکل داشته باشد.

برای سامانه‌های حساس بهتر است Infrastructure Monitoring جداگانه نیز داشته باشید.

وضعیت Load Balancer را در Runtime ببینید

با OpenSIPS CLI:

opensips-cli -x mi load_balancer:list

می‌توانید Destinationها و Load هر Resource را ببینید.

یک Destination را دستی Disable کنید

برای Maintenance:

opensips-cli -x mi load_balancer:status 2 0

در این مثال Destination ID شماره 2 Disabled می‌شود.

Maintenance درست: Drain سپس Restart

اگر PBX تماس فعال دارد، بهتر است:

مرحله ۱: از Load Balancer خارج شود.

مرحله ۲: تماس جدید به آن ارسال نشود.

مرحله ۳: تماس‌های فعال تمام شوند.

مرحله ۴: Upgrade یا Restart انجام شود.

این روش بسیار بهتر از Restart ناگهانی Node است.

Capacity یک Backend را در Runtime تغییر دهید

اگر منابع Server تغییر کرده‌اند، Module امکان Resize Resource را نیز دارد.

مثلاً می‌توانید Capacity `voice` یک Node را بدون طراحی دوباره کل Pool تغییر دهید.

Dispatcher چه زمانی بهتر است؟

با وجود مزایای Load Balancer، Dispatcher هنوز بسیار کاربردی است.

مثلاً برای:

🔹 توزیع ساده SIP Gatewayها

🔹 Hash ثابت User به Backend

🔹 Routing سبک Stateless

🔹 سناریویی که Load واقعی Backend اهمیت ندارد

Load Balancer چه زمانی بهتر است؟

وقتی:

🔹 تماس‌ها Duration متفاوت دارند.

🔹 ظرفیت PBXها یکسان نیست.

🔹 Nodeها Resourceهای متفاوت دارند.

🔹 می‌خواهید Call Capacity واقعی کنترل شود.

جدول مقایسه Dispatcher و Load Balancer

ویژگی Dispatcher Load Balancer
Routing ساده بله بله
Hash قوی تمرکز اصلی نیست
Weight بله Capacity محور
اطلاع از تماس فعال خیر در مدل پایه بله
Dialog Tracking الزامی نیست بخش اصلی
Resource Capacity خیر بله
Failover بله بله
Health Probe بله بله

Dialog State چرا در OpenSIPS مهم است؟

یک SIP Proxy می‌تواند Stateless باشد.

اما Load Balancing واقعی تماس نیاز دارد بداند:

این INVITE هنوز Call فعال دارد یا تمام شده است؟

برای همین Module `dialog` وارد معماری می‌شود.

Dialog Module چه اطلاعاتی نگه می‌دارد؟

از جمله:

🔹 Call-ID

🔹 Route State

🔹 Lifetime

🔹 Dialog Attributes

🔹 Profile Membership

اگر OpenSIPS Restart شود چه می‌شود؟

این موضوع به Persistency و Cluster Design شما بستگی دارد.

اگر Load Balancer فقط یک Node باشد و تمام Dialog State فقط در RAM باشد، Restart می‌تواند State تماس‌های موجود را از بین ببرد.

در معماری HA باید Dialog Replication را جدی بگیرید.

دو OpenSIPS برای High Availability

می‌توانید دو Edge Node داشته باشید:

             SIP Clients
                 |
            VIP / DNS SRV
              /     \
             /       \
     OpenSIPS-01   OpenSIPS-02
          \           /
           \         /
            PBX Pool

Clusterer چه نقشی دارد؟

Module `clusterer` به چند OpenSIPS اجازه می‌دهد State یا اطلاعات موردنیاز Moduleهای دیگر را بین Nodeها Share یا Replicate کنند.

Dialog Module نیز می‌تواند Dialogها را در Cluster Replicate کند.

Dialog Replication چه فایده‌ای دارد؟

اگر OpenSIPS-01 تماس را ایجاد کرده و OpenSIPS-02 برای Failover آماده است، داشتن Dialog State مشترک می‌تواند باعث شود Node دوم Context بیشتری از تماس داشته باشد.

البته این را نباید با «انتقال زنده RTP» اشتباه گرفت.

OpenSIPS خودش RTP عبور می‌دهد؟

به‌صورت پیش‌فرض خیر.

این یکی از مهم‌ترین نکات معماری است.

ممکن است SIP مسیر زیر را طی کند:

Phone → OpenSIPS → PBX

ولی Media:

Phone ↔ PBX

باشد.

پس Load Balancing SIP با Load Balancing RTP فرق دارد

اگر OpenSIPS تماس را به PBX-02 انتخاب کرد، SDP باید طوری تنظیم شود که RTP به Media Destination صحیح برسد.

اگر PBXها Public Reachability درست دارند، ممکن است نیازی به Media Relay نباشد.

RTPEngine چه زمانی وارد معماری می‌شود؟

وقتی می‌خواهید Media نیز از یک Layer کنترل‌شده عبور کند.

مثلاً:

🔹 Endpointها پشت NAT سخت هستند.

🔹 PBXها Private IP دارند.

🔹 نمی‌خواهید IP Backend داخل SDP دیده شود.

🔹 WebRTC و SIP معمولی را Bridge می‌کنید.

🔹 SRTP/RTP Interworking نیاز دارید.

معماری با RTPEngine

                 SIP
Phone -------- OpenSIPS -------- PBX
  \                               /
   \                             /
    +--------- RTPEngine --------+
               RTP

OpenSIPS چگونه RTPEngine را کنترل می‌کند؟

Module `rtpengine` SDP را به RTPEngine می‌دهد تا Media Address بازنویسی شود.

در مسیر INVITE معمولاً از:

rtpengine_offer()

و در پاسخ SDP:

rtpengine_answer()

یا Flowهای ساده‌تر با `rtpengine_manage()` استفاده می‌شود.

RTPEngine هم می‌تواند چند Node داشته باشد

Module OpenSIPS از چند RTPEngine و Setهای مختلف پشتیبانی می‌کند.

در نتیجه معماری بزرگ می‌تواند:

OpenSIPS Cluster
      |
PBX Pool
      |
RTPEngine Pool

داشته باشد.

RTPEngine را بی‌دلیل اضافه نکنید

اگر Media مستقیم به‌درستی کار می‌کند و نیازی به NAT Relay، Hiding یا Interworking ندارید، اضافه‌کردن Media Relay فقط Complexity و Bandwidth مصرفی را بیشتر می‌کند.

مالک Media Path را از ابتدا مشخص کنید.

OpenSIPS Load Balancing با FreeSWITCH هم کار می‌کند؟

بله.

Backend لزوماً Asterisk نیست.

OpenSIPS می‌تواند Destinationهایی از نوع:

🔹 Asterisk

🔹 FreeSWITCH

🔹 SBC

🔹 Gateway

🔹 Media Server

را Load Balance کند.

یک قابلیت جالب برای FreeSWITCH

Load Balancer OpenSIPS می‌تواند در برخی سناریوها Stats را از FreeSWITCH دریافت کند و ظرفیت را بر اساس اطلاعات واقعی FreeSWITCH به‌روز کند.

برای Asterisk معمولاً Capacity را خودتان تعریف و Dialog Load را OpenSIPS دنبال می‌کند.

امنیت OpenSIPS Load Balancer

وقتی OpenSIPS جلوی PBXها قرار می‌گیرد، خودش مستقیماً در معرض اینترنت قرار دارد.

بنابراین امنیت Edge باید جدی باشد.

Backend PBX را Private نگه دارید

اگر PBX هیچ دلیلی برای دریافت SIP مستقیم از اینترنت ندارد، Port SIP آن را فقط برای OpenSIPS باز کنید.

این مهم‌تر از مخفی‌کردن ساده IP در Headerهاست.

Carrierها را ACL کنید

اگر SIP Provider IPهای ثابت دارد، INVITEهای Trunk را فقط از همان Sourceها قبول کنید.

OpenSIPS Moduleهای ACL و Permissions برای این سناریوها دارد.

Rate Limiting را بر اساس Traffic واقعی تنظیم کنید

یک Carrier ممکن است در ساعت شلوغ 300 CPS داشته باشد.

عددی که برای دفتر 50 نفره Attack است، برای Carrier کاملاً طبیعی است.

Rate Limit را از Config اینترنتی Copy نکنید.

Topology Hiding

اگر نمی‌خواهید آدرس PBXها داخل Via، Record-Route یا Contact دیده شود، OpenSIPS قابلیت Topology Hiding دارد.

اما اگر SDP هنوز IP Backend را نشان دهد، Media Topology همچنان قابل مشاهده است.

برای مخفی‌کردن Media Layer معمولاً RTPEngine نیز وارد طراحی می‌شود.

OpenSIPS یا Kamailio؟

هر دو پروژه SIP Proxy بسیار قدرتمندی هستند و هر دو می‌توانند جلوی چند PBX قرار بگیرند.

تفاوت مهم در این مقاله این است که OpenSIPS یک Module اختصاصی Load Balancer دارد که به‌صورت مستقیم Call Capacity و Resourceهای Backend را دنبال می‌کند.

در Kamailio معمولاً Dispatcher و Logicهای مرتبط برای توزیع Backend بسیار پررنگ هستند.

انتخاب نهایی بیشتر به تجربه تیم، Moduleهای موردنیاز و معماری شما بستگی دارد.

Dispatcher OpenSIPS در چه سناریویی بهتر از Load Balancer است؟

اگر می‌خواهید User همیشه به یک Backend خاص Hash شود، Dispatcher می‌تواند مناسب‌تر باشد.

مثلاً Registrationهایی که State محلی دارند.

REGISTER را مثل INVITE Load Balance نکنید

اگر PBXها خودشان Registrar هستند، Round Robin ساده روی REGISTER می‌تواند State داخلی‌ها را بین Nodeها پخش کند.

مثلاً:

REGISTER 1 → PBX-01
REGISTER 2 → PBX-02
REGISTER 3 → PBX-03

و بعد INVITE ممکن است به Node دیگری برود.

برای Registration چه کار کنیم؟

سه انتخاب معمول داریم:

روش اول: OpenSIPS Registrar باشد.

روش دوم: Mid-Registrar استفاده شود.

روش سوم: REGISTER با Hash ثابت به PBX مشخص Route شود.

این تصمیم را جدا از Load Balancing تماس‌های جدید طراحی کنید.

Failover تماس فعال با تماس جدید فرق دارد

اگر PBX-02 قبل از Answer شدن INVITE Down شود، OpenSIPS می‌تواند Backend دیگری انتخاب کند.

اما اگر PBX-02 وسط تماس فعال Crash کند، معمولاً همان تماس از بین می‌رود.

Dialog Replication در OpenSIPS به معنی انتقال State داخلی Asterisk یا Media Session آن نیست.

High Availability واقعی چند لایه دارد

🔹 حداقل دو OpenSIPS

🔹 چند PBX Backend

🔹 Dialog/Cluster State مناسب

🔹 Database HA در صورت نیاز

🔹 RTPEngine HA در صورت استفاده

🔹 DNS/VIP/L4 Edge Failover

یک Load Balancer جلوی سه PBX هنوز HA کامل نیست

اگر فقط یک OpenSIPS داشته باشید، همان Node Single Point of Failure است.

پس بعد از Scale کردن PBXها، Edge Layer را نیز Redundant کنید.

Monitoring چه چیزهایی را باید ببیند؟

فقط Ping Server کافی نیست.

حداقل:

🔹 تعداد Dialog فعال

🔹 Load هر Destination

🔹 Health State هر PBX

🔹 408 و 5xx Rate

🔹 SIP CPS

🔹 CPU و RAM OpenSIPS

🔹 Backend CPU

🔹 RTPEngine Session در صورت استفاده

تست Failover واقعی

برای Production قبل از انتقال Trunk اصلی این Test Plan را اجرا کنید.

مرحله ۱: هر سه PBX Up باشند.

مرحله ۲: وضعیت آن‌ها را با `load_balancer:list` ببینید.

مرحله ۳: چند ده تماس هم‌زمان ایجاد کنید.

مرحله ۴: Distribution را بررسی کنید.

مرحله ۵: PBX-02 را Stop کنید.

مرحله ۶: ببینید Health Probe آن را Disabled می‌کند.

مرحله ۷: تماس جدید نباید به PBX-02 برود.

مرحله ۸: PBX-02 را برگردانید.

مرحله ۹: Auto-Reenable را بررسی کنید.

مرحله ۱۰: تماس فعال روی Node دیگر نباید تحت تأثیر قرار بگیرد.

Load Test با SIPp

برای تعداد تماس بالا بهتر است SIPp استفاده شود.

مثلاً Load را مرحله‌ای افزایش دهید:

10 CPS
25 CPS
50 CPS
100 CPS
200 CPS

در هر مرحله موارد زیر را ثبت کنید:

🔹 Call Setup Delay

🔹 4xx/5xx Rate

🔹 Load هر PBX

🔹 CPU

🔹 Dialog Count

Load Balancer ظرفیت را از کجا می‌فهمد؟

Capacity اولیه را شما تعریف می‌کنید.

مثلاً:

PBX-01 voice=200
PBX-02 voice=120
PBX-03 voice=80

این عدد نباید حدس زده شود.

Capacity را با Benchmark تعیین کنید

اگر PBX-01 در تست تا 500 Call زنده می‌ماند، لزوماً Capacity Production را 500 نگذارید.

Headroom برای:

🔹 Traffic Burst

🔹 Recording

🔹 Transcoding

🔹 Backup Task

🔹 Database Delay

در نظر بگیرید.

Resourceهای متفاوت برای Backendهای متفاوت

یکی از قابلیت‌های جذاب OpenSIPS این است که همه Nodeها لازم نیست دقیقاً یک کار انجام دهند.

مثلاً:

PBX-01:
voice=200;conference=20

PBX-02:
voice=150;transcoding=50

PBX-03:
voice=100;voicemail=100

سپس Call را بر اساس Resource موردنیاز Route کنید.

مثال تماس Conference

if (!lb_start(1, "voice;conference")) {
    send_reply(503, "Conference Capacity Full");
    exit;
}

OpenSIPS فقط Nodeهایی را در نظر می‌گیرد که هر دو Resource را داشته باشند.

اگر تمام Capacity پر شود چه می‌شود؟

`lb_start()` می‌تواند تشخیص دهد Destinationها Up هستند ولی Capacity آزاد ندارند.

در این حالت بهتر است به‌جای ارسال تماس به Node Overloaded، Policy مشخص داشته باشید.

مثلاً:

🔹 503 برگردانید.

🔹 Overflow Pool استفاده کنید.

🔹 تماس Priority را روی ظرفیت منفی مجاز کنید.

Overflow Pool

می‌توانید Group جدا داشته باشید:

Group 1 = Primary PBX
Group 2 = Overflow PBX

اگر Group اول Capacity نداشت، تماس‌های خاص به Group دوم ارسال شوند.

Call Load با CPU Load یکسان نیست

OpenSIPS ممکن است بداند Node 100 Call فعال دارد.

اما شاید 50 Call آن‌ها Transcoding سنگین داشته باشند.

پس Resource Design باید به Workload واقعی نزدیک باشد.

فقط `voice=500` همیشه بهترین مدل Capacity نیست.

Monitoring CPU Backend را هم نگه دارید

Load Balancer تماس را می‌شمارد؛ Infrastructure Monitoring باید CPU، RAM و I/O را نیز ببیند.

اگر Node از نظر Dialog ظرفیت دارد ولی CPU به 95 درصد رسیده، باید Alert داشته باشید.

OpenSIPS 4.0 یا 3.6 LTS؟

در حال حاضر هر دو Supported هستند.

4.0: Stable و نسل فعلی

3.6: Stable LTS

برای پروژه جدید، 4.0 منطقی است؛ برای محیطی که سیاست محافظه‌کارانه و چرخه پشتیبانی طولانی‌تر دارد، 3.6 LTS نیز گزینه معتبر است.

قبل از Upgrade نسخه Major چه کنیم؟

OpenSIPS Configuration Script و Moduleها بین Major Versionها می‌توانند تغییر داشته باشند.

پس:

Backup → Staging → Config Validation → Load Test → Production

را رعایت کنید.

Config را قبل از Restart بررسی کنید

برای جلوگیری از Down شدن Edge به‌خاطر Syntax Error:

opensips -C -f /etc/opensips/opensips.cfg

را قبل از Restart اجرا کنید.

اشتباه‌های رایج در OpenSIPS Load Balancing

اشتباه ۱: Dispatcher و Load Balancer را یکی فرض می‌کنیم.

اشتباه ۲: Capacity را بدون Benchmark وارد می‌کنیم.

اشتباه ۳: Health Check داریم ولی PBX به OPTIONS پاسخ نمی‌دهد.

اشتباه ۴: هر 5xx را نشانه Down بودن Node می‌دانیم.

اشتباه ۵: Dialog Timeout اشتباه باعث Load Ghost می‌شود.

اشتباه ۶: REGISTER را مثل INVITE بین PBXها پخش می‌کنیم.

اشتباه ۷: فکر می‌کنیم OpenSIPS خودش RTP را Proxy می‌کند.

اشتباه ۸: یک OpenSIPS جلوی چند PBX می‌گذاریم و Edge را SPOF می‌کنیم.

اشتباه ۹: Backendها همچنان از اینترنت مستقیم قابل دسترسی‌اند.

پرسش‌های رایج

OpenSIPS چیست؟

OpenSIPS یک SIP Server متن‌باز است که برای SIP Proxy، Registrar، Load Balancing، Routing، SBC و معماری‌های Carrier و Hosted PBX استفاده می‌شود.

آخرین نسخه OpenSIPS در اکتبر ۲۰۲۶ چیست؟

OpenSIPS 4.0.2 جدیدترین نسخه Stable فعلی است و OpenSIPS 3.6.9 نیز شاخه LTS پشتیبانی‌شده محسوب می‌شود.

Dispatcher و Load Balancer چه فرقی دارند؟

Dispatcher مقصد را با الگوریتم‌های Hash و Weight انتخاب می‌کند و الزاماً از تعداد تماس فعال Backend خبر ندارد؛ Load Balancer با Dialog State و Capacity تعریف‌شده، بار واقعی تماس‌ها را در انتخاب مقصد لحاظ می‌کند.

OpenSIPS چگونه PBX خراب را تشخیص می‌دهد؟

Load Balancer می‌تواند با SIP OPTIONS مقصدها را Probe کند. probe_mode تعیین می‌کند Health Check همیشه اجرا شود یا فقط روی Destination Disabled.

اگر PBX اول جواب ندهد تماس چه می‌شود؟

با failure_route و lb_next می‌توان Destination بعدی را انتخاب و INVITE را به PBX دیگری ارسال کرد.

آیا Failover تماس فعال ممکن است؟

Failover تماس جدید و INVITE قبل از Answer ساده‌تر است. اگر PBX وسط تماس فعال Crash کند، انتقال زنده همان تماس معمولاً ممکن نیست چون State و Media روی Backend بوده است.

OpenSIPS خودش RTP را عبور می‌دهد؟

به‌صورت پیش‌فرض خیر. OpenSIPS SIP Signaling را Route می‌کند. برای Media Relay می‌توان RTPEngine را اضافه کرد.

RTPEngine چه زمانی لازم است؟

برای NAT سخت، مخفی‌کردن Media IP، WebRTC، SRTP/RTP Interworking یا زمانی که PBXهای Backend Private هستند و Media باید از Relay کنترل‌شده عبور کند.

OpenSIPS Load Balancing برای FreeSWITCH هم کار می‌کند؟

بله. Destination می‌تواند Asterisk، FreeSWITCH، Gateway، SBC یا Media Server دیگری باشد.

برای چند PBX بهتر است Dispatcher استفاده کنیم یا Load Balancer؟

اگر هدف پخش ساده یا Hash ثابت است Dispatcher مناسب است؛ اگر ظرفیت PBXها متفاوت است و تعداد تماس فعال باید در تصمیم‌گیری لحاظ شود Load Balancer انتخاب بهتری است.

آیا یک OpenSIPS جلوی چند PBX یعنی High Availability کامل؟

خیر. یک OpenSIPS خودش Single Point of Failure خواهد بود. برای HA واقعی Edge Layer نیز باید Redundant باشد و Dialog/Cluster State مناسب طراحی شود.

جمع‌بندی

OpenSIPS زمانی بیشترین ارزش را دارد که بخواهید SIP Signaling را از خود PBX جدا کنید و چند Backend را پشت یک ورودی واحد قرار دهید.

اگر فقط پخش ساده تماس می‌خواهید، Dispatcher سبک و مناسب است. اما برای تماس‌هایی با Duration متفاوت، ظرفیت متفاوت Backendها یا Resourceهایی مثل Transcoding و Conference، Module اختصاصی Load Balancer انتخاب دقیق‌تری است.

Load Balancer با Dialog State تماس‌های فعال را دنبال می‌کند و بر اساس Capacity باقی‌مانده تصمیم می‌گیرد؛ بنابراین فقط تعداد INVITEها را بین سرورها تقسیم نمی‌کند.

Health Check با SIP OPTIONS، `lb_next()` و `lb_disable_dst()` امکان Failover و خارج‌کردن Backend خراب از Pool را فراهم می‌کنند. با این حال 5xx را نباید همیشه معادل Crash دانست و Health Policy باید با رفتار واقعی PBX تنظیم شود.

در لایه Media نیز OpenSIPS را با RTP Proxy اشتباه نگیرید. RTP به‌صورت پیش‌فرض از OpenSIPS عبور نمی‌کند؛ اگر NAT، WebRTC، Media Hiding یا SRTP Interworking دارید، RTPEngine می‌تواند Media Layer را تکمیل کند.

در مقیاس Production بهتر است معماری به این شکل باشد:

OpenSIPS Cluster → PBX Pool → RTPEngine Pool اختیاری

و هر لایه جداگانه Health Check، Monitoring و Failover داشته باشد.

منابع و مستندات
نسخه روز OpenSIPS، تفاوت Dispatcher و Load Balancer، Health Check، Dialog Tracking، Failover، Cluster و RTPEngine با مستندات رسمی پروژه تا ۱۷ اکتبر ۲۰۲۶ بررسی شده‌اند.
نسخه روز
مرجع رسمی وضعیت OpenSIPS 4.0 به‌عنوان Stable، شاخه 3.6 به‌عنوان LTS و نسخه Development فعلی
Load Balancer
مرجع lb_start، lb_next، lb_disable_dst، Resource Capacity، Probing، Health Check و Runtime Management
Load Balancing Tutorial
مرجع تفاوت Dispatcher و Load Balancer، Resource-based Routing، Dialog Tracking و Probe Modeهای 0، 1 و 2
Dispatcher
مرجع Destination Set، Hash، Weight و Stateless Load Distribution در OpenSIPS
Dialog State
مرجع Dialog Tracking، Timeout، Profile، Dialog Replication و استفاده از Clusterer برای State Sharing
Media Relay
مرجع کنترل RTPEngine، Media Proxy، چند RTP Relay و Load Balancing Media
Asterisk Integration
مرجع نصب OpenSIPS 4.0 روی Debian و الگوی اتصال SIP بین OpenSIPS و Asterisk
Packages
مرجع Packageهای رسمی OpenSIPS 4.0 و 3.6 برای Debian Bookworm/Trixie و Ubuntuهای پشتیبانی‌شده
پیشنهاد ایرانیکاسرور برای OpenSIPS و چند PBX

چند PBX دارید؟ قبل از انتقال تماس‌های اصلی، Failover را روی زیرساخت جدا تست کنید

OpenSIPS زمانی ارزش واقعی دارد که Edge Server و PBXها روی شبکه پایدار با IP ثابت و دسترسی کامل Firewall اجرا شوند. بهتر است OpenSIPS Public Endpoint باشد و Asterisk یا FreeSWITCHهای Backend فقط روی Private Network قرار بگیرند.

می‌توانید روی سرورهای مجازی ایرانیکاسرور ابتدا یک OpenSIPS و دو PBX آزمایشی بسازید، ظرفیت هر Node را با SIPp اندازه بگیرید و Health Check، Failover، Dialog Tracking و در صورت نیاز RTPEngine را قبل از انتقال Trunk اصلی تست کنید.

مشاوره معماری OpenSIPS، Asterisk و RTPEngine: 021-91302467

اشتراک‌گذاری مقاله
گفت‌وگو درباره آموزش

دیدگاه‌ها (۰)

هنوز دیدگاهی ثبت نشده است.

دیدگاه یا سؤال خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *