Hello,
what version of kamailio are you using?
Cheers,
Daniel
On 09/06/15 20:51, Ding Ma wrote:
I'm trying to set up kamailio dispatcher to distribute calls to 2 asterisk servers. So far, the failover case seems ok, but I cannot get the dispatcher to distribute load. All calls are going to the last destination entry in the dispatcher table even if I have set the maxload attributes. I'm using algorithm 10 for load distribution. The number of calls sent to one asterisk is well above the maxload. Hope someone more experienced in dispatcher can review my config and give me some recommendations. Thanks in advance.
Here is the content of dispatcher table in postgresql db.
select * from dispatcher;id | setid | destination | flags | priority | attrs | description----+-------+--------------------+-------+----------+---------------------------+-------------1 | 1 | sip:10.0.1.31:5061 | 0 | 0 | duid=asterisk1;maxload=25 | Asterisk12 | 1 | sip:10.0.1.33:5061 | 0 | 0 | duid=asterisk2;maxload=25 | Asterisk2(2 rows)
Here are the dispatcher sections in kamailio.cfg.# ----- dispatcher params -----#!ifdef WITH_DISPATCHERmodparam("dispatcher", "db_url", DBASTURL)modparam("dispatcher", "table_name", "dispatcher")modparam("dispatcher", "force_dst", 1).# If flag 2 is set, then failover support is enabled.
modparam("dispatcher", "flags", 3)# the last address in destination set is used as a final option to send the request tomodparam("dispatcher", "use_default", 1)# load balancing fail overmodparam("dispatcher", "dst_avp", "$avp(dsdst)")modparam("dispatcher", "grp_avp", "$avp(dsgrp)")modparam("dispatcher", "cnt_avp", "$avp(dscnt)")modparam("dispatcher", "dstid_avp", "$avp(dsdstid)")modparam("dispatcher", "attrs_avp", "$avp(dsattrs)")# PVs for hashingmodparam("dispatcher", "hash_pvar", "$fU@$ci")# PVs to store results when calling ds_is_from_listmodparam("dispatcher", "setid_pvname", "$var(setid)")modparam("dispatcher", "attrs_pvname", "$var(attrs)")# method to probe the gatewaysmodparam("dispatcher", "ds_ping_method", "OPTIONS")modparam("dispatcher", "ds_ping_from", "sip:dispatcher@localhost")modparam("dispatcher", "ds_ping_interval", 30)modparam("dispatcher", "ds_probing_threshhold", 10)modparam("dispatcher", "ds_ping_reply_codes", "class=2;code=403;code=404;code=484;code=488;class=3")modparam("dispatcher", "ds_probing_mode", 1)# size of hash table storing data for call load dispatching, power of twomodparam("dispatcher", "ds_hash_size", 10)# expiration time in seconds to remove the load on a destination if no BYE was receivedmodparam("dispatcher", "ds_hash_expire", 3600)# expiration time in seconds to remove the load on a destination if no 200 OK for INVITE was received# and state updated with ds_load_updatemodparam("dispatcher", "ds_hash_initexpire", 60)modparam("dispatcher", "ds_hash_check_interval", 30)#!endif
route[WITHINDLG] {if (has_totag()) {# sequential request withing a dialog should# take the path determined by record-routing
#!ifdef WITH_DISPATCHERif(is_method("BYE|CANCEL") && ds_is_from_list("1", "3"))ds_load_update();#!endif......}}
route[FROMASTERISK] {#!ifdef WITH_DISPATCHER
if(ds_is_from_list("1", "3")) {xlog("L_DBG","$rm from $fU@$si:$sp: Call from Asterisk cluster\n");return 1;}return -1;#!elseif ($si==$sel(cfg_get.asterisk.bindip)) {return 1;}return -1;#!endif}
onreply_route[MANAGE_REPLY] {xdbg("incoming reply\n");#!ifdef WITH_DISPATCHERif(is_method("INVITE") && ds_is_from_list("1", "3")) {if(status=~"2[0-9][0-9]") {ds_load_update();}else if(status=~"[3-7][0-9][0-9]") {ds_load_unset();}}#!endifif(status=~"[12][0-9][0-9]")route(NATMANAGE);}
#!ifdef WITH_DISPATCHERfailure_route[RTF_DISPATCH] {if (t_is_canceled()) {exit;}# next DST - only for 500 or local timeoutif (t_check_status("500") or (t_branch_timeout() and !t_branch_replied())) {# mark the destination Inactive and Probingds_mark_dst("IP");# select the new destinationif(ds_next_dst()) {t_on_failure("RTF_DISPATCH");route(RELAY);exit;}else {# last available node failed to reply, no other destinations availablesend_reply("404", "No destination");exit;}}}#!endif
route[TOASTERISK] {#!ifdef WITH_DISPATCHER# ds_mark_dst("IP");# Call load distributionif(!ds_select_dst("1", "10")) {sl_send_reply("500", "Service Unavailable");xlog("L_INFO","$rm from $fU@$si:$sp: No destinations available for $rd\n");exit;}xlog("L_DBG", "--- SCRIPT: going to <$ru> via <$du>\n");t_on_failure("RTF_DISPATCH");#!else
$du = "sip:" + $sel(cfg_get.asterisk.bindip) + ":"+ $sel(cfg_get.asterisk.bindport);#!endifroute(RELAY);exit;}
# Dispatcher detects a destination goes downevent_route[dispatcher:dst-down] {xlog("L_ERR", "Destination down: $rm $ru ($du)\n");}
# Dispatcher detects a destination comes upevent_route[dispatcher:dst-up] {xlog("L_ERR", "Destination up: $rm $ru\n");}
_______________________________________________ SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
-- Daniel-Constantin Mierla http://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda Book: SIP Routing With Kamailio - http://www.asipto.com
_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users@lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users