1、在本次分享中,測(cè)試環(huán)境包括:opensips支持dispatch 和 balancer 模塊,兩臺(tái)完全一樣的IPPBX和相同的用戶賬號(hào)和密碼。注冊(cè)用戶可以同時(shí)注冊(cè)到兩臺(tái)IPPBX(Asterisk,FreePBX或者FreeSWITCH都可以實(shí)現(xiàn)),另外,如果對(duì)PSTN進(jìn)行呼叫的話(必須支持PSTN的接入設(shè)備),呼叫則會(huì)根據(jù)均衡負(fù)載規(guī)則調(diào)度到不同的IPPBX。
2、在測(cè)試呼叫之前,我們首先配置腳本文件和界面配置。首先,需要在cfg文件中,加載dispatcher和均衡負(fù)載模塊:
loadmodule "dispatcher.so"modparam("dispatcher","db_url","mysql://opensips:opensipsrw@localhost/opensips")modparam("dispatcher","dst_avp","$avp(1)")modparam("dispatcher","grp_avp","$avp(2)")modparam("dispatcher","cnt_avp","$avp(3)")加載loadbalance 模塊:
loadmodule "load_balancer.so"modparam("load_balancer", "db_url","mysql://opensips:opensipsrw@localhost/opensips") # 修改到相應(yīng)的用戶密碼modparam("load_balancer", "probing_method", "OPTIONS")modparam("load_balancer", "probing_interval", 30)
添加調(diào)度注冊(cè)機(jī)制:
添加調(diào)度注冊(cè)機(jī)制:
使用調(diào)度注冊(cè)請(qǐng)求檢測(cè)if(is_method("REGISTER")) {if (!ds_select_dst("1", "2","f")) { # 強(qiáng)制使用了 To-URIsl_send_reply("500","No route to PBX");exit;}
xlog("--- destination selected $du \n");t_on_failure("REGISTER_FAILOVER");route(RELAY);}
# 調(diào)度注冊(cè)請(qǐng)求結(jié)束if ($rU==NULL) {# request with no Username in RURIsl_send_reply("484","Address Incomplete");exit;}
# 添加對(duì)其他請(qǐng)求的均衡負(fù)載處理if ( !load_balance("1","channel")) {send_reply("500","No Destination available");exit;}
t_on_failure("GW_FAILOVER");
# 請(qǐng)求路由失敗的管理failure_route[GW_FAILOVER] {if (t_was_cancelled()) {exit;}
# 請(qǐng)求路由失敗的管理failure_route[GW_FAILOVER] {if (t_was_cancelled()) {exit;}
# failure detection with redirect to next available trunkif (t_check_status("(408)|([56][0-9][0-9])")) {xlog("Failed trunk $rd/$du detected \n");if ( load_balance("1","channel") ) {t_on_failure("GW_FAILOVER");t_relay();exit;}
send_reply("500","All GW are down");}
}
然后,通過界面添加均衡負(fù)載設(shè)置:
最后,通過界面添加dispatch的模塊設(shè)置:
3、如果以上配置環(huán)境配置成功的話,用戶可以分別進(jìn)行以下測(cè)試:
- 使用軟電話呼叫任意一個(gè)號(hào)碼,例如186XXXX。此時(shí),第一個(gè)呼叫會(huì)路由到第一個(gè)IPPBX出局。因?yàn)槲覀兪菧y(cè)試環(huán)境,IPPBX可以設(shè)置一個(gè)語音提示,對(duì)呼入的呼叫播放語音,提示用戶已經(jīng)呼入到第一個(gè)IPPBX。
- 置于此呼叫為等待狀態(tài),使用另外的軟電話呼叫同樣的號(hào)碼,如果配置成功的話,呼叫會(huì)進(jìn)入到第二臺(tái)IPPBX,第二臺(tái)IPPBX播放另外不同的語音提示。
- 用戶也可以使用不同的軟電話分別進(jìn)行注冊(cè)和重新注冊(cè)測(cè)試,用戶通過sngrep來檢測(cè)注冊(cè)的IP地址。如果配置成功的話,用戶可能會(huì)發(fā)現(xiàn),重新注冊(cè)流程總是注冊(cè)到被同一個(gè)軟電話終端注冊(cè)過的服務(wù)器。
這里的測(cè)試環(huán)境相對(duì)比較簡單,我們僅通過此示例提供了均衡負(fù)載的思路和一個(gè)簡單的配置環(huán)境。當(dāng)然,如果用戶需要做運(yùn)營級(jí)的產(chǎn)品,可能還要考慮很多非常有挑戰(zhàn)性的因素,這些因素包括:
- 如何使用虛擬IP地址做路由處理。
- 如何設(shè)置心跳來判斷IPPBX是否正常工作。
- 如何設(shè)置號(hào)碼路由呼叫不同的落地資源。
- 如何保證呼叫接通狀態(tài)?因?yàn)檫@里的loadbanlance是無狀態(tài)設(shè)置模式(stateless),必須保證用戶可以路由到可工作的IPPBX。
- 如何實(shí)現(xiàn)注冊(cè)數(shù)據(jù)庫和用戶的數(shù)據(jù)同步設(shè)置。
- 是否考慮使用最新的OpenSIPS cluster 模塊來進(jìn)行設(shè)置。
- PSTN 接入設(shè)備的逃生處理。
4、在以上的分享中,我們首先介紹了實(shí)現(xiàn)此測(cè)試需要的環(huán)境,然后介紹了cfg文件配置和相應(yīng)的界面配置(添加loadbalance和dispatch模塊)。最后,根據(jù)配置環(huán)境,用戶分別使用軟電話實(shí)現(xiàn)對(duì)其兩臺(tái)IPPBX的呼叫測(cè)試。兩臺(tái)IPPBX通過軟交換的均衡負(fù)載設(shè)置對(duì)呼叫進(jìn)行了不同的路由管理設(shè)置,然后進(jìn)入到IPPBX,對(duì)終端播放一個(gè)語音提示。最后,如果用戶需要部署真正的生產(chǎn)環(huán)境時(shí)需要考慮的幾個(gè)因素。
參考資料:
http://www.kamailio.org.cn/doku.php?id=dispatcher_dispatcher_load-balancer_module_released
http://wiki.kolmisoft.com/index.php/Implementations
關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的行業(yè)分享
freepbx 技術(shù)論壇:www.ippbx.org.cn
Asterisk, freepbx技術(shù)文檔: www.freepbx.org.cn
歐米(Omni)智能客服解決方案
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com