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

چطور یک معماری VoIP مقیاس‌پذیر با Kamailio، Asterisk و RTPengine بسازیم؟

اگر یک Asterisk دیگر جواب‌گوی رشد سامانه نیست، راه درست معمولاً خرید یک سرور خیلی بزرگ‌تر نیست؛ باید Signaling، Media و Application را از هم جدا کنید. در یک معماری VoIP مقیاس‌پذیر، Kamailio ورودی…

چطور یک معماری VoIP مقیاس‌پذیر با Kamailio، Asterisk و RTPengine بسازیم؟
خلاصه سریع این آموزش

اگر یک Asterisk دیگر جواب‌گوی رشد سامانه نیست، راه درست معمولاً خرید یک سرور خیلی بزرگ‌تر نیست؛ باید Signaling، Media و Application را از هم جدا کنید. در یک معماری…

۲۰ دقیقه مطالعه ۰ دیدگاه ۲۷ مهر ۱۴۰۵ آخرین به‌روزرسانی

اگر یک Asterisk دیگر جواب‌گوی رشد سامانه نیست، راه درست معمولاً خرید یک سرور خیلی بزرگ‌تر نیست؛ باید Signaling، Media و Application را از هم جدا کنید. در یک معماری VoIP مقیاس‌پذیر، Kamailio ورودی SIP و مسیریابی را مدیریت می‌کند، Asterisk منطق تماس و سرویس‌هایی مثل IVR و Queue را اجرا می‌کند و RTPengine مسیر RTP/SRTP، NAT و WebRTC را در لایه‌ای مستقل می‌گیرد.

مزیت این طراحی فقط افزایش ظرفیت نیست. وقتی هر لایه چند Node داشته باشد، می‌توانید یک سرور را برای Maintenance از مدار خارج کنید، تماس‌های جدید را به Node سالم هدایت کنید و Signaling و Media را مستقل از یکدیگر Scale کنید. در عین حال باید بدانید Failover تماس جدید با حفظ تماس در حال اجرا یک چیز نیست؛ اگر Asterisk یا RTPengine میزبان یک Session فعال ناگهان از دسترس خارج شود، آن تماس لزوماً بدون وقفه به Node دیگری منتقل نمی‌شود.

در ۱۹ اکتبر ۲۰۲۶، نسخه پایدار Kamailio شاخه 6.1 برابر 6.1.5 است. آخرین نسخه LTS عمومی Asterisk برای Production برابر 22.11.0 است و شاخه Asterisk 22 تا اکتبر ۲۰۲۸ Full Support دارد. RTPengine نیز چند Release Train موازی دارد؛ بنابراین برای Production بهتر است شاخه LTS یا Release Train سازگار با ماژول Kamailio و Distribution خودتان انتخاب شود.

هدف این مقاله: یک معماری مرجع می‌سازیم که دو Kamailio، چند Asterisk و چند RTPengine داشته باشد؛ سپس DNS/VIP، Registrar، Load Balancing، Database، Health Check، Failure Scenario و روش تست آن را مرحله‌به‌مرحله بررسی می‌کنیم.

فهرست مطالب

معماری VoIP مقیاس‌پذیر یعنی چه؟

در یک نصب کوچک، یک PBX ممکن است همه‌چیز را انجام دهد: REGISTER، SIP Routing، IVR، Queue، RTP، Recording و CDR. این مدل ساده است، اما با رشد تعداد Endpoint، تماس هم‌زمان و سرویس‌های WebRTC یا AI، همان سرور به نقطه تجمع همه بارها تبدیل می‌شود.

در معماری چندسروره، مسئولیت‌ها جدا می‌شوند:

🔹 Kamailio: SIP Edge، Registrar، Routing، ACL، Load Balancing و Health Check.

🔹 Asterisk: Dialplan، IVR، Queue، Conference، Application Logic و Integration.

🔹 RTPengine: Media Proxy، NAT، WebRTC، ICE، SRTP و Media Scaling.

🔹 Database: Configuration، Subscriber Data، Dispatcher List، CDR و در صورت نیاز Realtime Config.

🔹 DNS/VIP: ورود Redundant کاربران و Carrierها به Edge.

                    SIP Clients / Carriers
                              |
                       DNS SRV / VIP
                          /       \
                         v         v
                +-----------+ +-----------+
                | Kamailio A| | Kamailio B|
                +-----+-----+ +-----+-----+
                      \             /
                       \           /
                  Registrar / Routing
                         |
            +------------+------------+
            |            |            |
            v            v            v
       +---------+  +---------+  +---------+
       |Asterisk1|  |Asterisk2|  |Asterisk3|
       +---------+  +---------+  +---------+

        Signaling Control             Media
                \                       /
                 \                     /
                  +------ RTPengine ---+
                     /             \
                    v               v
              RTPengine-1      RTPengine-2

               DB / CDR / Config Cluster

