您的位置:首页 > 大数据 > 人工智能

Freeswitch 高级主题之用kamailio负载均衡

2016-08-09 14:46 176 查看
本文原创自 http://blog.csdn.net/voipmaker
kamailio的前身叫openser, 和opensips是兄弟,作为出色的sip proxy,在大并发量使用时经常用于负载均衡 媒体服务器 Asterisk、Freeswitch等实现集群。

1. 安装kamailio

参考上一篇文章安装:Centos 6.4 上源码安装 kamailio 4.1

2. 配置 kamailio

下面为配置好的主配置文件,dispacher模块有一些参数需要注意,默认下一跳地址的配置支持数据库和文本文件,本文测试默认使用文本文件方式,

不用mysql数据库存储,注释掉下面两行。

#modparam("dispatcher", "db_url", DBURL)

#modparam("dispatcher", "table_name", "dispatcher")

设置默认配置下一跳的文本文件位置:

modparam("dispatcher", "list_file", "/usr/local/etc/kamailio/dispatcher.list")

/usr/local/etc/kamailio/dispatcher.list

文件添加freeswitch地址

1 sip:192.168.5.4:5080

1 sip:192.168.5.5:5080

1 sip:192.168.5.6:5080

通过path 支持注册消息下一跳的记录。

定制化的kamailio配置文件如下:

[html]
view plain
copy
print?





#!KAMAILIO  
#  
# sample config file for dispatcher module  
# - load balancing of VoIP calls with round robin  
# - dispatch REGISTER and presence requests  
#  
#  
# Direct your questions about this file to: sr-users@lists.sip-router.org  
#  
# Refer to the Core CookBook at http://www.kamailio.org/dokuwiki/doku.php  
# for an explanation of possible statements, functions and parameters.  
#  
# Several features can be enabled using '#!define WITH_FEATURE' directives:  
#  
# *** To run in debug mode:   
#     - define WITH_DEBUG  
#  
  
#!ifndef DBURL  
#!define DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"  
#!endif  
  
####### Global Parameters #########  
  
#!ifdef WITH_DEBUG  
debug=4  
log_stderror=yes  
#!else  
debug=2  
log_stderror=no  
#!endif  
  
  
memdbg=5  
memlog=5  
  
log_facility=LOG_LOCAL0  
  
fork=yes  
children=4  
  
/* comment the next line to enable TCP */  
disable_tcp=no  
  
/* uncomment the next line to disable the auto discovery of local aliases  
   based on revers DNS on IPs (default on) */  
auto_aliases=no  
  
/* add local domain aliases */  
# alias="mysipserver.com"  
  
port=60600  
  
/* uncomment and configure the following line if you want Kamailio to   
   bind on a specific interface/port/proto (default bind on all available) */  
# listen=udp:127.0.0.1:5060  
listen=udp:192.168.5.3:60600  
  
sip_warning=no  
  
####### Modules Section ########  
  
#set module path  
mpath="/usr/local/lib/kamailio/modules_k/:/usr/local/lib64/kamailio/modules/"  
  
loadmodule "db_mysql.so"  
loadmodule "mi_fifo.so"  
loadmodule "kex.so"  
loadmodule "tm.so"  
loadmodule "tmx.so"  
loadmodule "sl.so"  
loadmodule "rr.so"  
loadmodule "pv.so"  
loadmodule "maxfwd.so"  
loadmodule "textops.so"  
loadmodule "siputils.so"  
loadmodule "xlog.so"  
loadmodule "sanity.so"  
loadmodule "ctl.so"  
loadmodule "mi_rpc.so"  
loadmodule "acc.so"  
loadmodule "dispatcher.so"  
  
  
# ----------------- setting module-specific parameters ---------------  
  
  
# ----- mi_fifo params -----  
modparam("mi_fifo", "fifo_name", "/tmp/kamailio_fifo")  
  
  
# ----- rr params -----  
# add value to ;lr param to cope with most of the UAs  
modparam("rr", "enable_full_lr", 1)  
# do not append from tag to the RR (no need for this script)  
modparam("rr", "append_fromtag", 0)  
  
  
# ----- acc params -----  
modparam("acc", "log_flag", 1)  
modparam("acc", "failed_transaction_flag", 3)  
modparam("acc", "log_extra",  
    "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd;src_ip=$si")  
  
# ----- tm params -----  
modparam("tm", "fr_timer", 2000)  
modparam("tm", "fr_inv_timer", 40000)  
  
