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 查询数据库并发现数字 123456192.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等

您可以在 kamailio dispatcher documentation

中阅读更多内容

通常由调度程序或负载平衡调用完成的随机或循环调用。

如果您需要查询数据库,您的选择是使用 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 少得多。这会降低您的数据库并且难以恢复。