نسخه‌های مناسب مبنا در اکتبر ۲۰۲۶

جزء نسخه یا شاخه مبنا نکته
Kamailio 6.1.5 آخرین نسخه پایدار شاخه 6.1 در زمان نگارش
Asterisk 22.11.0 LTS آخرین نسخه LTS عمومی Production در زمان نگارش
RTPengine Release Train سازگار / LTS چند شاخه موازی دارد؛ با ماژول Kamailio و OS تطبیق داده شود
Linux Debian 12/13 یا توزیع پشتیبانی‌شده پروژه نسخه دقیق با Repository و Packageهای موردنیاز تطبیق داده شود

Kamailio 6.1.5 در ۱۵ اکتبر ۲۰۲۶ منتشر شده و طبق اعلام رسمی، Compatibility فایل پیکربندی و Database Schema شاخه 6.1 حفظ شده است. Asterisk 22 نیز شاخه LTS است و نسخه 22.11.0 در ۲۷ اوت ۲۰۲۶ منتشر شده است.

مرحله ۱: Signaling و Media را واقعاً از هم جدا کنید

یکی از مهم‌ترین اشتباه‌ها این است که Kamailio جلوی Asterisk قرار داده شود، اما RTP همچنان بدون طراحی مشخص از هر سمت به هر Node برود. این فقط Signaling را Scale می‌کند، نه Media را.

در معماری پیشنهادی:

🔹 تمام SIP Endpointها و Carrierها فقط Kamailio را می‌بینند.

🔹 Backendهای Asterisk از اینترنت عمومی SIP قبول نمی‌کنند.

🔹 SDP توسط Kamailio به RTPengine داده می‌شود.

🔹 RTP/SRTP روی Pool جداگانه RTPengine Anchor می‌شود.

🔹 Asterisk فقط به شبکه داخلی Signaling/Media موردنیاز دسترسی دارد.

این جداسازی باعث می‌شود ظرفیت Kamailio بر اساس SIP Message Rate و CPS سنجیده شود، ولی ظرفیت RTPengine بر اساس Packet Rate، Bandwidth، SRTP، Transcoding و تعداد Media Session.

مرحله ۲: نقطه ورود را با DNS SRV یا VIP افزونه‌پذیر کنید

اگر دو Kamailio دارید ولی همه Phoneها فقط IP سرور اول را می‌شناسند، هنوز HA واقعی ندارید.

برای SIP Clientهایی که RFC 3263 و SRV را درست پشتیبانی می‌کنند می‌توانید DNS SRV داشته باشید:

_sip._udp.voip.example.com. 60 IN SRV 10 50 5060 sip-a.example.com.
_sip._udp.voip.example.com. 60 IN SRV 10 50 5060 sip-b.example.com.

sip-a.example.com. 60 IN A 203.0.113.10
sip-b.example.com. 60 IN A 203.0.113.11

اما همه IP Phoneها و بعضی Carrierها SRV Failover را یکسان پیاده‌سازی نمی‌کنند. برای محیط‌های کنترل‌شده می‌توانید به‌جای آن VIP، Anycast یا Load Balancer شبکه‌ای استفاده کنید.

قاعده عملی: قبل از انتخاب DNS SRV، رفتار واقعی Phone و SIP Provider خودتان را تست کنید. DNS رکورد Redundant می‌سازد، اما کیفیت Failover به Client هم بستگی دارد.

مرحله ۳: Kamailio را Active-Active طراحی کنید

Kamailio برای این معماری بهتر است Stateless نباشد. Transactionهای INVITE، Failure Route، Dispatcher و Registrar هرکدام مقداری State لازم دارند.

برای Load Balancing Backendها از Dispatcher استفاده می‌کنیم. نمونه مقصدها:

1 sip:10.10.10.11:5060
1 sip:10.10.10.12:5060
1 sip:10.10.10.13:5060

Health Check:

loadmodule "dispatcher.so"

modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.list")
modparam("dispatcher", "ds_ping_interval", 10)
modparam("dispatcher", "ds_probing_method", "OPTIONS")
modparam("dispatcher", "ds_probing_mode", 1)