# ----- dispatcher params -----  
#modparam("dispatcher", "db_url", DBURL)  
#modparam("dispatcher", "table_name", "dispatcher")  
modparam("dispatcher", "list_file", "/usr/local/etc/kamailio/dispatcher.list")  
modparam("dispatcher", "flags", 2)  
modparam("dispatcher", "dst_avp", "$avp(AVP_DST)")  
modparam("dispatcher", "grp_avp", "$avp(AVP_GRP)")  
modparam("dispatcher", "cnt_avp", "$avp(AVP_CNT)")  
modparam("dispatcher", "sock_avp", "$avp(AVP_SOCK)")  
modparam("path", "use_received", 1)  
####### Routing Logic ########  
  
  
# main request routing logic  
  
route {  
  
    # per request initial checks  
    route(REQINIT);  
  
    # handle requests within SIP dialogs  
    route(WITHINDLG);  
  
    ### only initial requests (no To tag)  
  
    # CANCEL processing  
    if (is_method("CANCEL"))  
    {  
        if (t_check_trans())  
            t_relay();  
        exit;  
    }  
  
    t_check_trans();  
  
    # record routing for dialog forming requests (in case they are routed)  
    # - remove preloaded route headers  
    remove_hf("Route");  
    if (is_method("INVITE|SUBSCRIBE"))  
        record_route();  
  
    # account only INVITEs  
    if (is_method("INVITE"))  
    {  
        setflag(1); # do accounting  
    }  
  
    # handle presence related requests  
    route(PRESENCE);  
  
    # handle registrations  
    route(REGISTRAR);  
  
    if ($rU==$null)  
    {  
        # request with no Username in RURI  
        sl_send_reply("484","Address Incomplete");  
        exit;  
    }  
  
    # dispatch destinations  
    route(DISPATCH);  
}  
  
  
route[RELAY] {  
    if (!t_relay()) {  
        sl_reply_error();  
    }  
    exit;  
}  
  
# Per SIP request initial checks  
route[REQINIT] {  
    if (!mf_process_maxfwd_header("10")) {  
        sl_send_reply("483","Too Many Hops");  
        exit;  
    }  
  
    if(!sanity_check("1511", "7"))  
    {  
        xlog("Malformed SIP message from $si:$sp\n");  
        exit;  
    }  
}  
  
# Handle requests within SIP dialogs  
route[WITHINDLG] {  
    if (has_totag()) {  
        # sequential request withing a dialog should  
        # take the path determined by record-routing  
        if (loose_route()) {  
            if (is_method("BYE")) {  
                setflag(1); # do accounting ...  
                setflag(3); # ... even if the transaction fails  
            }  
            route(RELAY);  
        } else {  
            if (is_method("SUBSCRIBE") && uri == myself) {  
                # in-dialog subscribe requests  
                route(PRESENCE);  
                exit;  
            }  
            if ( is_method("ACK") ) {  
                if ( t_check_trans() ) {  
                    # non loose-route, but stateful ACK;  
                    # must be ACK after a 487 or e.g. 404 from upstream server  
                    t_relay();  
                    exit;  
                } else {  
                    # ACK without matching transaction ... ignore and discard.  
                    exit;  
                }  
            }  
            sl_send_reply("404","Not here");  
        }  
        exit;  
    }  
}  
  
# Handle SIP registrations  
route[REGISTRAR] {  
    if(!is_method("REGISTER"))  
        return;  
    add_path_received();  
    route(DISPATCH);  
    exit;  
}  
  
# Presence server route  
route[PRESENCE] {  
    if(!is_method("PUBLISH|SUBSCRIBE"))  
        return;  
  
    sl_send_reply("404", "Not here");  
    exit;  
}  
  
# Dispatch requests  
route[DISPATCH] {  
    # round robin dispatching on gateways group '1'  
    if(!ds_select_dst("1", "4"))  
    {  
        send_reply("404", "No destination");  
        exit;  
    }  
    xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");  
    t_on_failure("RTF_DISPATCH");  
    route(RELAY);  
    exit;  
}  
  
# Sample failure route  
failure_route[RTF_DISPATCH] {  
    if (t_is_canceled()) {  
        exit;  
    }  
    # next DST - only for 500 or local timeout  
    if (t_check_status("500")  
            or (t_branch_timeout() and !t_branch_replied()))  
    {  
        if(ds_next_dst())  
        {  
            t_on_failure("RTF_DISPATCH");  
            route(RELAY);  
            exit;  
        }  
    }  
}  



测试:呼叫和注册送到kamailio 60600端口,默认是round robin分配算法

本文原创自 http://blog.csdn.net/voipmaker  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: