Kamailio:如何根据 IP 负载平衡多个 Asterisk 服务器之间的调用
Kamailio: How to load balance calls among multiple Asterisk servers based on their IPs
我的场景是:
SIP 中继连接到 Kamailio 服务器,该服务器在本地连接到多个 Asterisk 服务器,并且应该在这些 Asterisk 服务器之间负载平衡呼叫。如何? Kamailio 服务器中有一个 mysql 数据库 table,它将传入呼叫的 TO
部分 sip header 映射到星号的 IP 之一。
Kamailio 应该读取 sip header 并在数据库中搜索,在获得 IP 后,将调用转发到正确的 asterisk 服务器。
例如,传入 sip header 中 To
的值是 123456
所以 kamailio 查询数据库并发现数字 123456
在 192.168.1.10
中所以调用应转发到服务器 192.168.1.10
.
我已阅读多篇文章和 Kamailio 网站上的帮助,但找不到与此场景相关的任何内容。
有谁知道kamailio.cfg里面的route怎么写?
有一些方法可以做到这一点。其中之一是使用调度程序模块。
此模块提供 SIP 负载平衡器功能,可用作 SIP 流量调度器。有许多负载平衡和流量调度算法可供您选择,例如:循环法、基于权重的负载平衡、呼叫负载分配和基于 SIP 消息属性的散列。
该模块可作为无状态负载均衡器使用;它不依赖于任何调用状态跟踪模块。如果启用 active/inactive 网关的自动发现,它需要 TM 模块。
它非常轻量级,因此适合table处理繁重的 SIP 流量。由于该模块占用空间小,并且能够从纯文本文件加载平衡规则,因此适合嵌入式系统table。
让它发挥作用:
您需要添加一个 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")
此外,还有其他指定数据库的参数table等
中阅读更多内容
通常由调度程序或负载平衡调用完成的随机或循环调用。
如果您需要查询数据库,您的选择是使用 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 and/or 攻击工具SIPP/SIPSack 少得多。这会降低您的数据库并且难以恢复。
我的场景是:
SIP 中继连接到 Kamailio 服务器,该服务器在本地连接到多个 Asterisk 服务器,并且应该在这些 Asterisk 服务器之间负载平衡呼叫。如何? Kamailio 服务器中有一个 mysql 数据库 table,它将传入呼叫的 TO
部分 sip header 映射到星号的 IP 之一。
Kamailio 应该读取 sip header 并在数据库中搜索,在获得 IP 后,将调用转发到正确的 asterisk 服务器。
例如,传入 sip header 中 To
的值是 123456
所以 kamailio 查询数据库并发现数字 123456
在 192.168.1.10
中所以调用应转发到服务器 192.168.1.10
.
我已阅读多篇文章和 Kamailio 网站上的帮助,但找不到与此场景相关的任何内容。 有谁知道kamailio.cfg里面的route怎么写?
有一些方法可以做到这一点。其中之一是使用调度程序模块。
此模块提供 SIP 负载平衡器功能,可用作 SIP 流量调度器。有许多负载平衡和流量调度算法可供您选择,例如:循环法、基于权重的负载平衡、呼叫负载分配和基于 SIP 消息属性的散列。
该模块可作为无状态负载均衡器使用;它不依赖于任何调用状态跟踪模块。如果启用 active/inactive 网关的自动发现,它需要 TM 模块。
它非常轻量级,因此适合table处理繁重的 SIP 流量。由于该模块占用空间小,并且能够从纯文本文件加载平衡规则,因此适合嵌入式系统table。
让它发挥作用:
您需要添加一个 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")
此外,还有其他指定数据库的参数table等
中阅读更多内容通常由调度程序或负载平衡调用完成的随机或循环调用。
如果您需要查询数据库,您的选择是使用 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 and/or 攻击工具SIPP/SIPSack 少得多。这会降低您的数据库并且难以恢复。