Round Robin ساده برای بعضی Call Flowها کافی است:

if (!ds_select_dst("1", "4")) {
    send_reply("503", "No PBX available");
    exit;
}

t_on_failure("PBX_FAILOVER");
t_relay();

در Dispatcher، مقصدهای بعدی می‌توانند برای Serial Failover نگه‌داری شوند و با ds_next_dst() امتحان شوند.

مرحله ۴: REGISTER را مثل INVITE Round Robin نکنید

اگر Phoneها مستقیماً روی Backendهای Asterisk Register شوند، Registration State بین Nodeها تقسیم می‌شود. در این حالت تماس ورودی به User باید دقیقاً بداند Contact روی کدام Asterisk قرار دارد.

برای معماری بزرگ‌تر، مدل تمیزتر این است که Kamailio خودش Registrar باشد:

loadmodule "usrloc.so"
loadmodule "registrar.so"

if (is_method("REGISTER")) {
    if (!save("location")) {
        sl_reply_error();
    }
    exit;
}

وقتی تماس برای User وارد می‌شود:

if (lookup("location")) {
    route(RELAY);
    exit;
}

برای Active-Active Kamailio، Contact State نیز باید بین Nodeها Sync شود. Kamailio ماژول dmq_usrloc برای Replication رکوردهای usrloc بین چند Server دارد. در شاخه 6.1 نیز قابلیت‌های جدید Replication برای این ماژول اضافه شده‌اند.

مرحله ۵: Pool چند Asterisk را Stateless تصور نکنید

Asterisk Application Server است، اما هر Call فعال State محلی دارد: Channel، Bridge، Queue State، Recording و Resourceهای مربوط به همان Node. بنابراین Load Balancing تماس جدید ممکن است، ولی انتقال یک Call فعال از Asterisk-1 به Asterisk-2 بعد از Crash معمولاً اتفاق نمی‌افتد.

برای Pool چند Asterisk بهتر است:

🔹 Dialplan و PJSIP Configuration در همه Nodeها یکسان و Version-controlled باشد.

🔹 فایل‌های محلی غیرضروری بین Nodeها متفاوت نباشند.

🔹 Recording روی Storage مستقل یا Replicated قرار گیرد.

🔹 CDR/CEL به Backend مرکزی ارسال شود.

🔹 Nodeهای تحت Maintenance از Dispatcher خارج شوند.

🔹 ظرفیت هر Node با Benchmark واقعی مشخص شود.

اگر می‌خواهید Configuration PJSIP از Database خوانده شود، Asterisk از Sorcery/Realtime برای Objectهایی مثل endpoint، auth، aor و identify پشتیبانی می‌کند. این برای یکسان نگه‌داشتن Configuration چند Node مفید است، اما Realtime Database تماس فعال را بین Asteriskها منتقل نمی‌کند.

مرحله ۶: RTPengine را به‌صورت Pool مستقل بسازید

در Kamailio می‌توانید چند RTPengine را داخل یک Set تعریف کنید و بین آن‌ها Weight بدهید. ماژول رسمی Kamailio Load Balancing خودکار داخل Set را بر اساس Weight انجام می‌دهد.

نمونه دو Node:

loadmodule "rtpengine.so"

modparam("rtpengine", "rtpengine_sock",
    "udp:10.20.0.11:2223=1 udp:10.20.0.12:2223=1")

در Offer/Answer:

if (has_body("application/sdp")) {
    if (!rtpengine_manage()) {
        send_reply("500", "Media proxy error");
        exit;
    }
}

برای WebRTC می‌توانید Flagهای ICE، DTLS-SRTP و RTCP-MUX را متناسب با Direction تماس اعمال کنید. برای SIP Phone سنتی نیز RTPengine می‌تواند سمت دیگر را RTP/AVP نگه دارد.

مرحله ۷: Database را نقطه شکست جدید نکنید

بعد از Redundant کردن Kamailio و Asterisk، یکی از رایج‌ترین اشتباه‌ها این است که همه Nodeها به یک Database منفرد وصل شوند و همان DB به Single Point of Failure تبدیل شود.

Database را بر اساس نوع داده تفکیک کنید:

داده نیاز به DB مشترک پیشنهاد
Kamailio Dispatcher/Subscriber بسته به طراحی DB Replicated یا Managed HA
Kamailio Registration الزاماً نه usrloc + DMQ Replication می‌تواند Hot Path را از DB جدا کند
Asterisk PJSIP Config در Realtime بله DB HA با Read/Write Strategy مشخص
CDR/CEL بهتر است مرکزی باشد Queue/Buffer و Storage جدا
Recording DB مناسب فایل نیست Object/NAS/Storage مستقل

