Kamailio:如何基于IP来加载多个Asterisk服务器之间的平衡呼叫

时间:2018-02-05 16:38:33

标签: database load-balancing asterisk sip kamailio

我的情景是: SIP干线连接到Kamailio服务器,该服务器在本地连接到多个Asterisk服务器,并应在这些星号服务器之间进行负载均衡。怎么样? Kamailio服务器中有一个mysql数据库表,它将来电的sip标题的TO部分映射到星号的IP之一。

Kamailio应该读取sip标头并在数据库内搜索,并在获取IP后,将呼叫转发到正确的星号服务器。

例如,传入sip标头内的To值为123456,因此kamailio会查询数据库并查找123456内的数字192.168.1.10,因此应将调用转发给服务器192.168.1.10

我已经从它的网站上阅读了多篇文章和Kamailio的帮助,但找不到与此方案相关的任何内容。 有谁知道怎么写kamailio.cfg里面的路线?

2 个答案:

答案 0 :(得分:1)

有一些方法可以做到这一点。其中之一是使用调度程序模块。

此模块提供SIP负载均衡器功能,可用作SIP流量调度程序。您可以选择许多负载平衡和流量分配算法,例如:循环,基于权重的负载平衡,呼叫负载分配以及SIP消息属性上的散列。

该模块可用作无状态负载均衡器;它不依赖于任何呼叫状态跟踪模块。如果启用主动/非活动网关的自动发现,则需要TM模块。

它非常轻巧,因此适合处理繁重的SIP流量。由于该模块占用空间小,能够从纯文本文件加载平衡规则,因此适用于嵌入式系统。

使其有效:

您需要添加一个dispatcher.list文件,其中包含星号的IP列表,如下所示:

1 sip:192.168.0.10 #asterisk 01
1 sip:192.168.0.11 #asterisk 02

然后,在转发请求之前,您将执行ds_select_dst(1, 0);

确保为调度程序模块指定列表文件:

loadmodule "dispatcher.so"
modparam("dispatcher", "list_file", "/var/run/kamailio/dispatcher.list")

如果要使用数据库而不是文件,可以通过指定db:

来实现
modparam("dispatcher", "db_url", "mysql://user:passwb@localhost/database")

此外,还有其他参数用于指定数据库表等。

您可以在kamailio dispatcher documentation

中阅读更多内容

答案 1 :(得分:0)

随机或循环调用通常由调度员或负载均衡调用完成。

如果您需要查询数据库,您可以选择使用AVPOPS模块(允许对数据库进行自定义查询)和使用HTABLE进行缓存响应。

avp_db_query("select password, ha1 from subscriber where username='$tu'",
    "$avp(678);$avp(679)");

http://www.opensips.org/html/docs/modules/1.7.x/avpops.html#id293960

肯定你也有PIKE和DDoS保护,因为db可以做更少的sql查询然后kamailio和/或攻击工具,如SIPP / SIPSack。这会降低你的数据库并且难以恢复。