
1、在本次分享中,测试环境包括:opensips支持dispatch 和 balancer 模块,两台完全一样的IPPBX和相同的用户账号和密码。注册用户可以同时注册到两台IPPBX(Asterisk,FreePBX或者FreeSWITCH都可以实现),另外,如果对PSTN进行呼叫的话(必须支持PSTN的接入设备),呼叫则会根据均衡负载规则调度到不同的IPPBX。
2、在测试呼叫之前,我们首先配置脚本文件和界面配置。首先,需要在cfg文件中,加载dispatcher和均衡负载模块:
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") # 修改到相应的用户密码modparam("load_balancer", "probing_method", "OPTIONS")modparam("load_balancer", "probing_interval", 30)
添加调度注册机制:
添加调度注册机制:
使用调度注册请求检测if(is_method("REGISTER")) {if (!ds_select_dst("1", "2","f")) { # 强制使用了 To-URIsl_send_reply("500","No route to PBX");exit;}
xlog("--- destination selected $du \n");t_on_failure("REGISTER_FAILOVER");route(RELAY);}
# 调度注册请求结束if ($rU==NULL) {# request with no Username in RURIsl_send_reply("484","Address Incomplete");exit;}
# 添加对其他请求的均衡负载处理if ( !load_balance("1","channel")) {send_reply("500","No Destination available");exit;}
t_on_failure("GW_FAILOVER");
# 请求路由失败的管理failure_route[GW_FAILOVER] {if (t_was_cancelled()) {exit;}
# 请求路由失败的管理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");}
}
然后,通过界面添加均衡负载设置:

最后,通过界面添加dispatch的模块设置:

3、如果以上配置环境配置成功的话,用户可以分别进行以下测试:
- 使用软电话呼叫任意一个号码,例如186XXXX。此时,第一个呼叫会路由到第一个IPPBX出局。因为我们是测试环境,IPPBX可以设置一个语音提示,对呼入的呼叫播放语音,提示用户已经呼入到第一个IPPBX。
- 置于此呼叫为等待状态,使用另外的软电话呼叫同样的号码,如果配置成功的话,呼叫会进入到第二台IPPBX,第二台IPPBX播放另外不同的语音提示。
- 用户也可以使用不同的软电话分别进行注册和重新注册测试,用户通过sngrep来检测注册的IP地址。如果配置成功的话,用户可能会发现,重新注册流程总是注册到被同一个软电话终端注册过的服务器。
这里的测试环境相对比较简单,我们仅通过此示例提供了均衡负载的思路和一个简单的配置环境。当然,如果用户需要做运营级的产品,可能还要考虑很多非常有挑战性的因素,这些因素包括:
- 如何使用虚拟IP地址做路由处理。
- 如何设置心跳来判断IPPBX是否正常工作。
- 如何设置号码路由呼叫不同的落地资源。
- 如何保证呼叫接通状态?因为这里的loadbanlance是无状态设置模式(stateless),必须保证用户可以路由到可工作的IPPBX。
- 如何实现注册数据库和用户的数据同步设置。
- 是否考虑使用最新的OpenSIPS cluster 模块来进行设置。
- PSTN 接入设备的逃生处理。
4、在以上的分享中,我们首先介绍了实现此测试需要的环境,然后介绍了cfg文件配置和相应的界面配置(添加loadbalance和dispatch模块)。最后,根据配置环境,用户分别使用软电话实现对其两台IPPBX的呼叫测试。两台IPPBX通过软交换的均衡负载设置对呼叫进行了不同的路由管理设置,然后进入到IPPBX,对终端播放一个语音提示。最后,如果用户需要部署真正的生产环境时需要考虑的几个因素。
参考资料:
http://www.kamailio.org.cn/doku.php?id=dispatcher_dispatcher_load-balancer_module_released
http://wiki.kolmisoft.com/index.php/Implementations



关注微信公众号:asterisk-cn,获得有价值的行业分享
freepbx 技术论坛:www.ippbx.org.cn
Asterisk, freepbx技术文档: www.freepbx.org.cn
欧米(Omni)智能客服解决方案
融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com