Kamailio برای MySQL/MariaDB Driver رسمی دارد و Auto-Reconnect و Timeout قابل‌تنظیم ارائه می‌کند. اما High Availability واقعی DB باید در لایه Database طراحی شود؛ خود db_mysql جای Cluster Database را نمی‌گیرد.

اگر DB برای Routing تماس در Hot Path لازم است، Timeout طولانی می‌تواند Worker را معطل کند. بنابراین وابستگی مستقیم هر SIP Request به Query سنگین Database را تا جای ممکن کم کنید.

مرحله ۸: DNS داخلی و DNS خارجی را جدا طراحی کنید

DNS در VoIP فقط برای Domain Name نیست. SIP SRV، Failover Carrier، Service Discovery و Backend Nameها به DNS وابسته می‌شوند.

Kamailio Resolver داخلی با Cache از NAPTR/SRV و DNS Failover پشتیبانی می‌کند. مستند Core تصریح می‌کند DNS-based Failover در TM به DNS Cache داخلی وابسته است.

برای Production:

🔹 حداقل دو DNS Resolver مستقل داشته باشید.

🔹 TTL را خیلی کوتاه یا خیلی بلند انتخاب نکنید.

🔹 Failover واقعی Clientها را با SRV تست کنید.

🔹 نام Backend داخلی را از DNS عمومی جدا نگه دارید.

🔹 تغییر DNS را جای Health Check لحظه‌ای تصور نکنید.

مسیر یک تماس ورودی در این معماری

برای اینکه اجزا روشن‌تر شوند، یک تماس از SIP Carrier به داخلی 1001 را دنبال کنیم:

1. Carrier -> Kamailio A
2. ACL / Sanity / Routing
3. Kamailio -> RTPengine offer
4. Kamailio -> Asterisk 2
5. Asterisk executes IVR / Dialplan
6. Asterisk -> Kamailio for user 1001
7. Kamailio lookup(location)
8. Kamailio -> registered phone
9. RTPengine anchors RTP/SRTP
10. BYE -> Kamailio -> RTPengine delete

در این مدل، Carrier لازم نیست IP هیچ Asterisk را بداند و Phone نیز مستقیماً Backend را نمی‌بیند.

مسیر REGISTER در معماری Active-Active

Phone
  |
  v
Kamailio A
  |
  +--> authenticate
  +--> save("location")
  |
  +--> DMQ usrloc replication
              |
              v
         Kamailio B

Result:
Both edge nodes know the contact

این الگو باعث می‌شود اگر Kamailio A از دسترس خارج شود، Kamailio B Contactهای Replicate‌شده را داشته باشد. با این حال NAT Binding، Transport Connection و TCP/TLS/WebSocket Sessionهای متصل به Node اول موضوع جدا هستند و Client ممکن است نیاز به Reconnect داشته باشد.

Failure Scenario ۱: Kamailio A Down می‌شود

تماس جدید: DNS SRV/VIP/Load Balancer باید Client را به Kamailio B هدایت کند.

Registration: اگر usrloc Replication فعال است، Contact State در Node دوم موجود است؛ اما Connectionهای TCP/TLS/WSS روی Node A از بین می‌روند و Client باید Reconnect کند.

تماس فعال: اگر SIP Dialog برای Mid-dialog Requestها Route Record مناسب دارد و Node از بین رفته است، رفتار به Topology و Failover طراحی‌شده بستگی دارد. HA Signaling برای Dialog فعال نیازمند طراحی دقیق‌تر از یک DNS Switch ساده است.

Failure Scenario ۲: Asterisk 2 Down می‌شود

قبل از Answer: Dispatcher و Failure Route می‌توانند INVITE را به Asterisk بعدی بفرستند.

بعد از Answer: اگر Call State روی Asterisk 2 بوده و Process/Host Crash کند، تماس معمولاً قطع می‌شود. داشتن Realtime DB این Session را روی Asterisk 3 ادامه نمی‌دهد.

راه کاهش اثر: چند Node، Maintenance Drain، Monitoring و Capacity Headroom داشته باشید تا Failure روی تماس‌های جدید اثر نگذارد و Crash Active Session کمترین دامنه را داشته باشد.

Failure Scenario ۳: RTPengine 1 Down می‌شود

