[SR-Users] problem with dispatcher load balancing

Ding Ma mading087 at gmail.com
Mon Sep 14 21:52:13 CEST 2015


Hi,

Figured this out. Seems I had made a mistake in the names of AVPs. Changed
the AVP names as the exact names used in the example contained in
dispatcher doc. Dispatcher started to work, I can see even distribution of
loads to 2 Asterisk servers. Will verify if maxload is being enforced or
not, not really an issue even if it is not enforced.

Thanks,

On Thu, Aug 27, 2015 at 9:07 AM, Ding Ma <mading087 at gmail.com> wrote:

> Hi, Daniel
>
> I just tested the dispatcher in 4.3.1. It showed the same behavior as
> 4.2.3. All the calls are sent to one Asterisk (the last one in the
> dispatcher list), the maxload setting in dispatcher table is ignored.
>
> We use db dispatcher table instead of dispatcher list file, and the
> kamailio.cfg is the same as included in the previous email in this thread.
>
> Hope I didn't make any mistake in kamailio.cfg.
>
> Thanks
>
> On Fri, Jun 12, 2015 at 12:34 AM, Daniel-Constantin Mierla <
> miconda at gmail.com> wrote:
>
>> Yes, 4.3 should have all fixes in 4.2.
>>
>> Cheers,
>> Daniel
>>
>>
>> On 12/06/15 06:06, Ding Ma wrote:
>>
>> OK, we’ll try to update and report back. Wonder if the latest 4.3 has all
>> the fixes went into the latest 4.2.x. We already have plan to upgrade to
>> 4.3.
>> Thanks.
>>
>> On Jun 10, 2015, at 10:01 AM, Daniel-Constantin Mierla <miconda at gmail.com>
>> wrote:
>>
>> It was a fix for maxload during 4.2.x, but don't recall exactly when was
>> backported. Can you upgrade to latest 4.2.x and see the results? Your
>> config file and database don't require any change, only deploy the binaries
>> for latest 4.2.x and restart.
>>
>> If the issue is still there with latest 4.2.x, report here and I will
>> look at it with the first chance.
>>
>> Cheers,
>> Daniel
>>
>> On 10/06/15 16:50, Ding Ma wrote:
>>
>> We're running kamailio 4.2.3. Are there any changes to dispatcher in
>> 4.2.x?
>> Thanks,
>>
>> # kamailio -V
>> version: kamailio 4.2.3 (x86_64/linux) 5596bd
>> flags: STATS: Off, USE_TCP, USE_TLS, TLS_HOOKS, USE_RAW_SOCKS,
>> DISABLE_NAGLE, USE_MCAST, DNS_IP_HACK, SHM_MEM, SHM_MMAP, PKG_MALLOC,
>> F_MALLOC, DBG_F_MALLOC, USE_FUTEX, FAST_LOCK-ADAPTIVE_WAIT, USE_DNS_CACHE,
>> USE_DNS_FAILOVER, USE_NAPTR, USE_DST_BLACKLIST, HAVE_RESOLV_RES
>> ADAPTIVE_WAIT_LOOPS=1024, MAX_RECV_BUFFER_SIZE 262144, MAX_LISTEN 16,
>> MAX_URI_SIZE 1024, BUF_SIZE 65535, DEFAULT PKG_SIZE 8MB
>> poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
>> id: 5596bd
>> compiled on 09:32:37 May  6 2015 with gcc 4.4.7
>>
>>
>> On Wed, Jun 10, 2015 at 7:01 AM, Daniel-Constantin Mierla <
>> miconda at gmail.com> wrote:
>>
>>> 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 | Asterisk1
>>>   2 |     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_DISPATCHER
>>> modparam("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 to
>>> modparam("dispatcher", "use_default", 1)
>>> # load balancing fail over
>>> modparam("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 hashing
>>> modparam("dispatcher", "hash_pvar", "$fU@$ci")
>>> # PVs to store results when calling ds_is_from_list
>>> modparam("dispatcher", "setid_pvname", "$var(setid)")
>>> modparam("dispatcher", "attrs_pvname", "$var(attrs)")
>>> # method to probe the gateways
>>> modparam("dispatcher", "ds_ping_method", "OPTIONS")
>>> modparam("dispatcher", "ds_ping_from", "sip:dispatcher at 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 two
>>> modparam("dispatcher", "ds_hash_size", 10)
>>> # expiration time in seconds to remove the load on a destination if no
>>> BYE was received
>>> modparam("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_update
>>> modparam("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_DISPATCHER
>>> if(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;
>>> #!else
>>> if ($si==$sel(cfg_get.asterisk.bindip)) {
>>> return 1;
>>> }
>>> return -1;
>>> #!endif
>>> }
>>>
>>> onreply_route[MANAGE_REPLY] {
>>> xdbg("incoming reply\n");
>>> #!ifdef WITH_DISPATCHER
>>> if(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();
>>> }
>>> }
>>> #!endif
>>> if(status=~"[12][0-9][0-9]")
>>> route(NATMANAGE);
>>> }
>>>
>>> #!ifdef WITH_DISPATCHER
>>> 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())) {
>>>                 # mark the destination Inactive and Probing
>>> ds_mark_dst("IP");
>>>                 # select the new destination
>>> if(ds_next_dst()) {
>>> t_on_failure("RTF_DISPATCH");
>>> route(RELAY);
>>> exit;
>>> }
>>>                 else {
>>>                         # last available node failed to reply, no other
>>> destinations available
>>>                         send_reply("404", "No destination");
>>>                         exit;
>>>                 }
>>> }
>>> }
>>> #!endif
>>>
>>> route[TOASTERISK] {
>>> #!ifdef WITH_DISPATCHER
>>> # ds_mark_dst("IP");
>>> # Call load distribution
>>> if(!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);
>>> #!endif
>>> route(RELAY);
>>> exit;
>>> }
>>>
>>>
>>> # Dispatcher detects a destination goes down
>>> event_route[dispatcher:dst-down] {
>>>     xlog("L_ERR", "Destination down: $rm $ru ($du)\n");
>>> }
>>>
>>> # Dispatcher detects a destination comes up
>>> event_route[dispatcher:dst-up] {
>>>     xlog("L_ERR", "Destination up: $rm $ru\n");
>>> }
>>>
>>>
>>> _______________________________________________
>>> SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing listsr-users at lists.sip-router.orghttp://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>
>>> --
>>> Daniel-Constantin Mierlahttp://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 at lists.sip-router.org
>>> http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
>>>
>>>
>>
>> --
>> Daniel-Constantin Mierlahttp://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
>> Book: SIP Routing With Kamailio - http://www.asipto.com
>>
>>
>>
>> --
>> Daniel-Constantin Mierlahttp://twitter.com/#!/miconda - http://www.linkedin.com/in/miconda
>> Book: SIP Routing With Kamailio - http://www.asipto.com
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20150914/3b3fab42/attachment.html>


More information about the sr-users mailing list