تماس جدید: ماژول Kamailio می‌تواند Node خراب را Disable کند و RTPengine دیگر را انتخاب کند.

تماس فعال: Media Session موجود روی Node خراب‌شده معمولاً قطع می‌شود، مگر معماری Active/Standby و State Recovery مخصوص طراحی شده باشد. صرف داشتن دو RTPengine به معنی Session Migration آنی نیست.

برای Maintenance بهتر است Node را از پذیرش Session جدید خارج کنید و صبر کنید تماس‌های Active آن تخلیه شوند.

Failure Scenario ۴: Database از دسترس خارج می‌شود

اثر آن به این بستگی دارد که DB در Hot Path کجاست.

نوع وابستگی اثر احتمالی
Kamailio Registrar فقط Memory + DMQ Registrationهای موجود ممکن است ادامه پیدا کنند
Subscriber Auth در DB REGISTER جدید یا Authentication می‌تواند Fail شود
Asterisk Realtime PJSIP Load Config/Object جدید ممکن است Fail شود
CDR DB تماس ممکن است برقرار شود ولی Accounting آسیب ببیند

به همین دلیل بهتر است سرویس را طوری طراحی کنید که Down شدن CDR Database الزاماً SIP Call را متوقف نکند، مگر سیاست کسب‌وکار خلاف آن را ایجاب کند.

Failure Scenario ۵: یک Data Center کامل قطع می‌شود

Multi-node داخل یک Rack، شما را در برابر قطع برق، Router، Upstream یا Data Center محافظت نمی‌کند.

برای Multi-DC باید درباره این موارد تصمیم بگیرید:

🔹 DNS/VIP بین Siteها چگونه Failover می‌کند؟

🔹 Registrar State بین Siteها Replicate می‌شود یا User دوباره REGISTER می‌کند؟

🔹 Database Replication Sync است یا Async؟

🔹 Recording و CDR در کدام Site ذخیره می‌شوند؟

🔹 RTPengine به نزدیک‌ترین Site انتخاب می‌شود یا Central است؟

🔹 Split-brain چطور جلوگیری می‌شود؟

اگر Latency بین دو Site زیاد باشد، قرار دادن هر SIP Request یا Database Transaction روی لینک بین‌شهری می‌تواند Performance را خراب کند. تا جای ممکن Hot Path را محلی نگه دارید و State لازم را با روش مناسب Replicate کنید.

HA واقعی را لایه‌به‌لایه تعریف کنید

لایه روش HA چه چیزی را نجات می‌دهد؟
DNS / Entry SRV، VIP، Anycast ورود تماس جدید
Kamailio Active-Active + DMQ Routing و Registration جدید
Asterisk Pool + Dispatcher تماس جدید و Capacity
RTPengine Pool + Weight/Health Media Session جدید
Database Replication/Cluster Config و داده مشترک
Storage Replicated/Object Storage Recording و Artifactها

هیچ ردیفی از این جدول به‌تنهایی تضمین نمی‌کند تماس Active بدون وقفه باقی بماند. Session Continuity باید جداگانه برای هر Failure Scenario بررسی شود.

Load Balancing را با چه الگوریتمی انجام دهیم؟

برای Backendهای Asterisk چند انتخاب دارید:

روش مناسب برای محدودیت
Round Robin Nodeهای تقریباً هم‌ظرفیت Load واقعی را نمی‌بیند
Weighted Nodeهای با قدرت متفاوت Weight ثابت است
Hash User Sticky Routing ممکن است Load نامتوازن شود
Call Load / Capacity-aware ترافیک ناهمگون State و Monitoring بیشتری لازم دارد

اگر Asterisk-1 چهار برابر Asterisk-2 CPU دارد، Round Robin برابر انتخاب خوبی نیست. Weight باید بر اساس Benchmark واقعی باشد، نه تعداد vCPU روی کاغذ.

Capacity Planning؛ هر لایه Bottleneck خودش را دارد

لایه شاخص اصلی
Kamailio SIP messages/sec، CPS، transactions، TLS connections
Asterisk Concurrent calls، CPS، Queue، IVR، Transcoding، Recording
RTPengine Media sessions، packets/sec، bandwidth، SRTP، transcoding
Database QPS، write latency، connection count، replication lag
Storage IOPS، throughput، retention
Network PPS، jitter، packet loss، bandwidth

به همین دلیل جمله «این VPS چند تماس می‌گیرد؟» بدون Call Flow پاسخ دقیق ندارد. یک تماس G.711 بدون Recording با WebRTC Opus + SRTP + Recording + Queue بار یکسانی ندارد.

Monitoring؛ قبل از HA باید بدانید چه چیزی خراب شده است

حداقل این شاخص‌ها را جمع‌آوری کنید:

🔹 Kamailio: SIP 2xx/4xx/5xx، Dispatcher State، REGISTER Rate و CPS.

🔹 Asterisk: Active Channels، Calls، Taskprocessors، Queue Depth و CPU.

🔹 RTPengine: Active Sessions، PPS، Byte Rate، Packet Error و One-way Stream.

🔹 DB: Query Latency، Connection Errors، Replication Lag.

🔹 Linux: CPU Steal، SoftIRQ، Memory، Network Drop و Disk Latency.

برای Asterisk:

asterisk -rx "core show channels count"
asterisk -rx "core show taskprocessors"

برای Kamailio Dispatcher:

kamcmd dispatcher.list

برای RTPengine نیز RPC/Control Statistics را وارد Monitoring کنید و فقط به CPU نگاه نکنید.

امنیت این معماری را از Edge شروع کنید

وقتی Kamailio Edge رسمی شماست، Backendها نباید دوباره Public Surface جدا داشته باشند.

🔹 Asterisk SIP فقط از Kamailio و Management Network پذیرفته شود.

🔹 RTPengine Control Socket فقط برای Kamailio/OpenSIPS قابل‌دسترسی باشد.

🔹 Media Port Range با Firewall محدود و مانیتور شود.

🔹 Carrierها با IP ACL یا Authentication مناسب محدود شوند.

🔹 TLS برای Signaling و SRTP برای Media در Endpointهای سازگار استفاده شود.

🔹 SSH فقط از IP یا VPN مدیریتی باز باشد.

🔹 Database Port روی Public Internet باز نباشد.

مطلب مرتبط: قبل از Production، خود Linux Nodeها را هم سخت‌سازی کنید.

چگونه SSH را امن کنیم؟ از حذف Root Login تا SSH Key و Fail2Ban

ترتیب پیاده‌سازی پیشنهادی

معماری را یک‌باره روی Production نبرید. این ترتیب ریسک کمتری دارد:

🔹 مرحله ۱: دو Kamailio + یک Asterisk + یک RTPengine در Lab.

🔹 مرحله ۲: Registrar و REGISTER Replication بین Kamailioها.

🔹 مرحله ۳: Asterisk دوم و Dispatcher Failover.

🔹 مرحله ۴: RTPengine دوم و Media Pool.

🔹 مرحله ۵: Database HA و Storage مستقل.

🔹 مرحله ۶: DNS/VIP Failover.

🔹 مرحله ۷: Load Test و Failure Injection.

🔹 مرحله ۸: انتقال درصد کمی از ترافیک واقعی.

Failure Injection؛ HA را با خاموش‌کردن واقعی Node تست کنید

صرف دیدن دو Node سبز در Monitoring کافی نیست. قبل از Production این تست‌ها را اجرا کنید:

تست انتظار
خاموش‌کردن Kamailio A REGISTER/INVITE جدید از Kamailio B ادامه یابد
خاموش‌کردن Asterisk 1 قبل از Answer INVITE به Node بعدی Failover شود
خاموش‌کردن Asterisk 1 وسط تماس ثبت شود که تماس Active قطع می‌شود؛ دامنه اثر اندازه‌گیری شود
خاموش‌کردن RTPengine 1 قبل از Call Media Node دوم انتخاب شود
خاموش‌کردن RTPengine 1 وسط تماس رفتار Session Active مستند شود
قطع DB Primary Failover DB و اثر روی Auth/Config اندازه‌گیری شود
قطع DNS Resolver Resolver دوم پاسخ دهد
قطع Link بین Siteها Split-brain یا State Conflict ایجاد نشود

Load Test را با Production Features انجام دهید

اگر در Production WebRTC، TLS، SRTP، Recording و Queue دارید، Benchmark خام SIP بدون این قابلیت‌ها Capacity واقعی شما را نشان نمی‌دهد.

حداقل این Metrics را ثبت کنید:

🔹 Concurrent Calls.

🔹 CPS.

🔹 P50/P95/P99 Call Setup Time.

🔹 SIP 503/408/Timeout Rate.

🔹 RTP Packet Loss و Jitter.

🔹 CPU User/System/Steal.

🔹 RTPengine PPS و Bandwidth.

🔹 DB Query Latency.

Load Generator را روی همان VPS هدف اجرا نکنید. Generator باید روی Host جدا باشد تا CPU و Network آن با PBX رقابت نکند.

برای WebRTC و AI Voice این معماری چه مزیتی دارد؟

وقتی Media Plane جداست، اضافه‌کردن Browser یا سرویس AI ساده‌تر می‌شود. RTPengine می‌تواند WebRTC، ICE و SRTP را در Edge مدیریت کند و Asterisk تمرکز خود را روی Call Logic نگه دارد.

برای Voice AI نیز می‌توانید Media Processing یا Forking را روی لایه‌ای مستقل قرار دهید تا STT/TTS/AI Workerها مستقیماً به Edge یا Application Layer متصل شوند و مجبور نباشید هر قابلیت جدید را داخل Core PBX پیاده‌سازی کنید.

مطلب مرتبط: اگر معماری شما قرار است Voice AI هم داشته باشد، راهنمای اجرای Voice AI و Whisper روی VPS را ببینید.

راه‌اندازی Voice AI و Whisper روی VPS

چه زمانی این معماری بیش از حد پیچیده است؟

اگر فقط ۲۰ داخلی و چند تماس هم‌زمان دارید، ساخت دو Kamailio، سه Asterisk، دو RTPengine و Cluster Database احتمالاً هزینه عملیاتی بیشتری از فایده آن دارد.

این معماری زمانی توجیه دارد که حداقل یکی از این شرایط وجود داشته باشد:

🔹 Downtime یک PBX برای کسب‌وکار قابل‌قبول نیست.

🔹 چندصد یا چند هزار Endpoint دارید.

🔹 تماس هم‌زمان و CPS بالا دارید.

🔹 چند Carrier و چند Site دارید.

🔹 WebRTC/NAT/SRTP پیچیده دارید.

🔹 Maintenance بدون قطع سرویس لازم است.

🔹 Media و Application باید مستقل Scale شوند.

اشتباه‌های رایج در VoIP چندسروره

🔹 Redundant کردن PBX ولی فراموش‌کردن Single Point of Failure در Kamailio.

🔹 دو Kamailio ولی فقط یک Database.

🔹 Round Robin کردن REGISTER بدون طراحی Registrar State.

🔹 تصور اینکه Realtime Database تماس Active را بین Asteriskها منتقل می‌کند.

🔹 دو RTPengine بدون Plan برای Media Session Active.

🔹 DNS SRV بدون تست رفتار واقعی Phone.

🔹 Public کردن Portهای Asterisk Backend.

🔹 تعیین Weightها بر اساس حدس به‌جای Benchmark.

🔹 یکی دانستن HA تماس جدید و Session Continuity.

برای VoIP پرترافیک، معماری را قبل از خرید نهایی منابع مشخص کنید

می‌خواهید Kamailio + Asterisk + RTPengine را چندسروره راه‌اندازی کنید؟

قبل از انتخاب VPS باید تعداد Endpoint، تماس هم‌زمان، CPS، Codecها، WebRTC، Recording، تعداد Siteها و RTO/RPO مشخص شود. بعد می‌توان تعداد Kamailio، Asterisk و RTPengine را بر اساس Benchmark واقعی تعیین کرد.

ایرانیکاسرور می‌تواند برای تهیه VPS، طراحی شبکه، نصب Kamailio/Asterisk/RTPengine، Firewall، Load Balancing و تست Failure سناریو کمک کند.

تماس با پشتیبانی ایرانیکاسرور: 021-91302467

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

چرا Kamailio را جلوی Asterisk قرار دهیم؟

Kamailio Signaling، Registrar، Routing، Load Balancing و Security Edge را از Asterisk جدا می‌کند. در نتیجه Backendهای PBX مستقیماً در معرض اینترنت نیستند و تماس‌های جدید می‌توانند بین چند Node توزیع شوند.

RTPengine چرا جدا از Asterisk لازم می‌شود؟

RTPengine Media Plane را مستقل می‌کند و برای NAT، WebRTC، ICE، SRTP و Scaling Media کاربرد دارد. این کار اجازه می‌دهد ظرفیت Media جدا از Signaling و PBX افزایش یابد.

اگر یک Asterisk خراب شود تماس فعال به Node دیگر منتقل می‌شود؟

معمولاً خیر. Load Balancer می‌تواند تماس جدید را به Node سالم ببرد، اما Call State فعال روی Asterisk خراب‌شده به‌صورت خودکار روی Node دیگر ادامه پیدا نمی‌کند.

چطور Registration را بین دو Kamailio هماهنگ کنیم؟

Kamailio می‌تواند Registrar باشد و با usrloc Contactها را ذخیره کند. ماژول dmq_usrloc برای Replication رکوردهای usrloc بین چند Kamailio طراحی شده است.

DNS SRV بهتر است یا VIP؟

به Client و شبکه بستگی دارد. SRV استاندارد SIP است اما رفتار همه Phoneها و Carrierها یکسان نیست. VIP یا Load Balancer شبکه‌ای در بعضی محیط‌ها Failover قابل‌کنترل‌تری می‌دهد.

آیا یک Database مشترک برای همه Nodeها کافی است؟

برای اشتراک Configuration ممکن است مفید باشد، اما اگر فقط یک DB دارید همان DB به Single Point of Failure تبدیل می‌شود. Database نیز باید Replication و Failover مناسب داشته باشد.

چند RTPengine لازم است؟

تعداد Nodeها به Media Session، Packet Rate، Bandwidth، WebRTC، SRTP و Transcoding بستگی دارد. برای HA حداقل دو Node منطقی است، اما ظرفیت باید با Benchmark واقعی تعیین شود.

برای شروع چند سرور لازم است؟

برای Lab می‌توانید دو Kamailio، دو Asterisk و دو RTPengine را حتی با منابع کوچک‌تر تست کنید. در Production تعداد و منابع Nodeها باید بر اساس Peak Concurrent Call، CPS، Codec و Failure Domain تعیین شود.

جمع‌بندی

معماری VoIP مقیاس‌پذیر از اضافه‌کردن سرور بیشتر شروع نمی‌شود؛ از جداکردن مسئولیت‌ها شروع می‌شود. Kamailio باید Signaling و Registrar را مدیریت کند، Asterisk Application و Call Logic را اجرا کند و RTPengine Media را جداگانه Anchor و Scale کند.

دو Kamailio بدون Registration Replication، چند Asterisk بدون Failure Route یا چند RTPengine بدون Health Check هنوز HA کامل نیستند. DNS، Database و Storage نیز باید به‌اندازه خود SIP Layer Redundant طراحی شوند.

مهم‌تر از همه، Failover تماس جدید را با Session Continuity اشتباه نگیرید. خرابی یک Asterisk یا RTPengine وسط تماس می‌تواند همان Session را قطع کند، حتی اگر تماس بعدی بلافاصله روی Node سالم برقرار شود.

اگر قبل از Production Failure Injection، Load Test و Capacity Benchmark اجرا کنید، این معماری می‌تواند بدون تبدیل‌شدن به یک سیستم پیچیده و شکننده، ظرفیت و دسترس‌پذیری VoIP را مرحله‌به‌مرحله افزایش دهد.

منابع و مستندات
نسخه‌های فعلی، Dispatcher، DNS، Registrar Replication، Realtime Asterisk، RTPengine Pool و Failure Scenarioهای این مقاله با مستندات رسمی پروژه‌ها تا ۱۹ اکتبر ۲۰۲۶ بررسی شده‌اند.
Kamailio Release
مرجع نسخه پایدار 6.1.5 و سازگاری Configuration/Database Schema در شاخه 6.1.
Kamailio Dispatcher
مرجع Destination Selection، Hash، Failover، Probing و DNS/SRV مقصدها.
Kamailio Registrar
مرجع save() و lookup() برای ذخیره و بازیابی Contactهای SIP.
Kamailio DNS
مرجع DNS Cache داخلی، NAPTR/SRV Weighting و DNS-based Failover.
Asterisk
مرجع Asterisk 22.11.0 به‌عنوان آخرین نسخه LTS عمومی فعلی.
Asterisk Realtime
مرجع ذخیره endpoint، auth، aor، domain و identify در Realtime Backend.
RTPengine
مرجع Release Trainهای موازی RTPengine در سال ۲۰۲۶.
Kamailio + RTPengine
مرجع چند RTPengine، Setها، Weight، Node State و Media Proxy Functions.
از یک Lab کوچک شروع کنید و Failure را عمداً ایجاد کنید

برای طراحی VoIP چندسروره کمک می‌خواهید؟

اگر Peak Call، تعداد Endpoint، SIP Provider، WebRTC و سطح دسترس‌پذیری موردنیاز مشخص باشند، می‌توان Topology مناسب را قبل از خرید نهایی منابع روی VPS آزمایشی اعتبارسنجی کرد.

تماس با پشتیبانی ایرانیکاسرور: 021-91302467

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

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

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

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

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